我正在尝试将事务提交到我的Sql Server 2008数据库 - 首先是2次插入然后是几次更新,但是,一旦它尝试执行第一次更新,我就会收到以下错误:
ExecuteNonQuery需要命令才能拥有事务 分配给该命令的连接位于挂起的本地事务中。 该命令的Transaction属性尚未初始化。
这是代码,为简洁起见略有编辑:
using (_cn)
{
_cn.Open();
IDbTransaction transaction = _cn.BeginTransaction();
topicId = (int)_cn.Query<decimal>(qAddTopic, new { pForumId = topic.ForumId }, transaction).Single();
postId = (int)_cn.Query<decimal>(qAddPost, new { pTopicId = topicId }, transaction).Single();
_cn.Execute(qUpdateForums, new { pLastPostId = postId });
_cn.Execute((qUpdateSiteTotals));
transaction.Commit();
}
前2个插入工作正常,但只要它尝试执行其中一个更新,就没有快乐。
答案 0 :(得分:17)
我发现了问题 - 当我调用更新时,我只是错过了事务参数,而之前的插入工作正常,我已经包含了IDbTransaction
参数!我的坏!
示例:
Connection.Query<Entitiy>("sqlQuery",param: new { id= ID}, transaction: Transaction)
答案 1 :(得分:5)
Microsoft建议尽可能使用TransactionScope而不是数据库IDbTransaction。以下代码应该有效,假设您的SQL没有任何问题,托管提供程序会自动登记在环境事务中 - 这是行为良好的提供程序需要做的事情。
using (var ts = new TransactionScope())
{
using (_cn)
{
_cn.Open();
...
}
ts.complete();
}
答案 2 :(得分:0)
using (var con = new SqlConnection(connectionString))
{
con.Open();
using (IDbTransaction transaction = con.BeginTransaction())
{
string query = @"ur query";
var ID = con.Query<int>(query, new
{
//params of query
}, transaction).Single();
transaction.Commit(enter code here);
return "Record Saved Successfully.";
}
};