网上有很多人在谈论它,但这似乎行不通。这是我得到的异常:
This SqlTransaction has completed; it is no longer usable.以下是代码
using (SqlConnection locationConnection = new SqlConnection(connectionString))
{
locationConnection.Open();
SqlTransaction transaction = locationConnection.BeginTransaction();
SqlCommand cmd = new SqlCommand("
Select stuff from table A
Insert stuff into table B
Delete stuff from table A", locationConnection, transaction);
using(SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
//Doesn't matter
}
}
//Exception happens here
transaction.Commit();
}有人能解释为什么会发生这种情况吗?如果我将提交移到SqlDataReader的作用域内,我会得到一个异常,即datareader需要首先关闭。
编辑:我已经回答了我的问题,如果允许的话,我会在几天后记得来接受它。
发布于 2015-06-18 00:59:11
问题是我用DELETE语句得到了一个SqlException (外键问题)。这是关闭sqlconnection并结束事务,但它没有在我的代码中抛出异常,因为SELECT语句工作得很好。我已经解决了Sql问题,代码运行良好。如果其他人遇到这种情况,他们应该能够像我一样做到这一点
发布于 2015-06-17 23:58:02
如果这些SQL本质上是独立的,那么您可以将它们包装在存储过程中,并在过程中使用transaction。然后在您的C#代码中调用该过程。另一种解决方案。
CREATE PROCEDURE usp_TransTest
AS
BEGIN
DECLARE @err INT
BEGIN TRAN
Insert stuff into table B
SELECT @err = @@ERROR
IF (@err <> 0) GOTO ERR
Delete stuff from table A
SELECT @err = @@ERROR
IF (@err <> 0) GOTO ERR
COMMIT TRAN
ERR:
PRINT 'Unexpected error occurred!'
ROLLBACK TRAN
ENDhttps://stackoverflow.com/questions/30896240
复制相似问题