1. ホーム
  2. c#

"その操作はトランザクションの状態に対して有効ではありません "エラーとトランザクションの範囲

2023-08-11 15:43:02

質問内容

SELECT文を含むストアドプロシージャを呼び出そうとすると、以下のエラーが発生します。

この操作は、トランザクションの状態に対して有効ではありません。

以下は私の呼び出しの構造です。

public void MyAddUpdateMethod()
{

    using (TransactionScope Scope = new TransactionScope(TransactionScopeOption.RequiresNew))
    {
        using(SQLServer Sql = new SQLServer(this.m_connstring))
        {
            //do my first add update statement

            //do my call to the select statement sp
            bool DoesRecordExist = this.SelectStatementCall(id)
        }
    }
}

public bool SelectStatementCall(System.Guid id)
{
    using(SQLServer Sql = new SQLServer(this.m_connstring)) //breaks on this line
    {
        //create parameters
        //
    }
}

トランザクション内で同じデータベースへの別の接続を作成することが問題なのでしょうか?

どのように解決するのですか?

いくつかの研究を行った後、TransactionScope ブロックで同じデータベースに対して 2 つの接続を開くことはできないようです。私は自分のコードを次のように修正する必要がありました。

public void MyAddUpdateMethod()
{
    using (TransactionScope Scope = new TransactionScope(TransactionScopeOption.RequiresNew))
    {
        using(SQLServer Sql = new SQLServer(this.m_connstring))
        {
            //do my first add update statement            
        }

        //removed the method call from the first sql server using statement
        bool DoesRecordExist = this.SelectStatementCall(id)
    }
}

public bool SelectStatementCall(System.Guid id)
{
    using(SQLServer Sql = new SQLServer(this.m_connstring))
    {
        //create parameters
    }
}