PROGRAMA PAROU DE RESPONDER - INTERMITENTE
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;
}
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.
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.
Kerplunk, eu sei..antes eu estava usando apenas dr.Read()...mas mudei pois o erro ja estava dando no mesmo ponto.
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
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
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
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
é 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;
}
}
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;
}
}
Então é o que estava imaginando, uma operação com encadeamento que não está finalizando corretamente.
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.
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.
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.
Tópico encerrado , respostas não são mais permitidas