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

时间:2009-04-25 04:28:17

标签: c# visual-studio-2008 strongly-typed-dataset

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

我不明白这里的意思吗?请指教。谢谢。

然而,

编辑 Mike Spross的优秀解释提出了另一个问题。如果它们是System.DBNull,我们如何检查文本字段?令人惊讶的是,DataSets没有将字符串“”视为System.DBNull并抛出异常。或者不是吗?

编辑我想我发现了问题和原因。我正在初始化DataTable的新行,然后将值填入该行。初始化行时,字符串的默认值,即“”可能正在该列中填充。我想是的呢?有关于此的任何想法吗?

3 个答案:

答案 0 :(得分:13)

简短的回答是:

System.DBNull.Value != null

答案越长:

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

您是否正在为这些列分配NULL值或空字符串?如果未向列分配任何值,则默认为NULL(如果未强制执行DEFAULT约束)。否则,您可以通过 -

分配NULL值
ds.Tables[0].Rows[0]["Col"] = null;

如果要为这些列分配空字符串,则它不等于NULL。

如果列中的NULL值已被标记为NOT NULLABLE,则会抛出错误 -

  

列'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);