3

在StackOverFlow中有三個類似的問題,但沒有給出答案。無法啓用約束。一行或多行包含違反非空,唯一或外鍵約束的值。錯誤VB.Net

如果發現了這個錯誤發生的原因,但不知道修復。

我爲我的項目使用Strongly Typed Dataset,該項目是爲DAL創建的。

我已經使用設計器添加的SQL Server表到這個數據集,並創造一個DataAdapter

This is how the datatable looks

它,當我插入使用DataTableAdapter

daLabTest.Insert(txtLabTestId.Text, cmbLabTestType.Text, cmbTestName.Text, txtLabFees.Text, dtpLabEffDate.Value) 

工作正常,但當我想要顯示組合框或gridview中的表中的數據我得到這個錯誤。

Error showned in visual Studio

我告訴我發現了問題是什麼,我只是使用DataSet設計預覽數據,發現該函數返回的數據是這樣的...

data i got preview

我寫到查看這個數據集的查詢是

Select distinct(TestType) from LabTestTypes 

所以這應該只返回一列但數據集返回5列,但別人爲空,而TestName列返回時,不應爲null主,所以問題的存在..

要解決這一點,我試圖改變NullValue & AllowDBNull屬性分別爲[Empty]true,但這並不適合我。

請幫我在這...

回答

6

那過於籠統約束的例外是討厭的,哪來經過了這麼多投訴的InnerException?

這個模板可以幫助識別問題的行和列,但查詢功能的「補」的版本是必要的。例如。 GetDistinct *() - >填充*()。然後可以創建一個表格並詢問該行的錯誤文本。

SomeTable tTable = new SomeTable() 
    try { 
     // sorry, if you have a GetData, change to the fill version 
     someTable.FillByActiveLogin(tTable, loginName); 
    } catch (System.Data.ConstraintException constrExc) {    
      System.Data.DataRow[] rowsErr = tTable.GetErrors(); 
      for (int i = 0; i < rowsErr.Count(); i++) 
       if (rowsErr[i].HasErrors) 
        Dbg.WriteLine(rowsErr[i].RowError); 
    } 

(感謝邁克爾·S表示這暗示誰/無論你在哪裏!)

0

我得到了一個函數這個錯誤從使用存儲過程的DLL。該過程沒有返回表中的所有字段。排除的一個字段不能爲空。這顯然導致了約束例外。當我更改過程和DLL以包含該字段時,異常就消失了。

0

在這個問題上我自己花的年齡後,我已經解決了它修改數據集中的查詢返回一個空值(可以忽略)對於未在輸出所需的每個關鍵領域。

所以你的查詢會變成...

Select distinct TestType, 1 as ID, "Dummy" as TestName, "Dummy" as TestFees, "Dummy" as TestDate 
from LabTestTypes 
相關問題