Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Brito

Recuperar ultimo registro inserido

Recommended Posts

Estou inserindo um registro em um BD SQL Server.Logo após o insert, como faço para recuperar este registro que abacei de inserir? O que preciso na verdade é retornar o valor do campo "IdRegistro" que é um campo "Autonumeração", para que eu possa indicar ao usuário o código do registro que ele acabou de incluir.Acho que o processo seria o mesmo para o SQL e Access.Fiz isto uma vez mas não me lembro como. Tinha um lance do ADO de recuperar o último registro editado, coisas deste tipo.Valeu A força!

Compartilhar este post


Link para o post
Compartilhar em outros sites

hehehe tem uma gambi também... coloca por ORDER BY DESC

Compartilhar este post


Link para o post
Compartilhar em outros sites

Perfeito;Funcionou legal, thanks.Só um comentário. No books online fala que o Id retornado não é por sessão ou coisa parecida,é por tabela. E se... nos milissegundos entre o INSERT e o SELECT algum usuário insere um registro?Será que não corre o risco de retornar um IDENTIFY diferente do registro que foi incluído pelo usuário atual?Somente um comentário pq ja esta funcionando.Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nesta caso se outro usuário, acessando o BD através de outra conexão inserir um registro antes de eu recuperar o ID do que inserí, não corre o risco de eu recuperar o ID do registro dele e não do meu?Não se se estou sabendo explicar mas o mu medo é de acontecer algo parecido com que o americo comentou sobre a "gambi" do silas.De repente da uns "piripacos" e entre a inserção e a recuperação do ID pelo SELECT @@IDENTITY outr user em outra máquina insere um registro na mesma tabela. Qual IDENTITY eu vou recuperar? O que eu inseri ou o que ele inseriu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beless;Entao ta resolvido.Como so tem um Recorset na pagina não corre o risco de retornar de outra tabela... e quanto a erros... se ocorrer um erro na inclusão a página va abortar (por não tem nenhum tratamento de erro :D )Valeu pela força.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não ocorre este perigo. Usuários diferentes, conexões diferentes, @@IDENTITY diferentes. Se ambos incluirem ao mesmo tempo, serão retornados os respectivos @@IDENTITY, sem problemas. O erro que pode ocorrer é de não retornar o @@IDENTITY (caso ocorra um erro na inclusão por exemplo) ou retornar um @@IDENTITY de outra tabela ( por exemplo: um bloco com várias inserções), mas não de outra conexão.

Discordo da opinião acima.Acho que possa ter problema sim. No mais, a forma mais fácil e prática e que servem para todos os bancos é utilizar os métodos do recordset para incluir um registro, conforme exemplifico abaixo
Set objConn = Server.CreateObject("ADODB.Connection")Set objRs = Server.CreateObject("ADODB.Recordset")objConn.Open "String de Conexão"objRs.Open "NomeDaTabela",objConn,1,3,2objRs.AddNewobjRs("Nome") = NomeobjRs("Email") = EmailObjRs.update 'Nesse ponto, o banco é atualizado e o campo IDentity já foi incrementado, portanto, agora basta pegar o valor que foi gerado pelo banco em uma variavel, conforme abaixoMeuID = objRs("CampoAutoNumerico")objRs.CloseSet objRs = NothingobjConn.CloseSet objConn = NothingResponse.write MeuID
Essa é a forma mais segura de utilizar campos auto-numéricos que eu conheço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, mas quando o banco for atualizado nesse meio tempo pode vir outro usuario e inserir novos dados!Não vai dar problema e pegar o ID errado????Só estou perguntando pois preciso ter certeza, olhando o seu código parece que vai funcionar sem o problema em questão.Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim é auto-numerico, mas é em MySql.<%Set objConn = Server.CreateObject("ADODB.Connection")Set objRs = Server.CreateObject("ADODB.Recordset")objConn.Open "Driver=MySQL ODBC 3.51 Driver; Server=local; Database=xxxxx; Uid=xxxxx; Pwd=xxxxx"objRs.Open "tabela",objConn,1,3,2objRs.AddNewobjRs("emi") = hojeobjRs("nome") = nomeobjRs("valor") = valorObjRs.update 'Nesse ponto, o banco é atualizado e o campo IDentity já foi incrementado, portanto, agora basta pegar o valor que foi gerado pelo banco em uma variavel, conforme abaixovnum = objRs("v_id")Response.Write vnum&"<br><br><br>"%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com o código abaixo funcionou, mas pergunto se não vai dar o problema de quando alguem inserir novos dados e enquanto o código estiver atualizando o usuario anterior, vai acabar pegando o Id errado?<%Set objConn = Server.CreateObject("ADODB.Connection")Set objRs = Server.CreateObject("ADODB.Recordset")objConn.Open "Driver=MySQL ODBC 3.51 Driver; Server=local; Database=xxxxx; Uid=xxxxx; Pwd=xxxxx"objRs.Open "tabela",objConn,1,3,2objRs.AddNewobjRs("emi") = hojeobjRs("nome") = nomeobjRs("valor") = valorObjRs.updateset ObjRs = objConn.execute("SELECT * FROM tabela WHERE v_id = LAST_INSERT_ID()")mostra = objRs("v_id")objRs.CloseSet objRs = NothingobjConn.CloseSet objConn = Nothing%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha ai! Continuam valendo as mesmas considerações do americo.

Não ocorre este perigo. Usuários diferentes, conexões diferentes, @@IDENTITY diferentes. Se ambos incluirem ao mesmo tempo, serão retornados os respectivos @@IDENTITY, sem problemas. O erro que pode ocorrer é de não retornar o @@IDENTITY (caso ocorra um erro na inclusão por exemplo) ou retornar um @@IDENTITY de outra tabela ( por exemplo: um bloco com várias inserções), mas não de outra conexão.

Com relação aos comentários do Marcelo Barcellos, vejam que não existe menhuma diferença entre usar uma instrução INSERT na SQL ou usar o método AddNew do objeto recordset. Porque quando usamos AddNew e em seguida chamanos o método UPDATE o que o ADO faz é executar de forma transparente a query "SELECT @@IDENTITY". Vejam o que diz a Microsoft

Thanks to this newly added functionality, you can see the newly added auto-increment values in your client-side ActiveX Data Objects (ADO) recordsets in ADO 2.1 and later. When you submit the new row to the Jet provider by calling Update or UpdateBatch (depending on your choice of LockType), the ADO cursor engine generates an INSERT INTO query to create the new row in the table. If the recordset contains an auto-increment field, ADO will also generate a SELECT @@Identity query to retrieve the value generated for that auto-increment field. Artigo Completo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu tentei fazer utilizando o LAST_INSERT_ID() e deu erro, olha aí:Microsoft JET Database Engine (0x80040E14)Função 'LAST_INSERT_ID' indefinida na expressão./curtamais/cadastroevento.asp, line 316O que tá acontecendo? Olha o código:SQL = "Insert Into CadastroEventos(dtinicio,dtfim,nomeevento,loc,valores,fone,contato,email,url,texto,obs) values('"&Strdtinicio&"','"&Strdtfim&"','"&Strnomeevento&"','"&Strloc&"','"&Strvalores&"','"&Strfone&"','"&Strcontato&"','"&Stremail&"','"&Strurl&"','"&Strtexto&"','"&Strobs&"')"Cn.Execute(SQL)Set RsCadEvento = Cn.Execute("SELECT id FROM CadastroEventos WHERE id = LAST_INSERT_ID()")

Compartilhar este post


Link para o post
Compartilhar em outros sites

E ai João Francisco beleza ?

 

É o seguinte esta usando sql server não é.... ?

 

Me manda seu insert que eu monto uma procedure para você explico como ela funciona e como você pegar todos os valores...

 

Estou indo almoçar agora assim que chegar eu monto manda ai que monto a inserção e o retorno ja e te explico como funciona beleza...

 

Abraços kara fui

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.