簡體   English   中英

當allow null為true時,為什么默認值不插入列?

[英]Why default value is not inserting in column when allow null is true?

我有一個表地址,其中一個名為“faxno”的列允許null並且默認值為0.當我們使用數據集以編程方式插入記錄時,我們將faxno值設置為“Null”但不是“0”。

我不明白為什么會這樣?

是否有可能插入默認值而不是Null?

在insert語句中, 排除faxno

對於可為空的列, 將在發生插入時使用默認值,並從語句中排除列名。 要插入空值,列必須包含在列表中,並且必須顯式插入null值。

參考

DataTable添加行時,它取決於您指定值的方式。 如果指定null ,則將其解釋為“apply defaults”。 如果指定DBNull.Value ,則將其解釋為“this is explicit null”。 所以:傳遞null

DataTable dt = new DataTable();
dt.Columns.Add("foo", typeof(int)).DefaultValue = 0;
Console.WriteLine(dt.Rows.Add(new object[]{null})["foo"]);
Console.WriteLine(dt.Rows.Add(new object[]{DBNull.Value})["foo"]);

第一行顯示“0” - 它已應用默認值。 第二行是空的 - 它顯式為null

當且僅當未明確指定值時,才會插入默認值。

如果我有一個表Articles (ID int not null, Title nvarchar(50) null)Title列的默認值為“Untitled”,我這樣做:

Insert into Articles (ID) values (1)

它會插入行(1, 'Untitled') 但如果我這樣做

Insert into Articles (ID, Title) values (2, null)

它會插入行(2, null)因為我明確要求在Title列中插入一個空值(根據列定義有效)。

當您將DataSet與DataTable一起使用時,如果必須用某些東西填充行的所有字段,而不管默認設置如何,然后在保存DataTable時保存所有字段。 如果字段的值具有C#null對象的值( null ),而DataSet將該字段視為未初始化,並且未在生成的insert / update語句中設置該字段(這意味着將應用您的默認值)。

但是,如果字段的值為Convert.DBNull (SQL null值)而不是顯式null值,則將其發送到數據庫並將其插入數據庫中,忽略默認值。

如果使用數據集執行此操作,則可能執行“select * from table where ....”,然后在插入時可能使用默認的GetInsertCommand語句,在這種情況下,它會選擇每個字段。 如果未向數據行中的該字段提交任何值,則它將通過insert命令保存為NULL,而不是使用默認值。 (您可以檢查Command.CommandText屬性以了解將在GetInsertCommand之后執行的SQL命令,您應該在那里看到該字段)。

一種選擇是您定義自己的不帶該字段的Insert命令。 為此,當您選擇創建新數據行時,應選擇每個字段,但應選擇具有默認值的字段,並且在執行GetInsertCommand時,將不包括該字段,然后將插入默認值而不是NULL。

如果您有時需要插入字段(因為有時您可能需要插入值),您可能需要創建自定義語句,因為有時您需要該字段,有時不使用默認值。 您可以創建一個自定義選擇行,其邏輯對於數據行中的每一列,如果在列中有數據然后添加它,否則不會,並且您最終會得到一個只包含列的語句值和其他每個將使用表默認值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM