当allow null为true时,为什么默认值不插入列?

时间:2013-01-17 09:31:33

标签: c# sql-server-2008 dataset

我有一个表地址,其中一个名为“faxno”的列允许null并且默认值为0.当我们使用数据集以编程方式插入记录时,我们将faxno值设为“Null”但不是“0”

我不明白为什么会这样?

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

4 个答案:

答案 0 :(得分:3)

在您的插入声明中,排除faxno

  

对于可以为空的列,将使用默认值   发生插入,列名称从语句中排除。   要插入空值,该列必须包含在列表中   必须明确插入null值。

Reference

答案 1 :(得分:1)

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

答案 2 :(得分:1)

当且仅当未明确指定值时才会插入默认值。

如果Articles (ID int not null, Title nvarchar(50) null)列的表格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对象(null)的值,则DataSet将该字段视为未初始化,并且未在生成的insert / update语句中设置该字段(这意味着您的默认值将应用)。

但是,如果字段的值为Convert.DBNull(SQL空值)而不是显式null值,则将其发送到数据库并将其插入数据库中,忽略默认值。

答案 3 :(得分:0)

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

一个选项是您定义自己的不带该字段的Insert命令。为此,当您选择创建新数据行时,应选择每个字段,但应选择具有默认值的字段,并且在执行GetInsertCommand时,它将不会被包含,然后它将插入默认值而不是NULL。 / p>

如果您需要有时插入字段(因为有时您可能需要插入值),您可能需要创建自定义语句,因为有时您需要该字段,有时不使用默认值。您可以创建一个自定义选择行,其逻辑对于数据行中的每一列,如果在列中有数据然后添加它,否则不会,并且您最终会得到一个只包含列的语句值和其他每个都将使用表默认值。