2012-05-18 37 views
0

我已經創建了在SQL Server 2008數據庫,並自動遞增ID字段的表如何保存一個新的記錄時,ID鍵是自動遞增

而且我開發一個項目在C#.NET 2008

發生在點擊「保存數據」後,從BindingNavigator

「新增」

的問題,例如我點擊「新增」,填寫所有內容除了ID文本(空白ID),然後單擊「保存數據」則發生錯誤

運行時異常是「notNul lAllowedException:不允許列'id'爲空。

但它不是從用戶需要填補這一領域,但有從數據庫返回後保存

我還設置了ID的屬性:(包括C#項目和SQL Server)

AutoIncrement = True 
AutoIncrementStep = -1 (also I tested 1) 
AutoIncrementSeed = -1 (also I tested 1) 

沒有結果。

我該如何處理?

謝謝

+0

什麼版本的SQL如果ID列設置爲身份,只是通過'0',而不是空/空' '。 –

+0

設置爲0或-1時出現另一個錯誤「當IDENTITY_INSERT設置爲OFF時,無法爲表'mytable'中的標識列插入顯式值 –

+0

那麼,將其切換到'on':)如果Id列是'identity'並且自動增量插入的可能性,然後添加一個新的對象與'Id'設置爲'0'應該工作得很好 - Id將得到自動增加。 –

回答

4

不要在您的插入語句中包含標識列。

如果你的語句是

INSERT INTO MyTable (ID, SomeField, SomeOtherField) VALUES (null, 'SomeValue', 'AnotherValue') 

簡單地將其更改爲

INSERT INTO MyTable (SomeField, SomeOtherField) VALUES ('SomeValue', 'AnotherValue') 
+0

問題是,c#自動生成插入sql查詢。我刪除了id並且工作了!(當然,我必須設置-1爲id),下一次顯示正常的id(或者通過代碼刷新recrod)但是微軟沒有修復這個問題?謝謝 –

+0

我確定有一個解決方法,但我需要更多的具體信息。C#本身並沒有這樣做。動態數據和其他一些建立在C#之上的技術做... Visual Studio在使用DataSet設計器時執行此操作... Linq到SQL ORM生成器它做到了......我想有很多可能的方式來從C#訪問數據,很難告訴你如何解決這個問題。如果您要解釋如何創建數據訪問層,那可能會有所幫助。 – David

0

這聽起來像你有兩個問題。

首先,你總是插入 - 你用什麼邏輯來決定'save'是插入還是更新?我認爲這是由於你遇到的錯誤:「不能插入明確的......」

第二,你需要獲得SQL插入的ID,因此你可以把它寫到你的ID字段爲下一個保存=更新。有幾種方法可以做到這一點,我更喜歡使用存儲過程來執行插入並傳遞一個獲取SCOPE_IDENTITY()的OUTPUT參數。事情是這樣的:

CREATE PROC xyz 
(
    @data... 
    @NEWID INT OUTPUT 
) 
AS 
    ... do your INSERT ... 
    SET @NewID = SCOPE_IDENTITY() 

) 

仔細檢查我的語法 - 不知道你正在使用

+0

謝謝:)但我尋求一個簡單的解決方案,而無需過程。 c#自動生成(ado.net)3-4 sql查詢(插入,更新,刪除等)並自動調用適當的一個。問題是自動生成的C#代碼添加在SQL中插入的ID不存在(插入表設置ID = @ ID名= @名稱,...)但這是錯誤的!我不知道微軟爲什麼錯過了... –