【发布时间】:2021-04-22 23:40:09
【问题描述】:
我正在尝试为脚本实现事务,但遇到了一个奇怪的问题。
当我尝试在事务中运行准备好的 SQL 语句时,它失败了,因为它说在分配连接时它需要一个事务。
这如何与 Prepared Statements 一起使用,因为我打算让多个 Transactions 都使用相同的 Prepared Statements。
我的代码如下
class dbTest {
public static SqlConnection db;
public static SqlCommand query;
static void Main(string[] args) {
db = connect();
prepare();
transaction01();
transaction02();
transaction03();
}
public static void prepare() {
query = new SqlCommand("select id from table where id = 1 for update", db);
query.Prepare();
}
public static void transaction01() {
SqlTransaction trans = db.BeginTransaction("Trn01");
SqlDataReader result = query.ExecuteReader();
while(result.Read()) { Console.WriteLine(result["id"]); }
result.Close();
trans.Commit();
}
public static void transaction02() {
SqlTransaction trans = db.BeginTransaction("Trn02");
SqlDataReader result = query.ExecuteReader();
while(result.Read()) { Console.WriteLine(result["id"]); }
result.Close();
trans.Commit();
}
public static void transaction03() {
SqlTransaction trans = db.BeginTransaction("Trn03");
SqlDataReader result = query.ExecuteReader();
while(result.Read()) { Console.WriteLine(result["id"]); }
result.Close();
trans.Commit();
}
}
如何将 Transaction 分配给现有的 Prepared Statement?
更新
更改了上面的代码以更好地显示问题。 SQL 只准备一次,但我会将它用于多个事务(或至少我想要)
再次更新
我已将下面的答案标记为正确答案,因为它看起来是实现此目标的最佳方法,但在这个非常小的示例中,我需要使用 query.Transaction 让它工作
public static void transaction01() {
SqlTransaction trans = db.BeginTransaction("Trn01");
query.Transaction = trans; // this line fixed it
SqlDataReader result = query.ExecuteReader();
while(result.Read()) { Console.WriteLine(result["id"]); }
result.Close();
trans.Commit();
}
【问题讨论】:
-
这能回答你的问题吗? Pass parameters correctly to SqlCommand
-
将
using块用于命令、连接、事务和读取器对象。 NOT 缓存db连接对象。您无需致电Prepare -
将事务添加到命令的构造函数中。你需要先打开连接
-
参数不是问题,只是没有事务就无法回滚
-
让我稍微修改一下代码以更好地展示我正在尝试做的事情
标签: sql-server .net-core transactions prepared-statement