是否可以重用代码来从多个WinForms更新/插入多个表中的记录

时间:2013-08-16 04:21:55

标签: c# winforms multiple-tables

我有这个代码将记录插入表产品。

int insertRecordIntoProduct()
{
   try
    {
        if (con.State == ConnectionState.Closed)
        {
            con.Open();
        }
       string insQuery = "insert into product_details (prod_name,prod_desc,prod_status,start_date,end_date,ref_num,ror) "+  
                         "values(@p_name,@p_desc,@status,@sdate,@edate,@filenum,@ror)";

    SqlCommand insertCmd = new SqlCommand(insQuery, con);

    insertCmd.Parameters.Clear();
    insertCmd.Parameters.AddWithValue("@p_name", txtProdName.Text);
    insertCmd.Parameters.AddWithValue("@p_desc", txtProdDesc.Text);

    insertCmd.Parameters.AddWithValue("@sdate", (StartDatePicker.Value.Date)); 
    insertCmd.Parameters.AddWithValue("@edate", (EndDatePicker.Value.Date)); 
    insertCmd.Parameters.AddWithValue("@filenum", txtBoxFileNum.Text);

   int r= insertCmd.ExecuteNonQuery();  
    return r;
   }
}

此代码工作正常。我的问题是我有10-12个wiforms,每个表单需要在不同的表中插入/更新记录到同一个数据库中。现在我想知道我可以以任何方式使用上面的代码来插入/更新具有不同编号的各种表单的记录。 TextBoxes(例如 - 我的CustomerDetail表单有15个TextBoxes,Brokerage表单有8个TexBoxes等)或者我必须为每个表单做同样的事情(这需要花费很多时间)。 还要告诉我是否有其他替代方法以最佳方式执行此操作。

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是创建一个由所有表单使用的类,并且在该类中有一个可用于更新/插入的方法,也可能是另一个用于选择的方法(因为您将返回数据) )。

例如:

public static class SqlHelper
{

    public static int InsertUpdate(string connectionString, string sql, Dictionary<string, object> parameters)
    {

        int rows = 0;

        using (SqlConnection con = new SqlConnection(connectionString))
        {
            con.Open();

            sqlCommand cmd = new SqlCommand(sql, con);
            cmd.CommandType = CommandType.Text;

            foreach (string key in parameters.Keys)
            {
                cmd.Parameters.AddWithValue(key, parameters[key]);
            }

            rows = cmd.ExecuteNonQuery();
        }

        return rows;
    }
}

此代码的作用是获取连接字符串的字符串值,SQL命令的字符串值以及将参数名称作为键和相应值的Dictionary。

然后创建一个SqlConnection,创建命令,并遍历参数字典,并为该字典中的每个参数添加一个新参数。

最后,它执行查询并返回受影响的行。

然后您可以按如下方式调用此方法(基于您的示例代码):

int rowsAffected = 0;

try
{
    Dictionary<string, object>() params = new Dictionary(string, object>();
    params.Add("@p_name", txtProdName.Text);
    params.Add("@p_desc", txtProdDesc.Text);
    params.Add("@sdate", StartDatePicker.Value.Date);
    params.Add("@edate", EndDatePicker.Value.Date);
    params.Add("@filenum", txtBoxFileNum.Text);

    string sql = "insert into product_details" +      
                 "(prod_name,prod_desc,prod_status,"+
                 "start_date,end_date,ref_num,ror) "+
                 "values(@p_name,@p_desc,@status,@sdate,@edate,@filenum,@ror)";

   rowsAffected = SqlHelper.InsertUpdate(connectionString, sql, params);
}
catch (Exception ex)
{
   // Do something with the error;
}

我将调用包装在try catch块中,这样你就可以处理底层方法调用中的任何错误。构建字典,构建sql字符串,然后为rowsAffected分配静态帮助器方法(SqlHelper.InsertUpdate)返回的值。

如果遇到错误,它会被捕获,你可以用它做一些事情(记录它,消息框等)

此示例期望已填充connectionString字符串(最有可能在类级别)。

由于使用Dictionary来传递参数,您只需要为每个调用创建一个新的字典,并在其中包含适当数量的参数以匹配SQL命令(请注意,在您发布的代码示例中,您不要t有@ror的任何内容,所以我没有包含它。)

您还可以向SqlHelper课程添加第二个静态方法以选择数据 - 在这种情况下,您可以返回DataTableDataSetSqlDataReader,具体取决于您更喜欢使用什么 - 甚至每种方法都有一种方法。