2011-03-03 63 views
1

是否有人知道此錯誤爲何 (表'HD_AANVRAAG_FASE'中標識列的顯式值可以僅在使用列列表且IDENTITY_INSERT爲ON時指定僅當使用列列表且IDENTITY_INSERT爲ON時,才能指定表'ID'中標識列的顯式值。

說明:在執行當前Web請求期間發生未處理的異常請查看堆棧跟蹤以獲取有關錯誤的更多信息以及源自代碼

異常詳細信息:System.Data.SqlClient.SqlException:表'HD_AANVRAAG_FASE'中標識列的顯式值可以在當使用列列表並且IDENTITY_INSERT爲ON時,將被指定。)是否意味着? 任何幫助表示讚賞。

private void Insert2() 
    { 
     SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["HELPDESK_OUTLOOKConnectionString3"].ToString()); 

     conn.Open(); 
     SqlCommand dCmd2 = new SqlCommand(
      "INSERT INTO HD_AANVRAAG_FASE VALUES (@fase_id, @aanvraag_id, @status_id, " 
       + "@werknemer_id, @fase_datum) SET IDENTITY_INSERT HD_AANVRAAG_FASE OFF ", 
      conn); 



     dCmd2.Parameters.AddWithValue("@fase_id", 1); 
     dCmd2.Parameters.AddWithValue("@aanvraag_id", 2622); 
     dCmd2.Parameters.AddWithValue("@status_id", 15); 
     dCmd2.Parameters.AddWithValue("@werknemer_id", 165); 
     dCmd2.Parameters.AddWithValue("@fase_datum", "12-12-2001"); 
     dCmd2.ExecuteNonQuery(); 
     conn.Close(); 
    } 
+0

HD_AANVRAAG表的主鍵是什麼? aanvraag_id?這是一個身份專欄? – Pleun 2011-03-03 14:54:23

+0

否,HD_AANVRAAG_FASE的主鍵是fase_id。我怎麼知道它是否是一個身份專欄,那是什麼? – SamekaTV 2011-03-03 15:00:37

+1

如果你有一個標識列,那麼你不應該在應用程序中開啓和關閉identity_insert!這是自動生成號碼的原因。讓數據庫執行正常工作或從桌子上取得標識並創建您自己的ID(通常不好的想法,因爲如果您犯了錯誤,您可能非常糟糕地破壞數據完整性)。臨時關閉身份的能力只適用於偶爾的數據遷移,通常不是通過應用程序完成的。 – HLGEM 2011-03-03 15:35:36

回答

3

既然你沒有指定明確的專欄中,我假定@fase_id被傳遞到IDENTITY列,它的錯誤指示你不能這樣做,除非你通過IDENTITY_INSERT強迫它。

通常,你讓數據庫生成這個;請指定INSERT中的列省略標識列(並且不要嘗試分配值)。在INSERT之後,您的新身份證號碼爲SCOPE_IDENTITY()

+0

我不明白你在說什麼? :s:s – SamekaTV 2011-03-03 14:58:01

+1

標識列是具有**生成的**值的列。這聽起來像你正試圖推動價值觀。這不是你通常如何使用身份專欄... – 2011-03-03 15:00:02

+0

謝謝,這對我來說很清楚。 – SamekaTV 2011-03-04 07:30:15

1

你缺少

SET IDENTITY_INSERT HD_AANVRAAG_FASE ON 

運行您的插入之前。這是錯誤的確切原因。也就是說,顯式插入標識值是很少見的 - 例如,僅在將數據從一個表複製到另一個表時,或者使用顯式ID初始化新表時才使用。通常,您只需要忽略INSERT中的身份值,這也可以避免錯誤。

+0

所以我必須關閉它(這甚至是更糟糕的問題),因爲我可以覆蓋數據! – SamekaTV 2011-03-04 07:32:37

3

你的代碼中包含

SET IDENTITY_INSERT HD_AANVRAAG_FASE OFF

,但不是在一開始相應

SET IDENTITY_INSERT HD_AANVRAAG_FASE ON

爲什麼你明確地插入這些什麼辦法?這是同步任務嗎?

+0

我沒有看到它在我的代碼中提及的地方! – SamekaTV 2011-03-03 15:01:57

+0

@Massimo - SET IDENTITY_INSERT HD_AANVRAAG_FASE ON **在您的代碼中不是**,這是問題所在。如果您有**實際需要**來插入顯式值或完全刪除嘗試插入到'HD_AANVRAAG_FASE'以獲取自動生成的'身份'值,則將其設置爲開。 – 2011-03-03 15:04:40

+0

這不是猶太教來打開/關閉它。問題是我可能不會在參數列表中給出它。 – SamekaTV 2011-03-04 07:31:36

相關問題