做一Asp.Net网站登录模块,要求用户输入用户名和密码登录,再在后台程序中调用一存储过程来判断数据库中是否存在该用户,如果不存在,则返回一空值Null。由于后台数据库是SQL的,返回的空值是SQL类型的,因此在网站后台程序中混淆了其与Null的关系。通过查找资料,明白了DBNull、Null和空字符串的异同。
1.对DBNull的解释: 该类用于指示不存在某个已知值(通常在数据库应用程序中)。 在数据库应用程序中,空对象是字段的有效值。该类区分空值(空对象)和未初始化值(DBNull.Value 实例)。例如,表可以包含具有未初始化字段的记录。默认情况下,这些未初始化字段具有DBNul值。 该类还可以用于在COM Interop中区分VT_NULL变量(与空对象关联)和VT_EMPTY变量(与DBNull.Value实例关联)。 DBNull从不等于任何值。 DBNull是一个单独的类,这意味着该类只能存在一个实例。这个唯一的实例是DBNull.Value 访问SQL数据库的数据密集应用程序必须使用System.Data.SqlTypes类,这些类对空值具有内在支持。
2. Null null 关键字是表示不引用任何对象的空引用的文字值。null 是引用类型变量的默认值。那么也只有引用型的变量可以为NULL,如果 int i=null,的话,是不可以的,因为Int是值类型的。 "null" means the object reference is invalid in .NET,when you retrieve a NULL value from the Database, it is a valid value to .NET, and it is represented by System.DBNull.Value null用于判断Reference invalidate
那么,如何判断存储过程返回的值是DBNull呢? 我是这样做的:
if (Convert.IsDBNull(MyCommnd.Parameters["@xxxxx"].Value)) { xxx....; } else { xxx... }
或者
if (MyCommnd.Parameters["@xxxxx"].Value==DBNull.Value) { xxxx.... } else { xxxx.... }
其中MyCommand为打开存储过程的SqlCommand,@xxxxx为MyCommand的输出参数