Desidera utilizzare l'identità restituita dall'inserimento nell'inserimento successivo in una transazione

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

  •  29-10-2019
  •  | 
  •  

Domanda

Sto utilizzando Massive di Rob Conery per l'accesso al database.Voglio avvolgere una transazione attorno a un paio di inserimenti, ma il secondo inserto utilizza l'identità restituita dal primo inserto.Non è ovvio per me come farlo in una transazione.Un po 'di assistenza sarebbe apprezzata.

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
            }),
    };
È stato utile?

Soluzione

Puoi farlo semplicemente in un processo memorizzato?Puoi usare scope_identity o meglio ancora la clausola output per ottenere i valori di cui hai bisogno.E tutti gli inserimenti di tutte le tabelle sono in un'unica transazione che può essere annullata se qualcuno di essi fallisce.

Altri suggerimenti

Fai una query tra questi due inserti, questo metodo di Massive può essere utile:

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

Il tuo sql sarà="select scope_identity ()"

AGGIORNAMENTO 26/02/2013

Osservando nuovamente il codice Massive non esiste un modo affidabile per recuperare l'ultimo ID inserito.

Il codice sopra funzionerà solo quando viene raggruppata la connessione che fa "select scope_identity ()".(Deve essere la stessa connessione che ha effettuato l'inserimento).

Il metodo table.Insert(..) massiccio restituisce Dynamic che contiene il campo ID, che viene riempito con "SELECT @@ IDENTITY".Ottiene l'ultimo ID inserito dall'ambito globale, il che è un bug evidente (evidente negli scenari di multithreading).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top