Problema em obter último Id da tabela
Oi!
Eu estou tendo um problema em buscar o MAX(Id) de uma tabela no Access. Na minha camada BLL eu chamo um método de inserção na camada DAL, e quando retorno para a BLL, eu chamo um método para buscar o último Id da tabela, na camada DAL. O problema é que neste último método, ele executa o SELECT (utiliza ExecuteScalar do OleDbCommand), porém o retorno do método para o objeto tem problemas.
Quando tem um registro na tabela, o objeto fica em branco (não nulo, mas fica assim a propriedade Value: Value{}) e quando tem mais de um, ao invés de trazer o último pela função MAX do SELECT, ele traz o penúltimo Id.
Algumas vezes, ao debugar passo a passo o código, o problema não ocorre, mas se deixar executando normal e pegar pelas exceções, que se identifica esse problema.
É estranho dizer, mas é como se ao executar normalmente, fosse muito "rápido" para pegar o Id que acabou de ser inserido na tabela. Você saberiam me informar, que problema seria esse ou como poderia solucionar?
Eu estou tendo um problema em buscar o MAX(Id) de uma tabela no Access. Na minha camada BLL eu chamo um método de inserção na camada DAL, e quando retorno para a BLL, eu chamo um método para buscar o último Id da tabela, na camada DAL. O problema é que neste último método, ele executa o SELECT (utiliza ExecuteScalar do OleDbCommand), porém o retorno do método para o objeto tem problemas.
Quando tem um registro na tabela, o objeto fica em branco (não nulo, mas fica assim a propriedade Value: Value{}) e quando tem mais de um, ao invés de trazer o último pela função MAX do SELECT, ele traz o penúltimo Id.
Algumas vezes, ao debugar passo a passo o código, o problema não ocorre, mas se deixar executando normal e pegar pelas exceções, que se identifica esse problema.
É estranho dizer, mas é como se ao executar normalmente, fosse muito "rápido" para pegar o Id que acabou de ser inserido na tabela. Você saberiam me informar, que problema seria esse ou como poderia solucionar?
Carlos Nogueira
Curtidas 0
Respostas
Luiz Maia
08/12/2009
Carlos,
Sinceramente nunca vi nada parecido. Mas tem alguns recursos que você pode usar para tentar contornar este bug.
Primeiro seria vcusar uma transacao, so depois do commit, vc chamaria a função que retorna o ultimo ID.
Outra solução, é fazer um metodo separado para isto e logo depois da inserção vc ja o executa, como no exemplo abaixo:
Metodo:
// Metodo que recupera o ultimo regitro inserido
public string UltimoRegistro(params string[] values)
{
string sql = "select max(" + values[1] + ") from " + values[0];
OleDbCommand cmd = new OleDbCommand(sql);
return AsValue(cmd).ToString();
}
Chamada:
codigo = Convert.ToInt32(acesso.UltimoRegistro("tipo_consulta", "cod_tipo_consulta"));
Aqui vc passa o campo e a tabela a ser recuperado.
Espero que ajude, aguardo seu retorno.
Abraços
Att
Luiz Maia
GOSTEI 0
Carlos Nogueira
08/12/2009
Luiz,
Eu entendi. Já fiz algo similar ao que você fez, mas acho que eu já consegui solucionar o problema e identificar o que estava acontecendo. Vou só me certificar amanhã para ver se é isso mesmo, e se for, eu comento contigo.
Apenas adiantando, por descuidos meus, alguns comandos executados na camada DAL (como insert, update) estavam sendo executados pelo ExecuteNonQuery() mas depois que passava desse método do OleDbCommand, saia dessa camada e eu não havia colocado para fechar a conexão. Só estava fazendo isso quando usava o método ExecuteReader.
Ai o que decidi fazer. Nesses caras que tem insert e update, decidi colocar um finally para verificar se o status da conexão está aberto, e se estiver, que efetuasse o fechamento. Me parece que depois disso, não ocorreu mais problema, nem mesmo um problema de fazer inserção ou alteração na tabela que exibia uma mensagem de vez em quando que o "recurso estava bloqueado".
Se for isso mesmo, descuidos da minha parte., rsrs... Mas vou confirmar e depois te informo, beleza?
Até mais!!
Eu entendi. Já fiz algo similar ao que você fez, mas acho que eu já consegui solucionar o problema e identificar o que estava acontecendo. Vou só me certificar amanhã para ver se é isso mesmo, e se for, eu comento contigo.
Apenas adiantando, por descuidos meus, alguns comandos executados na camada DAL (como insert, update) estavam sendo executados pelo ExecuteNonQuery() mas depois que passava desse método do OleDbCommand, saia dessa camada e eu não havia colocado para fechar a conexão. Só estava fazendo isso quando usava o método ExecuteReader.
Ai o que decidi fazer. Nesses caras que tem insert e update, decidi colocar um finally para verificar se o status da conexão está aberto, e se estiver, que efetuasse o fechamento. Me parece que depois disso, não ocorreu mais problema, nem mesmo um problema de fazer inserção ou alteração na tabela que exibia uma mensagem de vez em quando que o "recurso estava bloqueado".
Se for isso mesmo, descuidos da minha parte., rsrs... Mas vou confirmar e depois te informo, beleza?
Até mais!!
GOSTEI 0
Luiz Maia
08/12/2009
Ok Aguardo seu retorno.
Dica: sempre use o finnaly, assim vc não esquece de fechar a conexão, isto atrapalha e muito a permorfance.
Abraços
Att
Luiz Maia
GOSTEI 0
Luiz Maia
08/12/2009
Carlos,
Vamos concluir o chamado, caso ainda alguma duvida persista, pode usar este post mesmo, ok?
Estamos a sua disposição...
Abraços
Att
Luiz Maia
GOSTEI 0
Carlos Nogueira
08/12/2009
Beleza, era exatamente aquilo que havia mencionado!
Obrigado pela sua atenção!
Obrigado pela sua atenção!
GOSTEI 0