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 回答