Fórum Problema em obter último Id da tabela #12740

08/12/2009

0

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?
Carlos Nogueira

Carlos Nogueira

Responder

Posts

09/12/2009

Luiz Maia

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
Responder

Gostei + 0

09/12/2009

Carlos Nogueira

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

Gostei + 0

10/12/2009

Luiz Maia

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
Responder

Gostei + 0

15/12/2009

Luiz Maia

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
Responder

Gostei + 0

15/12/2009

Carlos Nogueira

Beleza, era exatamente aquilo que havia mencionado!
Obrigado pela sua atenção!
Responder

Gostei + 0

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

Aceitar