none
Multiplos SQLCommand RRS feed

  • Pergunta

  • Prezados, o método abaixo retorna apenas seguinte exceção:

    Exception thrown: 'System.InvalidOperationException' in System.Data.dll

    a partir de

    cmd2.ExecuteNonQuery();

    Código:

    public bool criarCTR(CTR ctr)
            {
                SqlConnection cn = ConexaoSQLServer.Conexao();
                int pgrcc_rcc_id = 0;
    
                SqlCommand cmd1 = cn.CreateCommand();
                SqlCommand cmd2 = cn.CreateCommand();
                SqlCommand cmd3 = cn.CreateCommand();
    
                cmd1.CommandText = "SELECT MAX(PGRCC_RCC_ID) PGRCC_RCC_ID FROM PGRCC_RCC WHERE PGRCC_ID = @pgrcc_id";
                cmd1.Parameters.Add(new SqlParameter("@pgrcc_id", ctr.PGRCC_ID));
    
                cmd2.CommandText = @"INSERT INTO CTR (RECE_ID,PGRCC_RCC_ID,STPGRCC_ID) VALUES (@RECE_ID,@PGRCC_RCC_ID,5);";
                cmd2.Parameters.Add(new SqlParameter("@RECE_ID", ctr.receptor.EntidadeReceptor.IdEntidade));
                cmd2.Parameters.Add(new SqlParameter("@PGRCC_RCC_ID", 0));
    
                cmd3.CommandText = @"SELECT MAX (CTR_ID) CTR_ID FROM CTR";
    
                cn.Open();
    
                SqlTransaction tran = cn.BeginTransaction();
    
                try
                {
                    //cmd1.Transaction = tran;
                    SqlDataReader dr = cmd1.ExecuteReader();
                    if (dr.Read()) {
                        pgrcc_rcc_id = Convert.ToInt32(dr["PGRCC_RCC_ID"].ToString());
                        dr.Close();
                    }
    
                    cmd2.Transaction = tran;
                    cmd2.ExecuteNonQuery();
    
                    cmd3.Transaction = tran;
                    dr = cmd3.ExecuteReader();
    
                    int ctr_id = 0;
                    if (dr.Read())
                    {
                        ctr_id = Convert.ToInt32(dr["CTR_ID"].ToString());
                    }
    
                    tran.Commit();
    
                    this.criaAndamentoCTR(ctr_id, "Criação da CTR", 5);
    
                    return true;
    
                }
                catch (Exception e)
                {
                    tran.Rollback();
                    Console.WriteLine(e.StackTrace);
                    Console.ReadLine();
                    return false;
                }
                finally
                {
                    cn.Close();
                }           
    
            }

    No StackTrace só consigo extrair isso:

     
    em System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)\r\n  
     em System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)\r\n  
     em System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)\r\n  
     em System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)\r\n  
     em System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)\r\n  
     em System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds, Boolean describeParameterEncryptionRequest)\r\n  
     em System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)\r\n   em System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)\r\n
     em System.Data.SqlClient.SqlCommand.ExecuteNonQuery()\r\n
     em DAL.mssqlserver.CTRDAL.criarCTR(CTR ctr) na C:\\Users\\enilt\\OneDrive\\Disciplinas 5 - Sem\\TCC\\workspace_novo\\ePGRCC\\DAL\\mssqlserver\\CTRDAL.cs:linha 75"


    terça-feira, 23 de agosto de 2016 03:15

