我正在尝试使用Asp.net事务在数据库中保存一个带有两个复选框的Gridview,当出现相同情况时我会收到错误
SqlCommand cmd = new SqlCommand("procedure", con);
SqlCommand cmd1 = new SqlCommand("procedure1", con);
foreach (GridViewRow row in gvrecept.Rows)
{
if (cash.Checked){
cmd.Parameters.AddWithValue("@parameter", "value");
cmd.Transaction = trns;
}
else if (cheque.Checked)
{
cmd1.Parameters.AddWithValue("@parameter1", "value1");
cmd1.Transaction = trns;
}
}
int i = cmd1.ExecuteNonQuery();
int j = cmd.ExecuteNonQuery();
if (i > 0 && j > 0 )
{
trns.Commit();
}
答案 0 :(得分:0)
正如我在上面的评论中所解释的,你需要改变一些东西: 应该在循环外添加trns一次,同时设置为CommandType = CommandType.StoredProcedure并创建两个命令。
在循环内部,您应该在每个循环中为您遍历的每一行执行命令。此外,还不清楚这两个命令是否相互排斥。我的意思是,如果您设置了两个复选框,那么您应该执行两个命令,但如果没有设置匹配的复选框则不能执行。如果是这种情况,你需要使用两个单独的ifs而不是其他if 请注意,在循环内部,您只需在执行命令之前更改参数的值。这将是一个较小的优化,但它比在每个循环中创建命令或清除参数集合更简单。
最后,在完成插入后,应在循环外完成事务的提交。如果您有错误,则会发生异常并跳过提交。
最后的说明。目前尚不清楚为什么你需要两个命令。在上面的代码中,您始终使用相同的StoredProcedure但传递不同的值。如果是这种情况,那么一个命令就可以了。
SqlCommand cmd = new SqlCommand("procedure1", con);
cmd.Transaction = trns;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@parameter", SqlDbType.NVarChar);
SqlCommand cmd1 = new SqlCommand("procedure1", con);
cmd1.Transaction = trns;
cmd1.CommandType = CommandType.StoredProcedure;
cmd1.Parameters.Add("@parameter1", SqlDbType.NVarChar);
foreach (GridViewRow row in gvrecept.Rows)
{
if (cash.Checked)
{
cmd.Parameters["@parameter"].Value = "value";
cmd.ExecuteNonQuery();
}
if (cheque.Checked)
{
cmd.Parameters["@parameter1"].Value = "value1";
cmd1.ExecuteNonQuery();
}
}
trns.Commit();