Möchten Sie die von der Einfügung zurückgegebene Identität in der nachfolgenden Einfügung in einer Transaktion verwenden

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

  •  29-10-2019
  •  | 
  •  

Frage

Ich verwende Rob Conerys Massive für den Datenbankzugriff.Ich möchte eine Transaktion um ein paar Einfügungen wickeln, aber die zweite Einfügung verwendet die Identität, die von der ersten Einfügung zurückgegeben wurde.Mir ist nicht klar, wie ich das bei einer Transaktion machen soll.Wir würden uns über Unterstützung freuen.

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
            }),
    };

War es hilfreich?

Lösung

Können Sie es einfach in einem gespeicherten Prozess tun?Sie können scope_identity oder besser noch die Ausgabeklausel verwenden, um die benötigten Werte abzurufen.Alle Einfügungen in alle Tabellen befinden sich in einer Transaktion, die zurückgesetzt werden kann, wenn eine davon fehlschlägt.

Andere Tipps

Stellen Sie eine Abfrage zwischen diesen beiden Einfügungen. Diese Methode von Massive kann hilfreich sein:

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

Ihr SQL lautet="select scope_identity ()"

UPDATE 26.02.2013

Wenn Sie sich den Massive-Code noch einmal ansehen, gibt es keine zuverlässige Möglichkeit, die zuletzt eingefügte ID abzurufen.

Der obige Code funktioniert nur, wenn die Verbindung "select scope_identity ()" zusammengefasst wird.(Es muss dieselbe Verbindung sein, die das Einfügen vorgenommen hat.)

Die massive table.Insert(..)-Methode gibt Dynamic zurück, das ein ID-Feld enthält, das mit "SELECT @@ IDENTITY" gefüllt ist.Es erhält die zuletzt eingefügte ID aus dem globalen Bereich, was ein offensichtlicher Fehler ist (offensichtlich in Multithreading-Szenarien).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top