Como resolver o erro de Timeout expired ?

18/10/2017

0

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.
Responder

Post mais votado

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

Paulo Santos

Paulo Santos
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar