1 message in com.mysql.lists.mysql-eslast_insert_id(), asp, oledb
FromSent OnAttachments
"Juan F. Capristán W."02 Jun 2003 04:37 
Subject:last_insert_id(), asp, oledb
From:"Juan F. Capristán W." (ju@editmaker.com)
Date:06/02/2003 04:37:51 AM
List:com.mysql.lists.mysql-es

Hola a todos, me acabo de suscribir a esta lista para intentar solucionar un problema que tengo desde hace más o menos una semana. Estoy migrando una aplicación web de Access a MySQL. La aplicación corre bajo ASP en un servidor IIS 5.1 con Windows XP Profesional. El problema que tengo lo genera la llamada a la función de MySQL "last_insert_id()", que devuelve siempre 0, y el problema no es que cierre y abra otra conexión entre la inserción y la llamada a la función. Para la conexión a la base de datos uso ADO y OLEDB (MyOLEDB 3.0.0.0). Un poco de código de ejemplo:

Supongamos la tabla trivial: cliente(id,nombre) con id autonumérico y nombre varchar(30)

Al hacer: Set con=Server.CreateObject("ADODB.Connection") con.Open "Provider=MySQLProv;Data Source=ejemplo;User Id=usuario;Password=prueba;" con.Execute ("insert into cliente values(null,'juan');") response.write("Último ID insertado : " & con.Execute("select last_insert_id() as U;")("U")) con.close

¿Cuál es el problema con este código?, last_insert_id() ¡SIEMPRE! devuelve 0. Al hacer las mismas consultas en la línea de comandos de mysql sí se obtiene el resultado correcto. Es como si la conexión se cerrara y se volviera a abrir, pero en el código se ve que no es así... ¿qué pasa? ¿alguien ha tenido este mismo problema alguna vez?. He mandado un e-mail al proveedor de MyOLEDB, pero han pasado 5 días y no ha respondido, he buscado documentación en mysql.com en microsoft.com, etc., y nada. También he consultado en múltiples foros y en algunos he encontrado un par de referencias a un problema parecido, pero la solución que dan, a mí no me funciona. Ésta solución pasa por ejecutar la consulta desde un objeto Recordset en vez de hacerlo desde el objeto Connection, pero como digo, yo obtengo el mismo resultado. He buscado la manera de meter más de una consulta (separándolas con ";") en los objetos Connection y Recordset, pero en ambos casos se obtiene error. Agradecería algo de ayuda porque estoy bloqueado.

P.D.: La sugerencia de usar la función MAX() para obtener el último id insertado no me vale porque al ser una aplicación multiusuario, puede ocurrir: - insert del usuario 1 -insert del usuario 2 - max del usuario 1 - max del usuario 2 De modo que en max de usuario 1 se obtendría el mismo valor que en max de usuario 2. Podría intentar garantizar la secuencia correcta usando LOCK TABLES y UNLOCK TABLES, pero prefiero intentar solucionarlo sin tener que bloquear las tablas porque eso supondría serializar (disminuyendo el rendimiento) bastantes puntos que no tienen por qué funcionar así.

Saludos y gracias de antemano.

Juan Capristán.