2017-07-06 41 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聲明如下圖所示。因爲它是一個IDENTITY列,除非您設置IDENTITY_INSERTOFF不覺得你想反正你不能明確地插入值,它

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

旁註:沒有看到的C#語法6的理由字符串插值[email protected]"INSERT當您使用硬編碼/靜態值時

2

推測IdIDENTITY列。因此,你不應該試圖INSERTId列 - 從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

如果你想能插入ID爲某種原因,你需要設置IDENTITY_INSERTON像這樣:

Set Identity_Insert DriverDetailsTable ON; 

這可剛做特定命令升ike so:

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);