2

テキスト ファイルから何千もの請求書 (およびその他のもの) を取得して、それらを SQL Server 2008 に挿入しようとしています。これを行うための小さなコンソール アプリを作成し、LINQ to SQL を使用します。既存のすべての請求書を挿入した後Invoice_ID、ID 列と自動インクリメントにしたいので、次のように設計しました。

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

請求書の挿入を開始する前に、次の行を含むストアド プロシージャを呼び出します。

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

変更を送信した後、次の行で別のストアド プロシージャを呼び出します。

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

請求書を挿入して変更を送信しようとすると、次の例外が発生します。

SQLException: IDENTITY_INSERT が OFF に設定されている場合、テーブル 'Invoice' の ID 列に明示的な値を挿入できません。

SQL プロファイラーを実行したところ、挿入を実行しようとする前に実際に設定IDENTITY_INSERTされていることがわかります。どこONにも設定されていません。OFF私は SQL プロファイラーにかなり慣れていないので、これを試してデバッグするための詳細情報を提供してくれる、有効にできるイベントがあるかもしれません。何か案は?

LINQ to SQL で使用される .dbml ファイルの値を微調整してみました。InvoiceテーブルをAuto Generated Value「False」にAuto-Sync設定し、「Never」にServer Data Type設定し、「Int NOT NULL」に設定しました。通常は、それぞれ「True」、「On Insert」、および「Int NOT NULL IDENTITY」に設定しますが、そうすると、SQL Server が実行されていることがわかります。

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

Invoice_ID私が提供するを挿入するのではなく。

4

3 に答える 3

5

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

下を見ると、次のことがわかります。

SET ステートメントがストアド プロシージャまたはトリガーで実行される場合、SET オプションの値は、ストアド プロシージャまたはトリガーから制御が返された後に復元されます。また、sp_executesql または EXECUTE のいずれかを使用して実行される動的 SQL 文字列で SET ステートメントが指定されている場合、SET オプションの値は、動的 SQL 文字列で指定されたバッチから制御が返された後に復元されます。

于 2009-12-30T01:00:46.850 に答える
2

IDENTITY_INSERT のスコープが問題のようですが、私が見つけて EF v4.1 でテストした解決策は、最初に接続を開いてセッションを開いたままにすることです。例えば

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

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

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

context.Connection.Open(); を呼び出さずにこのソリューションをテストしました。最初に、説明どおりに失敗しました。次に、完全に機能する行を追加しました。

于 2013-07-05T23:36:54.160 に答える
0

SET IDENTITY_INSERT のスコープはプロシージャの本体にあると思います。私が見た最も一般的なアプローチは、EXEC を使用して、SET IDENTITY_INSERT と INSERT 自体の両方を含む動的 SQL を実行するストアド プロシージャを作成することです。

于 2009-12-30T00:58:59.613 に答える