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

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

我在这里不明白吗? 请指教。 谢谢。

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

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

简短的回答是:

System.DBNull.Value != null

更长的答案是:

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

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

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

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

您是否正确地为这些列分配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);