Usuário com melhor resposta
Multiplos SQLCommand

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"
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
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 -
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