跨类 c# 使用多个对象

本文关键字:对象 跨类 | 更新日期: 2023-09-27 18:35:09

我有三个类保存输入表单中的数据,然后每个类向数据库提交插入查询。

使用现有对象

和单个存储过程必须有更好的方法来执行此操作,但我无法让现有对象在另一个类中工作。对于问题的简单性,我深表歉意,因为我认为这是一个非常简单的修复程序,可以整理我的代码。

使用下面的代码,我试图实现的是重用 StoredProc 类中最终用户、银行和公司的现有实例,这样我就不必在每个类方法中使用 SQL 查询,而只需要使用 StoredProc 类中的一个保存方法。

编辑为了澄清数据库的东西,即SQL字符串不是问题,我想问的是我可以在storageproc类中使用现有对象的实例(其中三个),以便我可以使用一个(已经编写的)存储过程?

抱歉,代码有点长,但我已经尽可能精简了它,同时仍然有意义(以及运行):

表单后端

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        EndUser newUser = new EndUser(textBox1.Text, textBox2.Text);
        Company newcmpny = new Company(textBox4.Text, textBox3.Text);
        Bank newbank = new Bank(textBox6.Text, textBox5.Text);
        newUser.Save();
        newcmpny.Save();
        newbank.Save();
    }
}

数据保持类(全部在一个文件中)

    class EndUser
{
    public EndUser(string first, string last) {
        firstName = first;
        lastName = last;
    }
    public int iD { get; set; }
    public string firstName { get; set; }
    public string lastName { get; set; }
    public void Save()
    {
        using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString))
        {
            string sqlQuery = (@"INSERT INTO [EndUser] (FirstName, LastName)
                            VALUES (@FirstName, @LastName)");
            connection.Open();
            using (SqlCommand command = new SqlCommand(sqlQuery, connection))
            {
                command.Parameters.AddWithValue("FirstName", firstName).ToString();
                command.Parameters.AddWithValue("LastName", lastName).ToString();
                command.ExecuteNonQuery();
            }
        }
    }
}
class Company
{
    public Company(string cmpny, string tele)
    {
        company = cmpny;
        telephone = tele;
    }
    public string company { get; set; } // textbox4
    public string telephone { get; set; } // textbox3
    public void Save()
    {
        using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString))
        {
            string sqlQuery = (@"INSERT INTO [Company] (CName, Telephone)
                            VALUES (@CName, @Telephone)");
            connection.Open();
            using (SqlCommand command = new SqlCommand(sqlQuery, connection))
            {
                command.Parameters.AddWithValue("CName", company).ToString();
                command.Parameters.AddWithValue("Telephone", telephone).ToString();
                command.ExecuteNonQuery();
            }
        }
    }
}
class Bank
{
    public Bank(string bn, string scode)
    {
        name = bn;
        sortcode = scode;
    }
    public string name { get; set; } // textbox6
    public string sortcode { get; set; } // textbox5
    public void Save()
    {
        using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString))
        {
            string sqlQuery = (@"INSERT INTO [Bank] (BankName, SortCode)
                            VALUES (@BankName, @SortCode)");
            connection.Open();
            using (SqlCommand command = new SqlCommand(sqlQuery, connection))
            {
                command.Parameters.AddWithValue("BankName", name).ToString();
                command.Parameters.AddWithValue("SortCode", sortcode).ToString();
                command.ExecuteNonQuery();
            }
        }
    }
}
class StoredProc
{
    public void ToTheDB()
    {
        using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString))
        {
            con.Open();
            using(SqlCommand cmd = new SqlCommand("Procedure",con))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                // cmd.Parameters.AddWithValue("FirstName", newUser.firstName);
                cmd.ExecuteNonQuery();
            }
        }
    }
}

}

跨类 c# 使用多个对象

首先 - IMO 这是一个写得很糟糕的代码。

我的建议:

  • 不要混合使用模型和 SQL 查询或任何数据库逻辑。
  • 不要在 C# 代码中使用纯 SQL,而要使用实体框架或存储过程。
  • 不要保存共享相同业务逻辑的多个实体,而不将它们包装在单个事务中。

您问过:"我可以在 storageproc 类中使用现有对象的实例(其中三个)吗,以便我可以使用一个(已经编写的)存储过程"

答案是 - 您几乎不能以这种方式使用现有代码。据我所知,您没有存储过程。您只有带有 SQL 查询的字符串。

无论如何,您可以尝试将类用作 storageproc 类中的模型,并创建新的存储过程来使用它们。

它应该看起来像这样:

class StoredProc
{
    public void ToTheDB(EndUser endUser, Company company, Bank bank)
    {
        using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString))
        {
            con.Open();
            using(SqlCommand cmd = new SqlCommand("Procedure",con))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                //Here you can use data from your "model" classes and add them as parameters for your stored procedure.
                cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = endUser.firstName;
                //the rest of the parameters from EndUser, Company and Bank classes
                cmd.ExecuteNonQuery();
            }
        }
    }
}

再一次,你应该将你的逻辑和模型分开。

这是一个示例模型:

public class Bank
{
    public string name { get; set; }
    public string sortCode { get; set; }
}

这是数据访问层或存储库的方法:

void AddBank(Bank bank)
{
        using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString))
        {
            con.Open();
            //Procedure for inserting
            using(SqlCommand cmd = new SqlCommand("Procedure",con))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = bank.name;
                cmd.ExecuteNonQuery();
            }
        }
}

现在,许多设计原则实际上回避在对象中进行 CRUD 操作,而是更愿意接受对象作为数据服务层的参数。你的代码实际上应该更大,而不是更小。一个示例服务是:

public Bank(string bn, string scode)
    {
        name = bn;
        sortcode = scode;
    }
    public string name { get; set; } // textbox6
    public string sortcode { get; set; } // textbox5
}
class BankDataService
{
    public void SaveNewBankToDatabase(Bank bank) {
        using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString))
        {
            string sqlQuery = (@"INSERT INTO [Bank] (BankName, SortCode)
                            VALUES (@BankName, @SortCode)");
            connection.Open();
            using (SqlCommand command = new SqlCommand(sqlQuery, connection))
            {
                command.Parameters.AddWithValue("BankName", bank.name);
                command.Parameters.AddWithValue("SortCode", bank.sortcode);
                command.ExecuteNonQuery();
            }
        }
    }
    public void UpdateBankToDatabase(Bank bank) {
        using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString))
        {
            string sqlQuery = (@"UPDATE [Bank]
                               SET SortCode=@SortCode
                               WHERE @BankName=@BankName");
            connection.Open();
            using (SqlCommand command = new SqlCommand(sqlQuery, connection))
            {
                command.Parameters.AddWithValue("BankName", bank.name);
                command.Parameters.AddWithValue("SortCode", bank.sortcode);
                command.ExecuteNonQuery();
            }
        }
    }
    public void SelectBankFromDatabase(string bankName) {
        using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString))
        {
            string sqlQuery = (@"SELECT BankName, SortCode FROM [Bank] WHERE BankName=@BankName");
            connection.Open();
            using (SqlCommand command = new SqlCommand(sqlQuery, connection))
            {
                command.Parameters.AddWithValue("BankName", bank.name);
                using(var reader = command.ExecuteReader()) {
                     if(reader.Read()){
                          return new Bank { BankName=reader["BankName"].ToString(), SortCode=reader["SortCode"].ToString(); }
                     }
                }
            }
            return null;
        }
    }
}
相关文章: