2009-04-25 60 views
2

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

难道我不理解的东西吗?请指教。谢谢。然而,

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

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

回答

13

简短的回答是:

System.DBNull.Value != null

较长的答案是:

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

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

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

+0

优秀解释+1 – 2009-04-25 06:33:03

0

你究竟分配NULL值或空字符串的列?如果您没有为列指定任何值,则它将默认为NULL(如果未强制使用DEFAULT约束)。否则,您可以通过分配一个NULL值 - 如果您分配一个空字符串这些列

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

,它不等于NULL。

如果你有在已标记为不可为空列中的NULL值,它会抛出一个错误 -

列“Col1中”不允许空值。

编辑:

通过不空,我的意思是AllowDBNull =假。

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

这里是整个代码 -

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); 
+0

我有一个文本框和我使用以下代码: 如果(this.nameTextBox.Text == “”) 博士[DB.vinDataSet.item.nameColumn] = NULL; 别的 { 博士[DB.vinDataSet.item.nameColumn] = this.nameTextBox.Text; } 但我可以在数据表中输入一行,甚至当我明确设置的名称列空。 顺便说一下,什么是“不可空”属性。我能看到的是DataSet Designer中的“AllowDBNull”。 – virtualmic 2009-04-25 05:20:58

2

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

相关问题