即使 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 值?的主要内容,如果未能解决你的问题,请参考以下文章
isNetworkEnabled == false 在室内时即使我有 wifi 和移动数据
mySQL查询返回数据,即使条件为false [duplicate]
File.Exists 返回 false,即使我可以看到文件 C#