28

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

私は使用してみました:

SET IDENTITY_INSERT orders ON;

これは、SqlServer Management Studio にいるときに機能します。正常に実行できます

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

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

dsOrders.Insert(oldorderId, ...);

プロセス中にもSQL(SET IDENTITY_INSERT orders ON)を実行しました。一度に 1 つのテーブルに対してしかこれを行うことができないことを知っています。

私はこの例外を受け取り続けます:

注文テーブルに値を挿入しようとしたときの例外 System.Data.SqlClient.SqlException: IDENTITY_INSERT が OFF に設定されている場合、テーブル 'orders' の ID 列に明示的な値を挿入できません。

何か案は?

アップデート

AlexS と AlexKuznetsov は、Set Identity_Insert は接続レベルの設定であると述べていますが、SqlProfiler で SQL を見ると、いくつかのコマンドがあることに気付きます。

  • 初め -SET IDENTITY_INSERT DEAL ON
  • 2番 -exec sp_reset_connection
  • 3 番目から n - select と insert を含むさまざまな SQL コマンド

コマンドの間には常に がありexec sp_reset_connectionますが、これが Identity_Insert 設定の値の損失の原因であると考えています。

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

4

6 に答える 6

56

オプションが混同されています:

SET IDENTITY_INSERT orders ON

IDENTITY 列を持つテーブルに (指定した) 特定の値を挿入する機能をオンにします。

SET IDENTITY_INSERT orders OFF

その動作を再度オフにすると、通常の動作 (自動生成されるため IDENTITY 列の値を指定することはできません) が復元されます。

マルク

于 2009-08-05T18:04:29.610 に答える
5

ID 列に挿入できるようにするには、 SET IDENTITY_INSERT ONを実行します。

少し逆のように見えますが、それが機能する方法です。

于 2009-08-05T18:04:51.637 に答える
3

あなたはすべて正しいことをしているようです: SET IDENTITY_INSERT orders ON はSQL Server 側の正しい方法です。しかし問題は、データセットを使用していることです。あなたが提供したコードから、データベースに基づいて Visual Studio で生成された型指定されたデータセットを使用していると言えます。

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

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

于 2009-08-05T19:23:35.643 に答える
1

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

于 2009-08-05T19:44:55.943 に答える
1

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

Ryan Whitaker のTableAdapterHelperコードを使用しました

そして、Identity_Insert を実行する tableadapter に更新コマンドを作成しました。次に、Identity 列を指定して新しい Insert コマンドを作成する必要がありました。次に、このコードを実行しました

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();
 }
于 2009-09-01T18:59:28.570 に答える
0

"insert_identity" にまだ問題がある場合は、次のような完全な挿入ステートメントを使用してみてください。

User(Id, Name) 値に挿入 (1,'jeff')

于 2014-10-22T15:08:39.070 に答える