0

ストアド プロシージャを実行できません。誰かが私にアドバイスして、私のばかげた間違いを指摘できますか?

私が得たエラーメッセージは

無効な操作です。接続が閉じられました

コード:

public void Update(RepliesBAL RPBAL)
{
    using (SqlConnection connection = new SqlConnection(@"Data Source=19NNZP;Initial Catalog=ivr;Persist Security Info=True;User ID=sa;Password=sa"))
    {
        SqlCommand command = new SqlCommand ();
        command.CommandType = CommandType.StoredProcedure;
        command.CommandText = "dbo.fax_UpdateFaxReply";
        command.Parameters.Add("@uid", SqlDbType.VarChar, 50).Value = RPBAL.UlyssesID ;

        SqlTransaction transaction;

        transaction = connection.BeginTransaction("SampleTransaction");

        command.Connection = connection;
        command.Transaction = transaction;

        try
        {
            connection.Open();
            command.ExecuteNonQuery();
            Console.WriteLine("OK");
        }
        catch (Exception ex)
        {
            Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
            Console.WriteLine("  Message: {0}", ex.Message);
            try
            {
                transaction.Rollback();
            }
            catch (Exception ex2)
            {
                Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
                Console.WriteLine("  Message: {0}", ex2.Message);
                throw new Exception(ex.Message);
            }
        }
    }
}
4

1 に答える 1

1

を呼び出す.BeginTransaction()には、接続がすでに開かれている必要があります。そのため、コードを次のように変更します。

using (SqlConnection connection = new SqlConnection(@"Data Source=19NNZP;Initial Catalog=ivr;Persist Security Info=True;User ID=sa;Password=sa"))
{
        // set up the SqlCommand 
        SqlCommand command = new SqlCommand();
        command.Connection = connection;
        command.CommandType = CommandType.StoredProcedure;
        command.CommandText = "dbo.fax_UpdateFaxReply";

        // SqlDbType should be *NVarChar* to exactly match the stored procedure parameter's type! 
        // Otherwise you'll have an implicit conversion happening....
        command.Parameters.Add("@uid", SqlDbType.NVarChar, 50).Value = RPBAL.UlyssesID ;

        SqlTransaction transaction;

        try
        {
            // open connection, start transaction
            connection.Open();

            transaction = connection.BeginTransaction("SampleTransaction");

            // assign transaction to SqlCommand and execute it  
            command.Transaction = transaction;
            command.ExecuteNonQuery();

            // if successful - commit the transaction!
            transaction.Commit();
            connection.Close();

            Console.WriteLine("OK");
        }
        catch (Exception ex)
        {
            Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
            Console.WriteLine("  Message: {0}", ex.Message);
            try
            {
                transaction.Rollback();
            }
            catch (Exception ex2)
            {
                Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
                Console.WriteLine("  Message: {0}", ex2.Message);
                throw new Exception(ex.Message);
            }
        }
    }

その変更後、うまくいけば、このコードは問題なく機能するはずです。

于 2012-08-05T11:10:42.817 に答える