我有这个代码将记录插入表产品。
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等)或者我必须为每个表单做同样的事情(这需要花费很多时间)。 还要告诉我是否有其他替代方法以最佳方式执行此操作。
答案 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
课程添加第二个静态方法以选择数据 - 在这种情况下,您可以返回DataTable
,DataSet
或SqlDataReader
,具体取决于您更喜欢使用什么 - 甚至每种方法都有一种方法。