使用foreach循环的Asp.net事务

时间:2018-01-21 12:48:43

标签: asp.net-mvc

我正在尝试使用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();
}

1 个答案:

答案 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();