2009-08-05 4 views
22

データセットを使用して、古いデータベースから変換されるデータを挿入しています。要件は、現在のOrder_ID番号を維持することです。データセット用のIDENTITY_INSERTを無効にする

私が使用して試した

SET IDENTITY_INSERT orders ON; 

これは私がのSQLServer Management Studioでいる時、私は成功し

INSERT INTO orders (order_Id, ...) VALUES (1, ...); 

しかし、それは私がそれを行うことはできませんすることができています動作します私の変換スクリプトで使用しているデータセット挿入を介して。これは基本的に次のように見えます。

dsOrders.Insert(oldorderId, ...); 

私はこの処理中にSQL(SET IDENTITY_INSERTオーダー)を実行しました。私は一度に一つのテーブルに対してしかこれを行うことができないと私は知っています。ときIDENTITY_INSERTをテーブルにID列に明示的な値を挿入することはできません「受注」:受注テーブルに値を挿入 System.Data.SqlClient.SqlExceptionしようとして

例外:

私はこの例外を得続けますOFFに設定されています。

私はのSQLProfilerでSQLを見たときに

更新

AlexS & AlexKuznetsovは、セットIDENTITY_INSERTしかし、接続レベルの設定であることを言及している、私はいくつかのコマンドを気づきます。

  • まず - SET IDENTITY_INSERT DEAL ON
  • セカンド - nまでのexec sp_reset_connection
  • サード - 選択&挿入の

など、私の様々なSQLコマンドのコマンドの間exec sp_reset_connectionしかし、私はこのことを信じているが常にありますIdentity_Insert設定の値の喪失に責任があります。

データセットの接続リセットを停止する方法はありますか?

答えて

49

あなたは混同のオプションがあります。

SET IDENTITY_INSERT orders ON 

は ON IDENTITYカラムを持つテーブルに(あなたが指定していることを)特定の値を挿入する機能ををオンにします。

SET IDENTITY_INSERT orders OFF 

は再びその動作をオフにし、正常な動作は、(彼らは自動生成されているので、あなたはIDENTITY列の値を指定することはできません)復活しています。

マルク・

+0

は笑、私はあなたが私はオプションが混ざっていたことが正しかったが、私はそれらを変更したときに、それは私の問題が解決しなかった – Jupaol

5

はあなたがID列に挿入できるようにするために ON SET IDENTITY_INSERT をしたいです。

これは少し後ろのようですが、それが動作する方法です。 SETのIDENTITY_INSERT注文ON SQL Serverの側の正しい方法は次のとおりです。

+0

同じ愚かなミスをしていました。他のアイデア? –

3

あなたが右のすべてをやっているようです。しかし問題は、あなたがデータセットを使用していることです。あなたが提供したコードから、型付きデータセットを使用していると言えるでしょう - データベースに基づいてVisual Studioで生成されたものです。

これは場合(ほとんどの場合)、その後このデータセットは、それが明示的な値を指定することはできませんコードではなく、SQL Serverのつまりあなたは、受注コード]フィールドの値を設定することができていない制約が含まれている場合は。データセットデザイナーに行き、orderIdフィールドのプロパティを編集する必要があります:AutoIncrementとReadOnlyをfalseに設定します。しかし、同じ変更を実行時に実行することもできます。これにより、orderIdの明示的な値を持つ行をデータセットに追加し、後でSQL Serverテーブルに保存できます(SET IDENTITY_INSERTが必要です)。

また、IDENTITY_INSERTは接続レベルの設定であるため、データベースに変更を保存するときに使用する同じ接続に対して、対応するSETを確実に実行する必要があります。

1

プロファイラを使用して、SET IDENTITY_INSERTがオンになっているかどうかを判断します。 は、挿入時に実行される正確なSQLと同様に、後続の挿入と同じ接続から発行されます。

1

AlexSが正しいです、問題はInsert_Identityが機能していましたが、接続レベルの設定なので、トランザクション内でInsert_Identityを設定する必要がありました。

私はライアン・ウィテカーのTableAdapterHelperコード

を使用して、私は、IDENTITY_INSERTを走った私のTableAdapterの上updateコマンドを作成しました。私は指定されたID列で新しいInsertコマンドを作成しなければなりませんでした。私は、あなたのよう完全なINSERT文を使用しようとすることができ、あなたはまだ「insert_identity」に問題がある場合には、このコード

SqlTransaction transaction = null; 

try 
{ 
    using (myTableAdapter myAdapter = new myTableAdapter()) 
    { 
     transaction = TableAdapterHelper.BeginTransaction(myAdapter); 
     myAdapter.SetIdentityInsert(); 
     myAdapter.Insert(myPK,myColumn1,myColumn2,...); 
    } 

    transaction.Commit(); 
} 
catch(Exception ex) 
{ 
    transaction.Rollback(); 
} 
finally 
{ 
    transaction.Dispose(); 
} 
0

を実行しました:ユーザーに

挿入(ID、名前)の値(1、「ジェフ」)

関連する問題