Como resolver o erro de Timeout expired ?
Estou tentando dar baixa em um estoque com esse método mas enfrentei o erro de problema de Timeout expired.
Erro
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
//Método Abater estoque
public string AbaterEstoque(int idDetalhe_compra, int quantidade)
{
string resp = "";
MySqlConnection SqlCon = new MySqlConnection();
try
{
//codigo
SqlCon.ConnectionString = Conexao.Cn;
SqlCon.Open();
MySqlCommand SqlCmd = new MySqlCommand();
SqlCmd.Connection = SqlCon;
SqlCmd.CommandText = "spabater_estoque";
SqlCmd.CommandType = CommandType.StoredProcedure;
MySqlParameter ParIdDetalheCompra = new MySqlParameter();
ParIdDetalheCompra.ParameterName = "@p_idDetalhe_compra";
ParIdDetalheCompra.MySqlDbType = MySqlDbType.Int32;
ParIdDetalheCompra.Value = idDetalhe_compra;
SqlCmd.Parameters.Add(ParIdDetalheCompra);
MySqlParameter ParQuantidade = new MySqlParameter();
ParQuantidade.ParameterName = "@p_quantidade";
ParQuantidade.MySqlDbType = MySqlDbType.Int32;
ParQuantidade.Value = quantidade;
SqlCmd.Parameters.Add(ParQuantidade);
//Executar o comando
resp = SqlCmd.ExecuteNonQuery() == 1 ? "OK" : "A atualização não foi feita";
}
catch (Exception ex)
{
resp = ex.Message;
}
finally
{
if (SqlCon.State == ConnectionState.Open) SqlCon.Close();
}
return resp;
}
//Método Inserir
public string Inserir(DVenda Venda, List<DDetalhe_Venda> Detalhe)
{
string resp = "";
MySqlConnection SqlCon = new MySqlConnection();
try
{
//codigo
SqlCon.ConnectionString = Conexao.Cn;
SqlCon.Open();
MySqlTransaction SqlTra = SqlCon.BeginTransaction();
MySqlCommand SqlCmd = new MySqlCommand();
SqlCmd.Connection = SqlCon;
SqlCmd.Transaction = SqlTra;
SqlCmd.CommandText = "spinserir_venda";
SqlCmd.CommandType = CommandType.StoredProcedure;
MySqlParameter ParIdVenda = new MySqlParameter();
ParIdVenda.ParameterName = "@p_idVenda";
ParIdVenda.MySqlDbType = MySqlDbType.Int32;
ParIdVenda.Direction = ParameterDirection.Output;
SqlCmd.Parameters.Add(ParIdVenda);
MySqlParameter ParIdFuncionario = new MySqlParameter();
ParIdFuncionario.ParameterName = "@p_idFuncionario";
ParIdFuncionario.MySqlDbType = MySqlDbType.Int32;
ParIdFuncionario.Value = Venda.IdFuncionario;
SqlCmd.Parameters.Add(ParIdFuncionario);
MySqlParameter ParData = new MySqlParameter();
ParData.ParameterName = "@p_data";
ParData.MySqlDbType = MySqlDbType.Date;
ParData.Value = Venda.Data;
SqlCmd.Parameters.Add(ParData);
MySqlParameter ParTipoComprovante = new MySqlParameter();
ParTipoComprovante.ParameterName = "@p_tipo_comprovante";
ParTipoComprovante.MySqlDbType = MySqlDbType.VarChar;
ParTipoComprovante.Size = 20;
ParTipoComprovante.Value = Venda.TipoComprovante;
SqlCmd.Parameters.Add(ParTipoComprovante);
MySqlParameter ParSerie = new MySqlParameter();
ParSerie.ParameterName = "@p_serie";
ParSerie.MySqlDbType = MySqlDbType.VarChar;
ParSerie.Size = 4;
ParSerie.Value = Venda.Serie;
SqlCmd.Parameters.Add(ParSerie);
MySqlParameter ParCorrelativo = new MySqlParameter();
ParCorrelativo.ParameterName = "@p_correlativo";
ParCorrelativo.MySqlDbType = MySqlDbType.VarChar;
ParCorrelativo.Size = 7;
ParCorrelativo.Value = Venda.Correlativo;
SqlCmd.Parameters.Add(ParCorrelativo);
//Executar o comando
resp = SqlCmd.ExecuteNonQuery() == 1 ? "OK" : "Registro não foi Inserido";
if (resp.Equals("OK"))
{
//Obter o código de venda gerada
this.IdVenda = Convert.ToInt32(SqlCmd.Parameters["@p_idVenda"].Value);
foreach (DDetalhe_Venda det in Detalhe)
{
det.IdVenda = this.IdVenda;
//Chamar método inserir no detalhe venda
resp = det.Inserir(det, ref SqlCon, ref SqlTra);
if (!resp.Equals("OK"))
{
break;
}
else
{
resp = AbaterEstoque(det.IdDetalhe_Compra, det.Quantidade);
if (!resp.Equals("OK"))
{
break;
}
}
}
}
if (resp.Equals("OK"))
{
SqlTra.Commit(); //Só a partir do comit os dados são salvos com uma transação.
}
else
{
SqlTra.Rollback(); //Roolback cancela toda a transação, nada é salvo.
}
}
catch (Exception ex)
{
resp = ex.Message;
}
finally
{
if (SqlCon.State == ConnectionState.Open) SqlCon.Close();
}
return resp;
}
Por favor ajude. Agradeço sua resposta.
Erro
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
//Método Abater estoque
public string AbaterEstoque(int idDetalhe_compra, int quantidade)
{
string resp = "";
MySqlConnection SqlCon = new MySqlConnection();
try
{
//codigo
SqlCon.ConnectionString = Conexao.Cn;
SqlCon.Open();
MySqlCommand SqlCmd = new MySqlCommand();
SqlCmd.Connection = SqlCon;
SqlCmd.CommandText = "spabater_estoque";
SqlCmd.CommandType = CommandType.StoredProcedure;
MySqlParameter ParIdDetalheCompra = new MySqlParameter();
ParIdDetalheCompra.ParameterName = "@p_idDetalhe_compra";
ParIdDetalheCompra.MySqlDbType = MySqlDbType.Int32;
ParIdDetalheCompra.Value = idDetalhe_compra;
SqlCmd.Parameters.Add(ParIdDetalheCompra);
MySqlParameter ParQuantidade = new MySqlParameter();
ParQuantidade.ParameterName = "@p_quantidade";
ParQuantidade.MySqlDbType = MySqlDbType.Int32;
ParQuantidade.Value = quantidade;
SqlCmd.Parameters.Add(ParQuantidade);
//Executar o comando
resp = SqlCmd.ExecuteNonQuery() == 1 ? "OK" : "A atualização não foi feita";
}
catch (Exception ex)
{
resp = ex.Message;
}
finally
{
if (SqlCon.State == ConnectionState.Open) SqlCon.Close();
}
return resp;
}
//Método Inserir
public string Inserir(DVenda Venda, List<DDetalhe_Venda> Detalhe)
{
string resp = "";
MySqlConnection SqlCon = new MySqlConnection();
try
{
//codigo
SqlCon.ConnectionString = Conexao.Cn;
SqlCon.Open();
MySqlTransaction SqlTra = SqlCon.BeginTransaction();
MySqlCommand SqlCmd = new MySqlCommand();
SqlCmd.Connection = SqlCon;
SqlCmd.Transaction = SqlTra;
SqlCmd.CommandText = "spinserir_venda";
SqlCmd.CommandType = CommandType.StoredProcedure;
MySqlParameter ParIdVenda = new MySqlParameter();
ParIdVenda.ParameterName = "@p_idVenda";
ParIdVenda.MySqlDbType = MySqlDbType.Int32;
ParIdVenda.Direction = ParameterDirection.Output;
SqlCmd.Parameters.Add(ParIdVenda);
MySqlParameter ParIdFuncionario = new MySqlParameter();
ParIdFuncionario.ParameterName = "@p_idFuncionario";
ParIdFuncionario.MySqlDbType = MySqlDbType.Int32;
ParIdFuncionario.Value = Venda.IdFuncionario;
SqlCmd.Parameters.Add(ParIdFuncionario);
MySqlParameter ParData = new MySqlParameter();
ParData.ParameterName = "@p_data";
ParData.MySqlDbType = MySqlDbType.Date;
ParData.Value = Venda.Data;
SqlCmd.Parameters.Add(ParData);
MySqlParameter ParTipoComprovante = new MySqlParameter();
ParTipoComprovante.ParameterName = "@p_tipo_comprovante";
ParTipoComprovante.MySqlDbType = MySqlDbType.VarChar;
ParTipoComprovante.Size = 20;
ParTipoComprovante.Value = Venda.TipoComprovante;
SqlCmd.Parameters.Add(ParTipoComprovante);
MySqlParameter ParSerie = new MySqlParameter();
ParSerie.ParameterName = "@p_serie";
ParSerie.MySqlDbType = MySqlDbType.VarChar;
ParSerie.Size = 4;
ParSerie.Value = Venda.Serie;
SqlCmd.Parameters.Add(ParSerie);
MySqlParameter ParCorrelativo = new MySqlParameter();
ParCorrelativo.ParameterName = "@p_correlativo";
ParCorrelativo.MySqlDbType = MySqlDbType.VarChar;
ParCorrelativo.Size = 7;
ParCorrelativo.Value = Venda.Correlativo;
SqlCmd.Parameters.Add(ParCorrelativo);
//Executar o comando
resp = SqlCmd.ExecuteNonQuery() == 1 ? "OK" : "Registro não foi Inserido";
if (resp.Equals("OK"))
{
//Obter o código de venda gerada
this.IdVenda = Convert.ToInt32(SqlCmd.Parameters["@p_idVenda"].Value);
foreach (DDetalhe_Venda det in Detalhe)
{
det.IdVenda = this.IdVenda;
//Chamar método inserir no detalhe venda
resp = det.Inserir(det, ref SqlCon, ref SqlTra);
if (!resp.Equals("OK"))
{
break;
}
else
{
resp = AbaterEstoque(det.IdDetalhe_Compra, det.Quantidade);
if (!resp.Equals("OK"))
{
break;
}
}
}
}
if (resp.Equals("OK"))
{
SqlTra.Commit(); //Só a partir do comit os dados são salvos com uma transação.
}
else
{
SqlTra.Rollback(); //Roolback cancela toda a transação, nada é salvo.
}
}
catch (Exception ex)
{
resp = ex.Message;
}
finally
{
if (SqlCon.State == ConnectionState.Open) SqlCon.Close();
}
return resp;
}
Por favor ajude. Agradeço sua resposta.
Jp
Curtidas 0
Melhor post
Paulo Santos
05/11/2017
Bom dia jp.
Acredito que pelo tempo vc já tenha resolvido o seu problema.
Mas para Conectar com o MySQL sempre uso o Entity Framework, que dificilmente gera o timeout.
Mas também vale tentar outras opções:
- criar index nas tabelas para melhora o desempenho
- analisar a procedure que realiza esse cadastro e tentar otimizar
https://www.devmedia.com.br/otimizando-consultas-sql-em-mysql/5257
- Aumentar o TimeOut do SqlCommand
SqlCommand cmd = new SqlCommand(sSQL, sConn);
cmd.CommandTimeout = 120; //default 30 segundos
Já tive esse problema de timeout algumas vezes mas com o SQL, pois os dados que eu devia exibir eram originados de diversos cálculos, enquanto estava desenvolvendo, tudo tranquilo, quando foi para produção.......
kkkk, mas resolvi com a consolidação dos dados e a criação de index na tabela.
Espero ter ajudado
Acredito que pelo tempo vc já tenha resolvido o seu problema.
Mas para Conectar com o MySQL sempre uso o Entity Framework, que dificilmente gera o timeout.
Mas também vale tentar outras opções:
- criar index nas tabelas para melhora o desempenho
- analisar a procedure que realiza esse cadastro e tentar otimizar
https://www.devmedia.com.br/otimizando-consultas-sql-em-mysql/5257
- Aumentar o TimeOut do SqlCommand
SqlCommand cmd = new SqlCommand(sSQL, sConn);
cmd.CommandTimeout = 120; //default 30 segundos
Já tive esse problema de timeout algumas vezes mas com o SQL, pois os dados que eu devia exibir eram originados de diversos cálculos, enquanto estava desenvolvendo, tudo tranquilo, quando foi para produção.......
kkkk, mas resolvi com a consolidação dos dados e a criação de index na tabela.
Espero ter ajudado
GOSTEI 1