即使 AllowDBNull = False,数据集也允许 Null 值?

Posted

技术标签:

【中文标题】即使 AllowDBNull = False,数据集也允许 Null 值?【英文标题】:Dataset allowing Null values even when AllowDBNull = False? 【发布时间】:2009-04-25 04:28:16 【问题描述】:

我使用 VS2008 数据集设计器设计了一个数据集。在其中一个数据表中,我将大多数列的“AllowDBNull”属性设置为 False。但是,如果我仍然为这些列创建一个包含空值的 DataRow,则此数据表会接受此行,而不会出现任何错误。

我不明白这里的东西吗?请指教。谢谢。

编辑 然而,Mike Spross 的出色解释提出了另一个问题。如果它们是 System.DBNull,我们如何检查文本字段?令人惊讶的是,DataSet 没有将字符串 "" 视为 System.DBNull 并引发异常。还是不是?

编辑我想我找到了问题和原因。在将值填充到该行之前,我正在初始化 DataTable 的新行。在初始化行时,字符串的默认值,即 "" 可能会被填充到该列中。我想就这样?对此有何想法?

【问题讨论】:

【参考方案1】:

简短的回答是:

System.DBNull.Value != null

更长的答案是:

在 C# 中,SQL 中 NULL 值的概念由 System.DBNull 类的 Value 属性表示。在处理数据库时,更熟悉的 C# null 实际上并不意味着“空值”。

当您将数据库列设置为 null 时,ADO.NET 会将列初始化为该列的默认值(例如,int 列将初始化为 0)。也就是说,使用null 实际上会导致非空值最终出现在数据库中,因此不会出现错误。

如果您改为将数据库列设置为System.DBNull.Value,则该列实际上将设置为NULL。这是AllowDBNulls == false 会阻止你这样做的情况。

【讨论】:

我之前接受了这个答案,但暂时没有接受,因此可以提供对我进一步查询的答案。我会接受它,一旦发生这种情况。【参考方案2】:

关于您的“奖励” ;-) 问题:NULL(无字符串)和“”(空字符串)是两个不同的东西。所以区别对待他们是完全合理的。是 null 和 DBNull 之间的区别把事情搞砸了。如果在设计 ADO.NET 时可以使用可空类型,事情可能会容易得多。但在 .NET 2.0 之前,没有办法表示例如一个“空整数”。

【讨论】:

【参考方案3】:

您是否将 NULL 值或空字符串分配给这些列?如果您不为列分配任何值,它将默认为 NULL(如果未施加 DEFAULT 约束)。否则,您可以通过执行分配 NULL 值 -

ds.Tables[0].Rows[0]["Col"] = null;

如果您将空字符串分配给这些列,则它不等于 NULL。

如果你在一个被标记为 NOT NULLABLE 的列中有一个 NULL 值,它会抛出一个错误 -

列“Col1”不允许空值。

编辑:

通过 NOT NULLABLE,我的意思是 AllowDBNull = false。

您的代码似乎正确。您可以尝试修剪文本吗?

这是整个代码 -

DataTable dt = new DataTable();

DataColumn column = new DataColumn("Col1");
column.AllowDBNull = false;
dt.Columns.Add(column);

DataRow dr = dt.NewRow();
dr["Col1"] = null;

dt.Rows.Add(dr);

【讨论】:

我有一个文本框,我正在使用以下代码: if(this.nameTextBox.Text == "") dr[DB.vinDataSet.item.nameColumn] = null;否则 博士 [DB.vinDataSet.item.nameColumn] = this.nameTextBox.Text;但我可以在 DataTable 中输入行,即使我明确地将 nameColumn 设置为 null。顺便说一句,什么是“不可为空”属性。我只能在数据集设计器中看到“AllowDBNull”。

以上是关于即使 AllowDBNull = False,数据集也允许 Null 值?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 AllowDBNull 为 GUID 工作?

isNetworkEnabled == false 在室内时即使我有 wifi 和移动数据

mySQL查询返回数据,即使条件为false [duplicate]

File.Exists 返回 false,即使我可以看到文件 C#

为啥我总是得到单例bean,即使我使用proxyBeanMethods = false?

FileExists() 返回 false,即使文件存在