PROGRAMA PAROU DE RESPONDER - INTERMITENTE

JABA 21/01/2016 17:16:52
#456366
Uma outra coisa esquisita é que você manda limpar o obj venda só quando da erro. Como é uma variável local, o coletor daria um jeito nisso fácil. Mas se você quiser insistir com isso, acho que o mais correto seria limpar no finally mesmo, tipo assim:

clsOrcamento venda = null;
// criamos nessa funçao o arquivo da venda o arquivo da venda
try
{
venda = new bdsOrcamento().GetOrc(codorc);
}
catch()
{
throw;
}
finally
{
venda = null;
}
FBGSYSTEMS 21/01/2016 17:20:47
#456368
Coloquei no catch pois logo abaixo verifico se achou o registro ou não. Se nao achou não faço nada. Pra mim daria na mesma, afinal ja inicio ela com valor null.
KERPLUNK 21/01/2016 19:46:42
#456373
Uma seleção com um código específico, que é o que você está fazendo passando o código do orçamento, me faz pensar que o retorno é um registro apenas. Por isso não faz sentido o uso de um [Ô]while[Ô] para ler um registro apenas. Mas posso estar enganado, se a seleção for mais de um registro daí sim faz sentido o que você está fazendo.
FBGSYSTEMS 21/01/2016 22:40:28
#456376
Kerplunk, eu sei..antes eu estava usando apenas dr.Read()...mas mudei pois o erro ja estava dando no mesmo ponto.
KERPLUNK 21/01/2016 23:22:17
#456377
Ok. Bem vamos recapitular alguns pontos:
1 - Que tipo de tabela? InnoDB, MyISAM...
2 - Ela possui uma chave primária, se sim, o valor consultado existe na tabela?
3 - Essa operação é encadeada? Possui outros DataReaders antes desse ponto?
4 - Vejo que você está usando um método para conectar ao banco. Se for uma operação encadeada, verifique se existem outras conexões abertas desnecessariamente. Conexões ao banco também são [Ô]disposable[Ô] e devem ser tratadas como tal.
5 - Experimente especificar os campos de retorno e não somente o asterisco e veja se resolve
FBGSYSTEMS 22/01/2016 03:33:41
#456378
O registro sempre existe pois eh um arquivo xml requisitante a validaçao Sat dessa venda. O proprio campo codorc e a chave dessa tabela.

Nao existe outros DataReaders nesse método.
Tive a cautela de desconectar em todos operaçoes que faço nessa aplicaçao.

Vou tentar especificar os campos mas nao consigo ver relaçao entre esses dois pontos.


Obrigado mais uma vez pela resposta
FBGSYSTEMS 28/01/2016 12:14:29
#456614
é galera deu o mesmo erro no mesmo ponto (while.drread()) desse metodo.
Coloquei o metodo GetOrc no proprio form e nao em uma classe e parou de dar o problema.. muito estranho isso.

public List<clsDetOrc> GetItens(long codorc)
{
auditoria.GravaAuditoria([Ô]GetItens([Ô] + codorc.ToString () + [Ô])[Ô]);
List<clsDetOrc> _return = null;
string retornoConexao;
databases conecta = new databases();
retornoConexao = conecta.conectaMySql();
// abre a instancia do comando SQL
if (retornoConexao != [Ô]Conectou[Ô])
{
return null;
}
else
{

this.sql = [Ô]select det.*,det.descricao as descricaoprod, prod.* from detorcamentos as det inner join produto as prod on (det.codprod = prod.codigo)[Ô] +
[Ô] where codorc=@codorc order by det.item[Ô];
auditoria.GravaAuditoria(this.sql.Replace([Ô]@codorc[Ô], codorc.ToString()));
using (MySqlCommand cmd = new MySqlCommand(this.sql, conecta.conexao))
{
cmd.Parameters.AddWithValue([Ô]@codorc[Ô], codorc);
using (MySqlDataReader dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection))
{
if (dr.HasRows)
{
auditoria.GravaAuditoria([Ô]Achou dados[Ô]);
_return = new List<clsDetOrc>();
while (dr.Read())
{
auditoria.GravaAuditoria([Ô]Lendo dados[Ô]);
clsDetOrc d = new clsDetOrc();

d.codprod = dr.GetInt64(dr.GetOrdinal([Ô]codprod[Ô]));
if (dr[[Ô]unidade[Ô]] != DBNull.Value)
{
d.unidade = dr.GetString(dr.GetOrdinal([Ô]unidade[Ô]));
}
else
{
d.unidade = [Ô]PC[Ô];
}
if (dr[[Ô]ncm[Ô]] != DBNull.Value && dr[[Ô]ncm[Ô]].ToString().Length == 8)
{
d.ncm = dr.GetString(dr.GetOrdinal([Ô]ncm[Ô]));
}
else
{
d.ncm = [Ô]99999999[Ô];
}
d.descricao = dr.GetString(dr.GetOrdinal([Ô]descricaoprod[Ô]));
d.cfop = dr.GetString(dr.GetOrdinal([Ô]cfop[Ô]));
d.qtd = dr.GetDecimal(dr.GetOrdinal([Ô]qtd[Ô]));
d.valor = dr.GetDecimal(dr.GetOrdinal([Ô]valor[Ô]));
d.csticms = dr.GetString(dr.GetOrdinal([Ô]csticms[Ô]));
if (dr[[Ô]icms[Ô]] != DBNull.Value)
{
d.icms = dr.GetDecimal(dr.GetOrdinal([Ô]icms[Ô]));
}
d.cstcofins = dr.GetString(dr.GetOrdinal([Ô]cstcofins[Ô]));
if (dr[[Ô]cofins[Ô]] != DBNull.Value)
{
d.cofins = dr.GetDecimal(dr.GetOrdinal([Ô]cofins[Ô]));
}
d.cstpis = dr.GetString(dr.GetOrdinal([Ô]cstpis[Ô]));
if (dr[[Ô]pis[Ô]] != DBNull.Value)
{
d.pis= dr.GetDecimal(dr.GetOrdinal([Ô]pis[Ô]));
}

d.cstpisst = dr.GetString(dr.GetOrdinal([Ô]cstpisst[Ô]));
if (dr[[Ô]pisst[Ô]] != DBNull.Value)
{
d.pisst = dr.GetDecimal(dr.GetOrdinal([Ô]pisst[Ô]));
}
d.origem = dr.GetInt32(dr.GetOrdinal([Ô]origem[Ô]));


_return.Add(d);
}
}
}
}
conecta.desconectaMySql();
auditoria.GravaAuditoria([Ô]Retorna dados[Ô]);
return _return;
}
}
KERPLUNK 28/01/2016 19:36:10
#456643
Então é o que estava imaginando, uma operação com encadeamento que não está finalizando corretamente.
FBGSYSTEMS 28/01/2016 20:39:16
#456646
Kerplunk nao entendi oq vc disse.
Eu faço dessa forma em outro sistema totalmente diferente e muito maior e nada de errado acontece. Vc tem ideia do q pode estar ocorrendo?


Simplesmente acontece de vez em quando, o mais estranho eh que o try catch nao evita isso.
KERPLUNK 29/01/2016 00:16:14
#456651
A classe [Ô]databases[Ô], possui uma propriedade chamada [Ô]conecta[Ô] que é a conexão com o banco de dados em si. Apenas desconectar o banco de dados não é o suficiente, você precisa fazer o Dispose dela ao fim de cada processo em que ela seja envolvida.
Página 2 de 3 [22 registro(s)]
Tópico encerrado , respostas não são mais permitidas