2017-07-06 9 views
3
System.Data.SqlClient.SqlException occurred HResult=0x80131904 Message=Cannot insert explicit value for identity column in table 'DriversDetailsTable' when IDENTITY_INSERT is set to OFF. Source=.Net SqlClient Data Provider StackTrace: <Cannot evaluate the exception stack trace> 

なぜか必ず、私は自分のコードを実行すると、上記のエラーを取得しないでください。SQL Insertコマンド投げエラー

SqlConnection conn = new SqlConnection(@"Data Source = ComputerName\SQLEXPRESS;Initial Catalog = Drivers;Trusted_Connection=True;"); 
     conn.Open(); 

     SqlDataAdapter adapter = new SqlDataAdapter(); 

     SqlCommand command = new SqlCommand([email protected]"INSERT INTO DriversDetailsTable (name, Id, DateJoined) VALUES ('Driver4', 1, '2017-07-06')", conn); 
     command.ExecuteNonQuery(); 

     conn.Close(); 
+0

SQLが問題です。あなたは自動でインクリメントされることを意図している冒頭に4列目がありますか? –

答えて

3

ええ、それはあなたのId列がIDENTITY列です原因ですので、あなたは以下のようなあなたのINSERT声明の中で、それを省略する必要があります。ここに私のコードです。のC#6構文の理由が表示されない:それはIDENTITY列ですので、あなたはとにかく

INSERT INTO DriversDetailsTable (name, DateJoined) VALUES ('Driver4', '2017-07-06') 

ミニノートをやってみたかったとは思わないOFFからIDENTITY_INSERTを設定しない限り、あなたは明示的に値を挿入することはできません文字列補間[email protected]"INSERTハードコード/静的値を使用する場合

2

おそらくIdIDENTITYの列です。そのように、あなたはIdの列にINSERTに試みるべきではありません - INSERTの文からそれを省略すると、データベースは、それが割り当てられてしまったものを数あなたを教えてみましょう:

SqlCommand command = new SqlCommand([email protected]" 
INSERT INTO DriversDetailsTable (name, DateJoined) VALUES ('Driver4', '2017-07-06'); 
SELECT SCOPE_IDENTITY();", conn); 

と値を取得するためにExecuteScalar()を使用しますバック:

int id = (id)(decimal)command.ExecuteScalar(); 

(キャストの説明についてはWhy does select SCOPE_IDENTITY() return a decimal instead of an integer?を参照)

その他のオプション:

  • あなたが特定の値(ほとんどの場合、推奨されません)を必要とする場合には、この操作中にIDENTITY
  • 一時的に無効にアイデンティティ挿入できない作る
0

次のことができるようにしたい場合あなたはそのようONIDENTITY_INSERTを設定する必要があるいくつかの理由でIDを挿入します。

Set Identity_Insert DriverDetailsTable ON; 

これだけでは、特定のコマンドリットルのために行うことができますように:

SqlCommand command = new SqlCommand([email protected]" 
Set Identity_Insert DriverDetailsTable ON; 
INSERT INTO DriversDetailsTable (name, Id, DateJoined) VALUES ('Driver4', 1, '2017-07-06'); 
Set Identity_Insert DriverDetailsTable OFF;", conn);