Respostas

  • Enilton,

    Pelo que analisei no fonte, você inicializou a transação e fez uma consulta, por isso o erro.

    Ajuste para:

    SqlConnection cn = ConexaoSQLServer.Conexao();
                cn.Open();
    
                int pgrcc_rcc_id = 0;
    
                SqlCommand cmd1 = cn.CreateCommand();
                SqlCommand cmd2 = cn.CreateCommand();
                SqlCommand cmd3 = cn.CreateCommand();
    
                cmd1.CommandText = "SELECT MAX(PGRCC_RCC_ID) PGRCC_RCC_ID FROM PGRCC_RCC WHERE PGRCC_ID = @pgrcc_id";
                cmd1.Parameters.Add(new SqlParameter("@pgrcc_id", ctr.PGRCC_ID));
    
                cmd2.CommandText = @"INSERT INTO CTR (RECE_ID,PGRCC_RCC_ID,STPGRCC_ID) VALUES (@RECE_ID,@PGRCC_RCC_ID,5);";
                cmd2.Parameters.Add(new SqlParameter("@RECE_ID", ctr.receptor.EntidadeReceptor.IdEntidade));
                //cmd2.Parameters.Add(new SqlParameter("@PGRCC_RCC_ID", 0));
    
                SqlParameter teste = new SqlParameter("@PGRCC_RCC_ID", SqlDbType.Int);
                teste.Value = 0;
                cmd2.Parameters.Add(teste);
    
                cmd3.CommandText = @"SELECT MAX(CTR_ID) CTR_ID FROM CTR";
    
                SqlTransaction tran = null;
    
                try
                {
                    //cmd1.Transaction = tran;
                    SqlDataReader dr = cmd1.ExecuteReader();
                    if (dr.Read()) {
                        pgrcc_rcc_id = Convert.ToInt32(dr["PGRCC_RCC_ID"].ToString());
                    }
                    dr.Close();
    
                    tran = cn.BeginTransaction();
    
                    cmd2.Transaction = tran;
                    cmd2.ExecuteNonQuery();
    
                    cmd3.Transaction = tran;
                    dr = cmd3.ExecuteReader();
    
                    int ctr_id = 0;
                    if (dr.Read())
                    {
                        ctr_id = Convert.ToInt32(dr["CTR_ID"].ToString());
                    }
                    dr.Close();
                    tran.Commit();
    
                    this.criaAndamentoCTR(ctr_id, "Criação da CTR", 5);
    
                    return true;
    
                }
    


    • Marcado como Resposta Enilton Junior terça-feira, 23 de agosto de 2016 12:08
    terça-feira, 23 de agosto de 2016 12:06

Todas as Respostas

  • Olá Enilton!

    Não tem nenhuma outra mensagem de erro? Você já deu uma olhada na InnerException para ver se não tem uma mensagem de erro mais clara?

    O que eu tentaria seria alterar a execução do primeiro comando para ExecuteScalar ao invés de ExecuteReader.. Como você está retornando o valor de somente uma coluna, o ExecuteScalar é o suficiente, e evita que você abra um DataReader na conexão, o que muitas vezes acaba gerando problemas se o DataReader fica aberto (não é o seu caso aparentemente, mas, vale a tentativa)..

    Abraço!


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima

    terça-feira, 23 de agosto de 2016 11:33
    Moderador
  • Enilton,

    Pelo que analisei no fonte, você inicializou a transação e fez uma consulta, por isso o erro.

    Ajuste para:

    SqlConnection cn = ConexaoSQLServer.Conexao();
                cn.Open();
    
                int pgrcc_rcc_id = 0;
    
                SqlCommand cmd1 = cn.CreateCommand();
                SqlCommand cmd2 = cn.CreateCommand();
                SqlCommand cmd3 = cn.CreateCommand();
    
                cmd1.CommandText = "SELECT MAX(PGRCC_RCC_ID) PGRCC_RCC_ID FROM PGRCC_RCC WHERE PGRCC_ID = @pgrcc_id";
                cmd1.Parameters.Add(new SqlParameter("@pgrcc_id", ctr.PGRCC_ID));
    
                cmd2.CommandText = @"INSERT INTO CTR (RECE_ID,PGRCC_RCC_ID,STPGRCC_ID) VALUES (@RECE_ID,@PGRCC_RCC_ID,5);";
                cmd2.Parameters.Add(new SqlParameter("@RECE_ID", ctr.receptor.EntidadeReceptor.IdEntidade));
                //cmd2.Parameters.Add(new SqlParameter("@PGRCC_RCC_ID", 0));
    
                SqlParameter teste = new SqlParameter("@PGRCC_RCC_ID", SqlDbType.Int);
                teste.Value = 0;
                cmd2.Parameters.Add(teste);
    
                cmd3.CommandText = @"SELECT MAX(CTR_ID) CTR_ID FROM CTR";
    
                SqlTransaction tran = null;
    
                try
                {
                    //cmd1.Transaction = tran;
                    SqlDataReader dr = cmd1.ExecuteReader();
                    if (dr.Read()) {
                        pgrcc_rcc_id = Convert.ToInt32(dr["PGRCC_RCC_ID"].ToString());
                    }
                    dr.Close();
    
                    tran = cn.BeginTransaction();
    
                    cmd2.Transaction = tran;
                    cmd2.ExecuteNonQuery();
    
                    cmd3.Transaction = tran;
                    dr = cmd3.ExecuteReader();
    
                    int ctr_id = 0;
                    if (dr.Read())
                    {
                        ctr_id = Convert.ToInt32(dr["CTR_ID"].ToString());
                    }
                    dr.Close();
                    tran.Commit();
    
                    this.criaAndamentoCTR(ctr_id, "Criação da CTR", 5);
    
                    return true;
    
                }
    


    • Marcado como Resposta Enilton Junior terça-feira, 23 de agosto de 2016 12:08
    terça-feira, 23 de agosto de 2016 12:06