2017-02-22 2 views
0

Ich habe eine Insert-Anweisung über ADODB.Connection.Execute ausgeführt Einfügen in eine Tabelle auf MSSQL-Server mit einer Identitätsspalte, aber das zurückgegebene Recordset gibt nicht die ID des neu eingefügten Datensatzes zurück.Warum gibt SCOPE_IDENTITY() meine eingefügte ID nicht zurück?

Ich habe die folgenden Formen versucht, die eingefügte ID des Datensatzes zu erhalten.

INSERT INTO blah VALUES (blah); SELECT SCOPE_IDENTITY() 
INSERT INTO blah VALUES (blah); SELECT @@IDENTITY 
INSERT INTO blah OUTPUT INSERTED.ID INTO @ID VALUES(blah); SELECT ID FROM @ID 

In allen Fällen, wenn das Re-Cord Abfrage zurückgegeben es enthält nicht die Identität

var I = DB.Execute(insert_statement_from_above); 
if (I) { 
    var INSERTED_ID = I(0).Value; 
} 

Warum dies passiert sein könnte?

+1

"auto-nummer spalte", meinst du identität spalte? –

+0

danke für das Erkennen des Terminologiefehlers –

Antwort

2

Überprüfen Sie die Tabelle, die für alle INSERT-Trigger eingefügt wird, und überprüfen Sie, ob diese INSERT-Trigger SET NOCOUNT ON verwenden.

Wenn ein Trigger SET NOCOUNT ON nicht angibt, wird bei der Aktualisierung der Datenbank eine Ergebnismenge generiert. Diese Ergebnismenge wird vor der Ergebnismenge angezeigt, die das Ergebnis SCOPE_IDENTITY enthält.

Siehe: https://msdn.microsoft.com/en-us/library/ms189837.aspx

In Wirklichkeit, was ist passiert, dass der Re-Cord enthält eine oder mehr Ergebnismengen.

TRIGGER RESULT SET 
SCOPE_IDENTITY RESULT SET 

Wenn Sie das Recordset für eine Bereichsidentität abfragen, fragen Sie tatsächlich die Ergebnismenge ab, die vom Trigger ausgegeben wird.

können Sie RS.nextRecordset() verwenden und dann die SCOPE_IDENTITY abfragen, aber wenn der Auslöser ein Update durchführen kann oder nicht Sie am Ende nicht zu wissen, was Ihre SCOPE_IDENTITY Ergebnismenge enthält, ist es das erste oder das zweite, gibt es eine zweite?

Es ist allgemein gute Praxis akzeptiert für Trigger SET NOCOUNT ON jedoch angeben, wenn Sie absolut SET NOCOUNT OFF in Ihrem Trigger haben müssen oder haben keine Kontrolle über den Trigger, können Sie mit dem folgenden Code um ihn herum arbeiten.

Hinweis: Die Gültigkeitsbereichsidentität in den obigen Beispielen wird immer das letzte Ergebnis im Re-Cord-Set sein. So können wir es finden, wie folgt:

var I = DB.Execute(insert_statement_from_above); 
if (I) { 
    // find the result set with the scope identity in it 
    while (I.State == 0) { 
    I = I.nextRecordset(); 
    } 
    var INSERTED_ID = I(0).Value; 
} 

Das für die Ergebnismenge sieht, dass Ihr Anwendungsbereich Identität enthält, die durch die früheren geschlossenen Ergebnismengen zu ignorieren. Auch

Siehe:

State property, nextRecordset()

0

Wenn es in Ordnung für Sie alle Trigger von der Rückkehr der Ergebnismengen, Serveroption zu verhindern „Verbieten Ergebnisse von Trigger Rückkehr“ könnte eine Lösung für Sie sein.

sp_configure 'disallow results from triggers', 1 
GO 
RECONFIGURE 
GO 
Verwandte Themen