我使用VS2008数据集设计器设计了一个数据集。在其中一个数据表中,我将大多数列的“AllowDBNull”属性设置为False。但是,如果我为这些列创建包含空值的DataRow,则此数据表会接受此行,而不会出现任何错误。
我不明白这里的意思吗?请指教。谢谢。
然而,编辑 Mike Spross的优秀解释提出了另一个问题。如果它们是System.DBNull,我们如何检查文本字段?令人惊讶的是,DataSets没有将字符串“”视为System.DBNull并抛出异常。或者不是吗?
编辑我想我发现了问题和原因。我正在初始化DataTable的新行,然后将值填入该行。初始化行时,字符串的默认值,即“”可能正在该列中填充。我想是的呢?有关于此的任何想法吗?
答案 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);