2011-10-18 19 views
1

我跑反對SQL2008數據庫,使用下面的C#代碼返回從合併輸出一個合併查詢加載一個DataReader時:獲取一個約束的例外在一個DataTable

cmd.CommandText = query; 
if (conn.DBConn.State == ConnectionState.Closed) conn.DBConn.Open(); 
DbDataReader dbReader = cmd.ExecuteReader(); 
DataTable dt = new DataTable("Results"); 
dt.Load(dbReader); 

最後一行拋出一個錯誤:

System.Data.ConstraintException - Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.

我發現this MSDN上,和它適合我的情況,但實際上,我怎麼解決這個問題?

清除與dt.PrimaryKey=null;主鍵

上面的代碼將被用於許多表不起作用。

回答

0

也許你的查詢返回多個結果集?在Management Studio或類似的地方運行你的查詢。

+0

我可以確認的回報可能重複是一個表。 – callisto

0

違反非空,唯一或外鍵約束。

非null:檢查是否有一些字段返回null,如果字段允許爲null。

獨特:似乎被確認

+0

返回的表格不基於強類型數據集。它是一個由SQL引擎根據我合併的表生成不同列的表。沒有爲返回的表定義KEY!有趣的是,MERGE成功完成,因此只有MERGE的輸出纔會導致問題。 – callisto

1

做到這一點。將衍生表select output作爲Derived表和select *

它似乎有幫助。

Select * from 
(Select columnB,columnB) -- if your table is being created on the fly. 
0

dt.BeginLoadData()調用之前加載。

dt.BeginLoadData(); 
dt.Load(dbReader); 
dt.EndLoadData(); 
+0

根據https://msdn.microsoft.com/en-us/library/system.data.datatable的說法,我希望這會對我有用,因爲它「在加載數據時關閉通知,索引維護和約束」。 beginloaddata(v = vs.110).aspx。但它沒有任何影響。 – SQLServerSteve

+0

@SQLServerS取得這個成功嗎?你有同樣的問題,其他答案也沒有幫助? –

+0

@dpopov - 看到我上面的答案,我只是簡單地發現了錯誤並忽略了它,這就是訣竅。我剛剛在回答中留下了這條評論,讓你知道你的方法在我的情況下不起作用,出於某種原因(我首先嚐試了你的方法)。 – SQLServerSteve

1

我發現這個錯誤的最簡單的解決方法是僅僅將它包裝在Catch塊中並忽略錯誤。我發現它在實現cjb110的excellent article上挖掘更多關於約束錯誤的信息。令我吃驚的是,我完全意識到我們可以完全忽略錯誤並按原樣使用數據表。我已經驗證了下面的VB代碼(可以隨意通過C#語法的代碼轉換器運行它)按預期返回所有行和列,至少在遇到問題的情況下(在我的情況下主要是ADOMD Command對象)。

Try 

TempDataTable.Load(PrimaryCommand.ExecuteReader) 

Catch ex As ConstraintException 

    End Try 

注意,這個問題是一個較新的線程DataTable.Load, One or more rows contain values violating non-null