framework - Cómo obtener la ID de la última entrada creada desde la base de datos SQL con Asp.Net
transaction c# entity framework (4)
Inmediatamente después de ejecutar la instrucción de inserción en la primera tabla, debe consultar @@ IDENTIDAD haciendo "SELECCIONAR @@ identidad". Eso recuperará la última identificación autogenerada ... y luego simplemente lo inserta en la segunda tabla.
Si está utilizando activadores o algo que inserta filas ... esto puede no funcionar. Use Scope_Identity () en lugar de @@ IDENTITY
Explicaré el problema con un ejemplo:
Hay dos tablas en mi base de datos, nombradas entrada, etiquetas
Hay una columna llamada ID_ENTRY en ambas tablas. Cuando agrego un registro a la tabla, entrada, tengo que tomar ID_ENTRY del último registro agregado y agregarlo a la tabla, etiquetas. ¿Cómo puedo hacerlo?
La única forma de hacerlo es con múltiples declaraciones. Usando sql dinámico puede hacer esto separando cada instrucción en su cadena de consulta con un punto y coma:
"DECLARE @ID int;INSERT INTO [Entry] (...) VALUES ...; SELECT @ID = scope_identity();INSERT INTO [TAGS] (ID_ENTRY) VALUES (@ID);"
Asegúrate de poner esto en una transacción para protegerte contra problemas de simultaneidad y mantener todo atómico. También puede dividirlo en dos consultas separadas para devolver el nuevo valor de ID en el medio si lo desea; solo asegúrese de que ambas consultas estén en la misma transacción.
Además: está utilizando consultas parametrizadas con su sql dinámico, ¿verdad? Si no lo eres, personalmente iré allí y te daré 10.000 bofetadas con fideos mojados hasta que te arrepientas de tu inseguridad.
Probablemente haga esto con un disparador INSERTAR en la tabla de entrada nombrada, si tiene todos los datos que necesita para acceder a la tabla de etiquetas disponible. De lo contrario, quizás desee considerar usar un procedimiento almacenado que cree ambos dentro de una transacción.
Si desea hacerlo en código, deberá ser más específico sobre cómo administra sus datos. ¿Estás usando DataAdapter, DataTables, LINQ, NHibernate, ...? Esencialmente, debe envolver ambas inserciones dentro de una transacción de algún tipo para que cualquiera de las inserciones se ejecute o ninguna de las dos opciones, pero los medios para hacerlo dependen de la tecnología que esté utilizando para interactuar con la base de datos.
Si usa sql dinámico, ¿por qué no utilizar Linq para Entity Framework, ahora EF es la tecnología de acceso a datos recomendada de Microsoft (consulte esta publicación Clarificación del mensaje en L2S Futures del blog de equipo ADO.NET), y si lo hace inserte con EF la última identificación de identidad estará disponible automáticamente, la uso todo el tiempo, es fácil.
¡Espero que esto ayude!
Rayo.