2011-05-03 82 views
4

我「AM複製從表A中的數據表B 表B具有可空列具有0 一般我設定值的默認約束值使用以下訪問器的列。ADO.NET CommandBuilder的,將InsertCommand和默認約束

public object this[string columnName] 
{ 
    get { return DataTable.Rows[CurrentRow][columnName]; } 
    set { DataTable.Rows[CurrentRow][columnName] = value; } 
} 

但我不設置可空列X.

當我插入整個行,不使用默認值。而不是0,爲空的列插入NULL。

_sqlCommandBuilder = new SqlCommandBuilder(_sqlDataAdapter); 
_sqlCommandBuilder.ConflictOption = ConflictOption.OverwriteChanges; 
_sqlCommandBuilder.SetAllValues = false; 
_sqlDataAdapter.Update(DataTable); 

我也得到了架構:

_sqlDataAdapter.Fill(DataTable); 
_sqlDataAdapter.FillSchema(_dataTable, SchemaType.Mapped); 

爲什麼ADO.NET設置爲NULL我的專欄X雖然我沒有設置呢?

我認爲,當我不設置列X的值時,ADO.NET將從給定的約束獲取默認值。

ADO.NET CommandBuilder能夠使用默認約束嗎?

回答

3

您不需要使用CommandBuilder來實現您的DataAdapter的更新方法。 CommandBuilder充滿了問題。您可以將DataAdapter.SelectCommandDataAdapter.UpdateCommand屬性設置爲DbCommand直接指定sql的對象。這避免了CommandBuilder生成正確的sql語句的能力固有的問題。

更新:

沒有辦法對CommandBuilder的知道你要使用的默認值。它所做的就是生成一個插入語句,如果有一列要爲插入語句生成它。如果該列是插入語句的一部分,那麼將爲該列提供的任何值(即使爲null)都將被插入。缺省值適用於不包含在插入語句中的情況。它不會將null轉換爲默認值,無論您如何嘗試插入項目,CommandBuilder或不。

繼續沿着這條嘗試使用CommandBuilder的道路只會給你更多的傷痛。它甚至無法在其select子句中處理簡單的連接語句。它還需要一個主鍵。如果其中任何一個被違反,則它不能生成正確的更新,插入和刪除語句。只有兩個提供程序Sql Server和Oracle曾經實現過這個類,Oracle已知有一些在上述基本問題之外從未修復過的錯誤。

如果您使用了兩個DbCommand對象,一個用於選擇和一個用於插入,然後通過DbDataReader循環選擇DbCommand的輸出,您可以輕鬆地檢查該列中的空值,並將默認值爲零插入DbCommand,因爲你知道它是什麼。瞭解數據庫規則並在必要時使用它們並不違反任何類型的代碼組織規則。爲了編寫這種代碼,你必須知道數據庫中的內容。

如果您有sql server 2005或更高版本,另一個建議是使用INSERT INTO .. SELECT語句。如果你的sql足夠好,你可以使用CASE子句來生成一個單一的sql語句。

+0

我不想手動創建更新,創建,刪除語句。我希望我能正確理解你。如果沒有,請讓我知道:) – Rookian 2011-05-12 10:44:48

+0

您可能會認爲,當您向表中添加一行時,只有您設置的列將位於插入語句中,從而允許默認值正確顯示。這在ADODB中有效,我很驚訝ADO.NET已經失去了這個功能。 – Brain2000 2014-03-17 18:41:51

0

一個小問題,它可能看起來很明顯,但實際上它很棘手。

_sqlCommandBuilder.ConflictOption = ConflictOption.OverwriteChanges; 

如果我引用MSDN definition你可以閱讀:

"If no PrimaryKey is defined, all searchable columns are included in the WHERE clause." 

我的一個朋友,使用(1,1)在一些camses,而不是主鍵定義IDENTITY。

這麼小的問題是,你在你的「更新」表B中使用主鍵嗎?



然後....

添加信息,SqlAdapter.FillSchema不使用默認值 這裏是由FillSchema的檢索信息:

AllowDBNull 
AutoIncrement.You must set AutoIncrementStep and AutoIncrementSeed separately. 
MaxLength 
ReadOnly 
Unique 

(引自MSDN site

獨特

+0

主鍵被定義,但你的第二個信息是信息性的,謝謝:)但它沒有解決我的問題。 – Rookian 2011-05-12 10:56:19