我有一个表地址,其中有一个名为“faxno”的列,它允许 null 并且默认值为 0。当我们使用数据集以编程方式插入一条记录时,我们将 faxno 值设为“Null”而不是“0”。
我不明白为什么会这样?
是否有可能插入默认值而不是 Null?
我有一个表地址,其中有一个名为“faxno”的列,它允许 null 并且默认值为 0。当我们使用数据集以编程方式插入一条记录时,我们将 faxno 值设为“Null”而不是“0”。
我不明白为什么会这样?
是否有可能插入默认值而不是 Null?
当且仅当未明确指定值时才会插入默认值。
如果我有一个列Articles (ID int not null, Title nvarchar(50) null)
的默认值为“Untitled”的表Title
,我会这样做:
Insert into Articles (ID) values (1)
它将插入行(1, 'Untitled')
。但如果我这样做
Insert into Articles (ID, Title) values (2, null)
它将插入行(2, null)
,因为我明确要求在列中插入一个空值(根据列定义有效)Title
。
当您将 DataSet 与 DataTable 一起使用时,无论默认设置如何,都必须用某些内容填充行的所有字段,然后在保存 DataTable 时保存所有字段。如果该字段的值具有 C# 空对象 ( null
) 的值,则 DataSet 将该字段视为未初始化,并且不在生成的插入/更新语句中设置该字段(这意味着将应用您的默认值)。
但是,如果该字段的值为Convert.DBNull
(SQL 空值),则将显式null
值发送到数据库并将其插入数据库中,忽略默认值。
向 a 添加行时DataTable
,取决于您如何指定值。如果您指定null
,它会将其解释为“应用默认值”。如果您指定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。
如果您使用数据集执行此操作,您可能执行了“从表中选择 *...”,然后在插入时可能使用默认的 GetInsertCommand 语句,在这种情况下,它会选择每个字段。如果您没有向数据行中的该字段提交任何值,则插入命令会将其保存为 NULL,而不是使用默认值。(您可以检查 Command.CommandText 属性以了解将在 GetInsertCommand 之后执行的 SQL 命令,并且您应该会看到该字段)。
一种选择是您定义自己的插入命令而不使用该字段。为此,当您选择创建新数据行时,您应该选择除具有默认值的字段之外的每个字段,并且在执行 GetInsertCommand 时,它将不包括在内,然后它将插入默认值而不是 NULL。
如果您需要有时插入该字段(因为有时您可能需要插入该值),您可能需要创建自定义语句,因为有时您需要该字段,有时不使用默认值。您可以在创建自定义选择行时执行此操作,该行的逻辑为数据行中的每一列,如果列中有数据,则添加它,否则不要添加,您最终将得到一个仅包含具有的列的语句值和其他所有将使用表默认值。