c# - 如何在 SQL Server 中使用 SqlTransaction 在 FOR 循环中运行一次命令
问题描述
我正在DataGridview
使用 FOR 循环从一到三个数据库表中插入行,SqlTransaction
并且我只想在一个表中插入事务的引用一次。
我怎样才能做到这一点?
我试图在bool flag = false;
我使用过的 FOR 循环中声明变量
if(flag == false)
{
.......
flag == true;
}
但是它没有帮助,因为cmd3.ExecuteNon()
如果我SqlCommand cmd3;
在 FOR 之前声明并在 IF 语句中实例化,或者如果我在 IF 语句中声明并实例化,这两种情况都不起作用。
string cs = ConfigurationManager.ConnectionStrings["PRMSConnectionString"].ToString();
SqlConnection con = new SqlConnection(cs);
SqlTransaction objTransaction;
SqlCommand cmd3;
bool flag = false;
for (int i = 0; i < dgv_Purchase.Rows.Count - 1; i++)
{
con.Open();
objTransaction = con.BeginTransaction();
//**************************Command 1 Code*******************
string query1 = "INSERT ......";
SqlCommand cmd1 = new SqlCommand(query1, con, objTransaction);
//***************************Command 2 Code*******************
string query2 = "INSERT .....";
SqlCommand cmd2 = new SqlCommand(query2, con, objTransaction);
//****************************Command 3 Code*******************
if (flag == false)
{
string query3 = "INSERT. ......";
cmd3 = new SqlCommand(query3, con, objTransaction);
flag = true;
}
try
{
cmd1.ExecuteNonQuery();
cmd2.ExecuteNonQuery();
cmd3.ExecuteNonQuery();
objTransaction.Commit();
lblSF.Text = "Success!";
}
catch (Exception ex)
{
MessageBox.Show("Exception " + ex);
objTransaction.Rollback();
lblSF.Text = "Failed!";
return false;
}
finally
{
con.Close();
}
}
解决方案
如果我正确理解您的问题,您query3
只需要在循环的第一个循环中for
,并且仅在两者query1
都query2
执行之后。
如果是这种情况,只需执行两者cmd1
和cmd2
首先,然后将执行移动到cmd3
您if
声明它的位置。
string cs = ConfigurationManager.ConnectionStrings["PRMSConnectionString"].ToString();
SqlConnection con = new SqlConnection(cs);
SqlTransaction objTransaction;
bool flag = false;
for (int i = 0; i < dgv_Purchase.Rows.Count - 1; i++)
{
con.Open();
objTransaction = con.BeginTransaction();
//**************************Command 1 Code*******************
string query1 = "INSERT ......";
SqlCommand cmd1 = new SqlCommand(query1, con, objTransaction);
//***************************Command 2 Code*******************
string query2 = "INSERT .....";
SqlCommand cmd2 = new SqlCommand(query2, con, objTransaction);
//****************************Command 3 Code*******************
try
{
cmd1.ExecuteNonQuery();
cmd2.ExecuteNonQuery();
if (flag==false)
{
string query3 = "INSERT. ......";
SqlCommand cmd3 = new SqlCommand(query3, con, objTransaction);
cmd3.ExecuteNonQuery();
flag = true;
}
objTransaction.Commit();
lblSF.Text = "Success!";
}
catch (Exception ex)
{
MessageBox.Show("Exception " + ex);
objTransaction.Rollback();
lblSF.Text = "Failed!";
return false;
}
finally
{
con.Close();
}
}
推荐阅读
- flutter - 我们到底什么时候使用 async-await 呢?
- ruby - 如何把名字写成大写?
- javascript - 固定顶部但绝对底部的字母顺序
- php - 超过 5000 像素宽度或高度图像的图像上传问题
- c# - 为什么我在 webform 站点上出现此错误内部服务器错误 500
- google-sheets - Google 表格 - 通过查看器编辑单元格,但不应将其保存在电子表格中
- python - 是否有建议的多元正态样本图?
- spring-boot - 如果 401 未授权从 RequestTemplate 中删除标头并重试
- angular - 如何在不重新加载页面的情况下刷新角度 8 中的元素?
- angular - 角度材料选择可选的多项选择