我试图提交一个事务到我的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();
}
前两次插入工作得很好,但一旦它试图执行其中一个更新,就没有乐趣了。
我已经发现了问题—当我调用更新时,我只是缺少事务参数,而对于之前工作良好的插入,我已经包含了IDbTransaction
参数!我的坏!
的例子:
Connection.Query<Entitiy>("sqlQuery",param: new { id= ID}, transaction: Transaction)
Microsoft建议尽可能在数据库IDbTransaction上使用TransactionScope。下面的代码应该可以工作,假设您的SQL没有任何问题,并且托管的提供程序自动在环境事务中加入—这是行为良好的提供程序需要做的事情。
using (var ts = new TransactionScope())
{
using (_cn)
{
_cn.Open();
...
}
ts.complete();
}
我的问题是这样的。我有这段代码,它看起来很好。
public async Task ClearCurrentBasePriceFile(IDbTransaction transaction = null)
{
var connection = transaction?.Connection ?? _db;
await connection.ExecuteAsync(@"
DELETE
FROM PRICE_LIST_BASE",
transaction
).ConfigureAwait(false);
}
我正在传入事务。我确信交易不是空的。但是它仍然会给我错误。
结果是,如果我在transaction
参数前面添加null
, param
参数应该在哪里,然后它工作。它似乎将事务参数作为参数参数,因此它认为我没有提供事务。