Desea utilizar la identidad devuelta del inserto en el inserto posterior en una transacción

StackOverflow https://stackoverflow.com/questions/5411697

  •  29-10-2019
  •  | 
  •  

Pregunta

Estoy usando Massive de Rob Conery para el acceso a la base de datos.Quiero envolver una transacción alrededor de un par de inserciones, pero la segunda inserción usa la identidad devuelta por la primera inserción.No me resulta obvio cómo hacer esto en una transacción.Agradeceríamos un poco de ayuda.

var commandList = new List<DbCommand>
    {
        contactTbl.CreateInsertCommand(new
            {
                newContact.Name,
                newContact.Contact,
                newContact.Phone,
                newContact.ForceChargeThreshold,
                newContact.MeterReadingMethodId,
                LastModifiedBy = userId,
                LastModifiedDate = modifiedDate,
            }),
        branchContactTbl.CreateInsertCommand(new
            {
                newContact.BranchId,
                ContactId = ????, <-- how to set Id as identity from previous command
            }),
    };
¿Fue útil?

Solución

¿Puedes hacerlo en un proceso almacenado?Puede usar scope_identity o mejor aún, la cláusula de salida para obtener los valores que necesita.Y todas las inserciones de todas las tablas están en una transacción que se puede revertir si alguna de ellas falla.

Otros consejos

Haga una consulta entre esas dos inserciones, este método de Massive puede ser útil:

public object Scalar(string sql, params object[] args) {
    object result = null;
    using (var conn = OpenConnection()) {
        result = CreateCommand(sql, conn, args).ExecuteScalar();
    }
    return result;
} 

Su sql será="seleccione scope_identity ()"

ACTUALIZACIÓN 26/02/2013

Mirando nuevamente el código Massive, no hay una forma confiable de recuperar el último ID insertado.

El código anterior solo funcionará cuando se agrupe la conexión que hace que "seleccionar alcance_identidad ()".(Debe ser la misma conexión que hizo la inserción).

El método table.Insert(..) masivo devuelve Dynamic que contiene el campo ID, que se rellena con "SELECT @@ IDENTITY".Obtiene el último ID insertado del alcance global, que es un error obvio (aparente en escenarios de subprocesos múltiples).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top