0

我有这段代码可以将记录插入到表产品中。

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 个 wiform,每个表单都需要将不同表中的记录插入/更新到同一个数据库中。现在我想知道我是否可以以任何方式使用上面的代码从具有不同编号的各种表单中插入/更新记录。文本框(例如 - 我的 CustomerDetail 表单有 15 个文本框,经纪表单有 8 个文本框等),或者我必须对每个表单执行相同的操作(这需要很长时间)。还告诉我是否有任何其他选择可以最好的方式做到这一点。

4

1 回答 1

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 命令获取一个字符串值,以及一个以参数名称作为键和相应值的字典。

然后它创建一个 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字符串已经被填充(很可能在类级别)。

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

您还可以在类中添加第二个静态方法来SqlHelper选择数据 - 在这种情况下,您可以返回一个DataTable,DataSetSqlDataReader,这取决于您喜欢使用什么 - 甚至每个都有一个方法。

于 2013-08-16T05:13:24.713 回答