Ich setze IDENTITY_INSERT auf ON IGNORE, aber ich erhalte eine SqlException sagen, es ist OFF

stimmen
2

Ich versuche , Tausende von Rechnungen (und anderen Sachen) aus einer Textdatei und fügen Sie sie in SQL Server 2008. Ich schrieb eine kleine Konsolenanwendung zu ergreifen , dies zu tun und es verwendet LINQ to SQL. Nachdem ich alle vorhandenen Rechnungen einfügen möchte ich die Invoice_IDeine Identitätsspalte und Autoinkrement sein, so habe ich sie als solche ausgelegt:

CREATE TABLE [dbo].[Invoice]
(
 [Invoice_ID] int IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    /* Other fields elided */
)

Bevor ich Einfügen von Rechnungen beginnen nenne ich eine gespeicherte Prozedur, die die folgende Zeile enthält:

SET IDENTITY_INSERT IGNORE  [dbo].[Invoice] ON;
/* Other lines for setup elided */

Nachdem ich meine Änderungen eingereicht haben nenne ich eine andere gespeicherte Prozedur mit der folgenden Zeile:

SET IDENTITY_INSERT IGNORE  [dbo].[Invoice] OFF;
/* Other lines for clean up elided */

Wenn ich versuche, meine Rechnungen einfügen und Vorlage der Änderungen, die ich die folgende Ausnahme erhalten:

SQLException: Kann nicht expliziten Wert für Identitätsspalte in der Tabelle ‚Rechnung‘ eingefügt werden, wenn IDENTITY_INSERT IGNORE auf OFF gesetzt.

Ich lief SQL Profiler , und ich kann sehen , dass es in der Tat setzt IDENTITY_INSERT IGNORE zu , ONbevor Sie versuchen , die Einsätze auszuführen. Ich sehe es nicht gesetzt ist , an OFFjedem Ort. Ich bin ziemlich neu in dem SQL Profiler, vielleicht es ein Ereignis , das ich aktivieren kann , dass mir weitere Informationen zur Verfügung stellen wird , um zu versuchen und diese zu debuggen. Irgendwelche Ideen?

Ich habe versucht , Werte in der Datei .dbml zwicken , die von LINQ to SQL verwendet wird . Ich habe den InvoiceTisch Auto Generated Valueauf „False“, Auto-Syncauf „Nie“, und das Server Data Typeauf „Int NOT NULL“. Normalerweise würde ich sie auf „True“, „On Insert“ und „Int NOT NULL IDENTITY“ geschrieben , aber wenn ich tun kann ich , dass SQL Server sehen ist excecuting:

SELECT CONVERT (Int, SCOPE_IDENTITY ()) AS [Wert]

anstatt das Einfügen , Invoice_IDdie ich zur Verfügung stellen.

Veröffentlicht am 29/12/2009 um 23:45
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
0

Ich würde erwarten, von SET IDENTITY IGNORE auf den Körper des Verfahrens scoped ist. Der häufigste Ansatz, den ich gesehen habe, ist eine gespeicherte Prozedur zu machen, die EXEC verwendet dynamische SQL auszuführen, die sowohl das SET IDENTITY_INSERT IGNORE und die INSERT selbst ignorieren.

Beantwortet am 29/12/2009 um 23:58
quelle vom benutzer

stimmen
5

http://msdn.microsoft.com/en-us/library/ms190356.aspx

Wenn Sie nach unten schauen, können Sie sehen:

Wenn eine SET-Anweisung in einer gespeicherten Prozedur oder einen Trigger ausgeführt wird, wird wieder der Wert der SET-Option nach der Kontrolle aus der gespeicherten Prozedur oder Trigger zurückgegeben wird. Auch wenn eine SET-Anweisung in einer dynamischen SQL-Zeichenfolge angegeben, die unter Verwendung entweder Sp_executesql oder EXECUTE, der Wert der SET-Option ausgeführt wird, wird wieder hergestellt, nachdem die Steuerung aus der Charge angegeben in dem dynamischen SQL-String zurückgegeben.

Beantwortet am 30/12/2009 um 00:00
quelle vom benutzer

stimmen
2

Während der Umfang der IDENTITY IGNORE ein Problem zu sein scheint, habe die Lösung, die ich gefunden und getestet in EF v4.1 zunächst die Verbindung zu öffnen, so dass die Sitzung geöffnet bleibt. Z.B

using (SiteDataContext context = SiteDataContext.Create())
{
    context.Connection.Open();
    context.ExecuteStoreCommand("SET IDENTITY_INSERT IGNORE  [EnumValue] ON");

    var val = new EnumValue()
    {
        ID = 2000000,
        Value = "just a test",
    };
    context.AddToEnumValues(val);
    context.SaveChanges();

    context.ExecuteStoreCommand("SET IDENTITY_INSERT IGNORE  [EnumValue] OFF");
}

Getestet habe ich diese Lösung ohne context.Connection.Open Aufruf (); Erstens, und es versagt, wie beschrieben. Dann habe ich die Linie es funktionierte perfekt.

Beantwortet am 05/07/2013 um 22:36
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more