Möchten Sie die von der Einfügung zurückgegebene Identität in der nachfolgenden Einfügung in einer Transaktion verwenden
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
}),
};
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).