C# 跨类c使用多对象

C# 跨类c使用多对象,c#,C#,我有三个类,它们保存输入表单中的数据,然后每个类向数据库提交一个insert查询 使用现有对象和单个存储过程肯定有更好的方法,但我无法让现有对象在另一个类中工作。我为问题的简单性道歉,因为我认为这是整理代码的一个非常简单的方法 使用下面的代码,我试图实现的是重用StoredProc类中EndUser、Bank和Company的现有实例,这样我就不必在每个类方法中使用SQL查询,也不必在StoredProc类中只使用一个save方法 编辑 为了澄清数据库的问题,即SQL字符串不是问题所在,我想问的

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

使用现有对象和单个存储过程肯定有更好的方法,但我无法让现有对象在另一个类中工作。我为问题的简单性道歉,因为我认为这是整理代码的一个非常简单的方法

使用下面的代码,我试图实现的是重用StoredProc类中EndUser、Bank和Company的现有实例,这样我就不必在每个类方法中使用SQL查询,也不必在StoredProc类中只使用一个save方法

编辑 为了澄清数据库的问题,即SQL字符串不是问题所在,我想问的是,我是否可以使用现有对象的实例,其中三个对象在storedproc类中,这样我就可以使用一个已经编写好的存储过程

抱歉,代码有点长,但我已尽可能精简了代码,同时仍在运行:

表单后端

数据保持类都在一个文件中


}

如今,许多设计原则实际上都回避在对象中执行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;
        }
    }
}

如今,许多设计原则实际上都回避在对象中执行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;
        }
    }
}

首先,在我看来,这是一个糟糕的代码

我的建议是:

不要混合使用模型和SQL查询或任何数据库逻辑。 不要在C代码中使用普通SQL,而是使用实体框架或存储过程。 不要保存共享相同业务逻辑的多个实体,而不使用单个事务包装它们。 您已经问过:我可以使用现有对象的实例吗?storedproc类中有三个这样我就可以使用一个已经编写好的存储过程了

答案是——您很难以这种方式使用现有代码。据我所知,您没有存储过程。您只有SQL查询的字符串

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

它应该是这样的:

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; }
}
Ant这是数据访问层或存储库的方法:

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();
            }
        }
}

首先,在我看来,这是一个糟糕的代码

我的建议是:

不要混合使用模型和SQL查询或任何数据库逻辑。 不要在C代码中使用普通SQL,而是使用实体框架或存储过程。 不要保存共享相同业务逻辑的多个实体,而不使用单个事务包装它们。 您已经问过:我可以使用现有对象的实例吗?storedproc类中有三个这样我就可以使用一个已经编写好的存储过程了

答案是——您很难以这种方式使用现有代码。据我所知,您没有存储过程。您只有SQL查询的字符串

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

它应该是这样的:

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; }
}
Ant这是数据访问层或存储库的方法:

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();
            }
        }
}

为什么不在数据库程序中创建存储过程呢?如果我理解正确,并且希望能够使用其他类的现有实例中的变量数据,只使用storedproc类中的一个存储过程,那么我将有三个存储过程。除非这不可能/不值得?您可以使用实体框架。我认为您的大部分代码都会减少。正如Mahesh所说:如果您不想为数据库CRUD编写所有样板代码,请使用EntityFramework。@PurpleSmurph the command.Parameters.AddWithValueBankName,name.ToString;不执行任何操作,只执行命令.Parameters.AddWithValueBankName,name;实际上是需要的。为什么不在数据库程序中创建存储过程呢?如果我理解正确,并且希望能够使用其他类的现有实例中的变量数据,只使用storedproc类中的一个存储过程,那么我将有三个存储过程。除非这不可能/不值得?您可以使用实体框架。我认为您的大部分代码都会减少。正如Mahesh所说:如果您不想为数据库CRUD编写所有样板代码,请使用EntityFramework。@PurpleSmurph the command.Parameters.AddWithValueBankName,name.ToString;不执行任何操作,只执行命令.Parameters.AddWithValueBankName,name;实际上是需要的。对不起,完全误读了,问题仍然是p
尽管如此,我在所有类中都需要上述内容,而不是在一个storedproc类中使用类对象。很抱歉,我的命名不清楚。银行数据服务只是将您的银行详细信息保存到数据库中。您可以在数据服务层中创建更新和选择操作,以便与数据库交互并检索旧的银行和资料,但是如果你的程序没有更多的代码,我就无法编写太多的代码来给你一个具体的例子。抱歉,由于我误读了最初例子的名称,我完全重写了我的其他评论。我一直在对代码进行编辑。我还添加了一个select和update,这是我刚刚从bank模型中假设的。这只是数据服务层中CRU操作的一个示例集。除非使用实体框架(Entity Framework),它将数据库层的概念从用于写入数据库的代码中抽象出来。感谢您的帮助,我们认为它非常有用,它会将该数据层添加到我的代码中,但Landeyoo首先明白了我的意思,q的措辞很糟糕,但无法想出其他方法来理解我的意思。很抱歉,完全误读了,但问题仍然存在,我需要在所有类中使用上述内容,而不是在一个storedproc类中使用类对象。很抱歉,我的命名不清楚。银行数据服务只是将您的银行详细信息保存到数据库中。您可以在数据服务层中创建更新和选择操作,以便与数据库交互并检索旧的银行和资料,但是如果你的程序没有更多的代码,我就无法编写太多的代码来给你一个具体的例子。抱歉,由于我误读了最初例子的名称,我完全重写了我的其他评论。我一直在对代码进行编辑。我还添加了一个select和update,这是我刚刚从bank模型中假设的。这只是数据服务层中CRU操作的一个示例集。除非使用实体框架(Entity Framework),它将数据库层的概念从用于写入数据库的代码中抽象出来。感谢您的帮助,我们认为它非常有用,它会将该数据层添加到我的代码中,但Landeyoo首先明白了我的意思,q的措辞很糟糕,但想不出另一种方式来表达我的意思。啊哈!这就是我要说的,当我第一次尝试通过方法传递对象时,没有添加最终用户!呃,愚蠢的错误,是的,存储过程不在上面,因为我觉得它不相关,它已经编写好,可以使用了。再一次,谢谢你。啊哈!这就是我要说的,当我第一次尝试通过方法传递对象时,没有添加最终用户!呃,愚蠢的错误,是的,存储过程不在上面,因为我觉得它不相关,它已经编写好,可以使用了。再次感谢你。