0

私はC#でこの関数を持っています。FOR を呼び出すと、ExecuteNonQuery にエラーが表示されます。エラーは、「ExecuteNonQuery は、コマンドに割り当てられた接続が保留中のローカル トランザクションにある場合、コマンドにトランザクションが必要です。コマンドのトランザクション プロパティが初期化されていません。」です。

SqlConnection cnn = new SqlConnection(WebConfigurationManager.ConnectionStrings["strCnn"].ToString());
                cnn.Open();
                SqlTransaction trx = cnn.BeginTransaction();

                try
                {

                    SqlCommand cmd= new SqlCommand();

                    for (int j = 0; j < arr.Length; j++) {
                        cmd.CommandText = "UPDATE rc SET nc= " +  arr[j].Col3 + " WHERE cr = " + arr[j].Col1;
                        cmd.Connection = cnn;
                        cmd.ExecuteNonQuery();
                    }

                    trx.Commit();
                    return 1;
                }
                catch (SqlException ex)
                {
                    try
                    {
                        trx.Rollback();
                        return 0;
                    }
                    catch (Exception exRollback)
                    {
                        return 0;
                    }  
                }
4

7 に答える 7

1

このエラー メッセージは、トランザクションを開いたこと、および実行時点でまだ開いていることを示していますExecuteNonQuery

ExecuteNonQueryトランザクションのコミット前に実行しています。

定義

comando.Transaction = trx;

ExecuteNonQuery が同じトランザクションで実行されるようにします。

于 2013-10-31T11:07:04.793 に答える
0

あなたの sqlCommand はあなたのトランザクションについて知りません。

ここにコピペ修正があります:

SqlConnection conexao = new SqlConnection(WebConfigurationManager.ConnectionStrings["strConexao"].ToString());
conexao.Open();
SqlTransaction trx = conexao.BeginTransaction();

try
{
    for (int j = 0; j < arr.Length; j++) {
        var commandText = "UPDATE RECURSO_CLIENTE SET NM_CLIENTE = " +  arr[j].Col3 + " WHERE CD_RECURSO = " + arr[j].Col1;
        SqlCommand comando = new SqlCommand(commandText, conexao, trx);
        comando.ExecuteNonQuery();
    }

    trx.Commit();
    return 1;
}
catch (SqlException ex)
{
    try
    {
        trx.Rollback();
        return 0;
    }
    catch (Exception exRollback)
    {
        return 0;
    }  
}
于 2013-10-31T11:00:18.173 に答える
0

使用する

// Create command on transaction and automatically assign open transaction
var comando = conexao.CreateCommand()

またはトランザクションをコマンドに割り当てます。

// Create command
var comando = new SqlCommand();
// and assign transaction manually
comando.Transaction = trx;
于 2013-10-31T10:56:50.030 に答える