PetaPoco-Einfügung schlägt in Tabelle mit Trigger fehl

8

Wir verwenden PetaPoco als unser Datenzugriffstool für eine SQL 2008-Datenbank. Wir haben ein Problem beim Versuch, eine Zeile in eine Tabelle einzufügen / zu aktualisieren, an die ein Trigger angehängt ist.

Wir verwenden PetaPocos db.Save (Objekt);

Der angezeigte Fehler ist: Die Zieltabelle 'the_table_with_a_trigger' der DML-Anweisung kann keine aktivierten Trigger haben, wenn die Anweisung eine OUTPUT-Klausel ohne INTO-Klausel enthält.

Wie können wir mit PetaPoco Daten zu einer Tabelle mit einem Trigger einfügen / aktualisieren?

    
Pete Lunenfeld 04.12.2013, 00:49
quelle

4 Antworten

6

Dank @Eduardo Molteni hast du mich auf den richtigen Weg gebracht, um das zu lösen. Anscheinend ist in SQL Server 2008 R2 bekannt, dass der OUTPUT-Befehl in einer Einfügung fehlschlägt, wenn die Tabelle einen Trigger aufweist. PetaPoco fügt die OUTPUT-Klausel jedoch automatisch in den Befehlstext jeder Einfügung ein, für die die Tabelle AutoIncrement = true hat.

Die Lösung für mich (für SQL Server 2008 R2) ist die folgende:

1) Rufen Sie die PetaPoco.DatabaseTypes.SqlServerDatabaseType.GetInsertOutputClause-Funktion

auf

entfernen (kommentieren) \return String.Format(" OUTPUT INSERTED.[{0}]", primaryKeyName);

Dies entfernt das "OUTPUT" aus der SQL-Anweisung insert. Jetzt wird die Einfügung auf einem Tisch mit einem Auslöser geschehen. PetaPoco hat jedoch keine Möglichkeit, den neuen Primärschlüssel (Identität) aus der neu eingefügten Zeile abzurufen.

2) Gehen Sie zur Funktion PetaPoco.Database.Insert. Direkt über der Linie:

%Vor%

füge eine neue Zeile hinzu, so dass es so aussieht:

%Vor%

Die neue Zeile (die in PetaPoco vorhanden war, aber nicht verwendet wurde) ermöglicht es der INSERT-Anweisung, die Identität abzurufen.

    
Pete Lunenfeld 05.12.2014, 15:50
quelle
2

Ich denke cmd.CommandText += ";\nSELECT SCOPE_IDENTITY() AS NewID;"; wäre besser. @@ IDENTITY kann Ihnen eine ID geben, die im Trigger generiert wird, nicht Ihre Aussage.

    
Brian Chance 05.12.2014 22:52
quelle
1

PetaPoco erstellt nur einen OUTPUT-Parameter in Oracle DBs, um die neue AutoIncrement ID zu erhalten.

Im Fall von Sql Server, wenn Sie Ihre Frage markiert haben, fügt sie nur SELECT SCOPE_IDENTITY() AS NewID hinzu, wenn die Tabelle eine AutoIncrement ID hat.

Relevanter Code in PetaPoco.cs:

%Vor%

Versuchen Sie, die AutoIncrement-ID auszuschalten und manuell einzurichten, um zu sehen, ob das Problem behoben ist

    
Eduardo Molteni 04.12.2013 14:35
quelle
1

Weil ich mir sicher bin, dass ich nicht die letzte Person sein werde, der dies begegnet ...

Ich habe PetaPoco für ein neues Projekt übernommen, aber ich stieß auf ein ähnliches Problem, aber die Rückkehr zu scope_identity () würde nicht funktionieren. Also ich:

1) Erweitert die IProvider-Schnittstelle.

%Vor%

2) Zu DatabaseProvider.cs hinzugefügt:

%Vor%

3) Dann SqlServerDatabaseProvider, einschließlich der Änderung der bestehenden OUTPUT-Klausel:

%Vor%

4) Schließlich wurden diese in Database.cs integriert:

%Vor%

Dies ändert den Befehl zur Verwendung einer benannten TABLE-Variablen, DECLAREd in der 'Präambel', gefüllt mit der OUTPUT-Klausel und SELECTed im 'PostScript'.

    
pricerc 27.09.2016 03:06
quelle

Tags und Links