1

次のエラーがあります。

ExecuteNonQuery では、コマンドに割り当てられた接続が保留中のローカル トランザクションにある場合、コマンドにトランザクションが必要です。コマンドのトランザクション プロパティが初期化されていません。

このエラーは、関数 executaComando で表示されます

私の機能保存:

public void save(string[] arr)//, int lista)
{
    SqlConnection conexao = new SqlConnection(WebConfigurationManager.ConnectionStrings["strConexao"].ToString());
    conexao.Open();
    SqlTransaction trx = conexao.BeginTransaction();

    try
    {
        //Truncate cliente_recurso
        BUProjetosDAL dal = new BUProjetosDAL();
        dal.excluirClientesRecurso(conexao);

        dtsRecursoClienteTableAdapters.RECURSO_CLIENTETabelaTableAdapter tabela = new dtsRecursoClienteTableAdapters.RECURSO_CLIENTETabelaTableAdapter();

        for (int j = 0; j <= 10; j++) { // <- here
            tabela.Insert(arr);
        }

        trx.Commit();
    }
    catch (SqlException ex)
    {
        try
        {
            trx.Rollback();
        }
        catch (Exception exRollback)
        {
            Response.Write(exRollback.Message);
        }  
    }
}

関数 excluirClientesRecurso

public void excluirClientesRecurso(SqlConnection conexao)
{
    executaComando("TRUNCATE TABLE dbo.RECURSO_CLIENTE", conexao);
}

関数 executaComando (----ここにエラーが表示されます----)

public void executaComando(string query, SqlConnection conexao)
{
    try
    {
        SqlCommand cmd = new SqlCommand(query);
        cmd.Connection = conexao;
        cmd.ExecuteNonQuery();
        conexao.Close();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
4

3 に答える 3

2

まあ、それはまさにエラーが言うとおりです。トランザクションをオープンしましたが、それをコマンドに割り当てていません。

簡単な解決策の 1 つは、単純に次のように渡すことexecutaComandoです。

public void excluirClientesRecurso(SqlConnection conexao,
                                   SqlTransaction transaction)
{
    executaComando("TRUNCATE TABLE dbo.RECURSO_CLIENTE", conexao);
}

public void executaComando(string query, SqlConnection conexao,
                           SqlTransaction transaction)
{
    SqlCommand cmd = new SqlCommand(query);
    cmd.Connection = conexao;
    cmd.Transaction = transaction
    cmd.ExecuteNonQuery();
    conexao.Close();
}

// Usage
dal.excluirClientesRecurso(conexao, trx);

executaComando何もうまくいかなかったので、try-catch を削除したことに注意してください。実際、それは悪いことをしました: 例外のスタック トレースを台無しにしました。

于 2013-10-25T12:44:22.550 に答える
1

はい、そうです。したがって、トランザクションを渡します。これは基本的に、「ここにトランザクションがあることを知っています」と納得させる方法です。そう:

dal.excluirClientesRecurso(conexao, trx);
// ...
public void excluirClientesRecurso(SqlConnection conexao,
     SqlTransaction transaction = null)
{
    executaComando("TRUNCATE TABLE dbo.RECURSO_CLIENTE",
        conexao, transaction);
}

public void executaComando(string query, SqlConnection conexao,
     SqlTransaction trasaction = null)
{
    try
    {
        SqlCommand cmd = new SqlCommand(query);
        cmd.Trasnaction = transaction;
        // ...
于 2013-10-25T12:44:47.320 に答える
1

このコードを試してください

    public bool updateusertable(string UserName,string Password,string Datetime)
            {
                bool bResult = false;
               SqlTransaction tx;
                try
                {
                    tx=Sqlconnect.Begintransaction;
                    SqlCommand Ocmd = new SqlCommand();
                   Sqlconnect= Cconnect.OpenSqlConnection();
                    Ocmd.Connection = Sqlconnect;
                    Ocmd.CommandType = CommandType.StoredProcedure;
                    Ocmd.CommandText = "SP_User_login_Update";
                    Ocmd.Parameters.Add("@UserName", SqlDbType.VarChar, 100).Value = UserName;
                    Ocmd.Parameters.Add("@Password", SqlDbType.VarChar, 100).Value = Password;
                    Ocmd.Parameters.Add("@lastlogin", SqlDbType.VarChar, 100).Value = Datetime;
                    int i = Ocmd.ExecuteNonQuery();
                    if (i <= 1)
                    {
                        bResult = true;
                    }else
                    {
                        tx.Rollback();
                    }
                }
                catch (Exception ex)
                {
                    string msg = ex.Message.ToString();
                    tx.Rollback();
                }
                finally
                {
                    tx.Commit();
                }
                return bResult;
            }
于 2014-07-01T16:33:11.457 に答える