将 SqlTransaction 与 SqlDataReader 结合使用

本文关键字:结合 SqlDataReader SqlTransaction | 更新日期: 2023-09-27 17:56:57

有很多

人在网上谈论它,但这似乎不起作用。这是我得到的例外:

 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 的范围内移动提交,我会收到数据读取器需要首先关闭的异常。

编辑:我已经回答了我的问题,并会尽量记住在允许我接受的几天内接受它。

将 SqlTransaction 与 SqlDataReader 结合使用

问题是我的 DELETE 语句得到了一个 SqlException(外键问题)。这是关闭 sqlconnection 并结束事务,但它没有在我的代码中引发异常,因为 SELECT 语句工作正常。我已经解决了 Sql 问题,代码工作正常。如果其他人遇到这种情况,他们应该能够像我一样做到这一点。

如果这些 SQL 本质上是单独的,那么您可以将它们包装在存储过程中并在过程中使用事务。然后改为在 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
END