2013-10-25 130 views
1

我有以下錯誤:錯誤在C#TRANSATION和的ExecuteNonQuery

ExecuteNonQuery requires the command to have a transaction when the connection assigned to the command is in a pending local transaction. The Transaction property of the command has not been initialized.

出現在功能此錯誤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; 
    } 
} 
+1

順便說一句,你可能想看看在缺少'using'聲明(這可能導致連接耗盡),並在你的'executaComando'缺乏參數化(這表明來自其他領域的代碼可能會使用輸入的連接,這將非常糟糕 - 可能會導致sql注入等其他問題) –

回答

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; 
     // ... 
2

嗯,這是完全一樣的錯誤說。您打開了一個事務,但您沒有將其分配給該命令。

一個簡單的解決辦法是簡單地傳遞下來到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); 

請注意,我刪除的try-catch在executaComando,因爲它沒有做什麼都好。事實上,它做了不好的事情:它搞砸了異常的堆棧跟蹤。

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; 
      } 
相關問題