为什么默认值是不插入列时,允许null为真

本文关键字:允许 null 为真 插入列 默认值 为什么 | 更新日期: 2023-09-27 17:53:46

我有一个表地址,其中一个名为"faxno"的列允许为空,默认值为0。当我们以编程方式使用数据集插入一条记录时,我们得到的faxno值为"Null",而不是"0"。

我不明白为什么会这样?

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

为什么默认值是不插入列时,允许null为真

在insert语句中,排除faxno

在可空列的情况下,将使用默认值 若要插入空值,列必须包含在列表和必须显式插入null值。

参考

DataTable添加一行时,这取决于您如何指定值。如果您指定null,它将其解释为"应用默认值"。如果您指定DBNull.Value,它将其解释为"这是显式null"。所以:pass 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列中插入一个空值(根据列定义是有效的)。

当你使用带有数据表的数据集时,不管默认设置如何,它必须用某些东西填充行中的所有字段,然后在保存数据表时保存所有字段。如果字段的值有c# null对象(null)的值,那么数据集将该字段视为未初始化,并且不会在生成的插入/更新语句中设置该字段(这意味着您的默认值将被应用)。

然而,如果字段的值是Convert.DBNull (SQL空值),那么显式的null值将被发送到数据库,并将其插入数据库中,忽略默认值

如果您使用数据集,您可能会执行"select * from table where....",然后在插入时可能会使用默认的GetInsertCommand语句,在这种情况下,它会选择每个字段。如果您没有向datarow中的该字段提交任何值,那么insert命令将其保存为NULL,而不是使用默认值。(你可以查看命令。CommandText属性,以了解将在GetInsertCommand之后执行的SQL命令,并且您应该在那里看到字段)。

一种选择是定义自己的Insert命令,不带该字段。要做到这一点,当你选择创建你的新数据集,你应该选择每个字段,但与默认值的一个,当GetInsertCommand被执行,它将不包括,然后它将插入默认值,而不是NULL。

如果您需要有时插入字段(因为有时您可能需要插入值),则可能需要创建自定义语句,因为有时您需要字段,有时不使用默认值。您可以通过创建一个自定义选择行来实现这一点,该逻辑为数据row中的每个列,如果列中有数据,则添加它,否则不添加,您将最终拥有一个语句,其中只有具有值的列,其他列将使用表默认值。