2013-04-29 28 views
0

我的代码是basicaly这样的:检索的东西,可能是空从数据库

//get connection 
//make connection string which returns one value 
//open connection 
string picture = command.ExecuteScalar().ToString(); 
//close connection 

该查询返回null的可能性是存在的。那么如何找出它是否为null,然后将其存储到我的字符串中?我上面使用的不起作用,因为字符串引发异常。那么我可以暂时将这个值存储到某个东西中,然后把它抛回到字符串中?我不想运行两个ExecuteScalars来查明它是否为空,然后存储它。

+1

数据库应该*不*包含空值。阅读表规范化。 – christopher 2013-04-29 20:32:19

+0

它不是表中包含一个空值它的关系不存在。 – 2013-04-29 20:33:51

+0

@ChrisCooney:为什么数据库不应该包含NULL值? NULL旨在表达“缺少的信息和不适用的信息”,因此在适用的情况下使用它是绝对有意义的。 – CodeZombie 2013-04-29 21:01:27

回答

0

我经常这样做:

string picture = null; 
object picTemp = command.ExecuteScalar(); 
if (picTemp != null && picTemp != System.DBNull.Value) { 
    picture = (string)picTemp; 
} 

picTempnull如果没有返回任何结果。如果返回一个结果,但结果的值为空,它将是System.DBNull.Value

+0

非常感谢。我之前尝试过使用对象,但是我忘记在我的命令-_-上删除.ToString()。 – 2013-04-29 20:44:42

0

所有你需要做的是检查null

string picture = command.ExecuteScalar() as string; 
if(picture == null) 
{ 
    // Handle the NULL case 
} 

// Do something with picture... 

正如我可以从文档看,你不必检查System.DBNull.Value因为它不应该被ExecuteScalar()返回。

返回值
类型:System.Object
的第一行的 第一列中的结果集,或空引用(没有在Visual Basic)如果 结果集为空。返回最多2033个字符。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx

+0

我可能是错误的,因为我从内存去,但“普通旧'null'”是针对不返回结果的查询。例如:'SELECT * FROM DUAL WHERE 1 = 2'。没有行,没有列; 'ExecuteScalar'返回'null'。另一方面,考虑'SELECT NULL FROM DUAL'。这有一个结果集:一行一列,列值为空。 'ExecuteScalar'将在这里返回'System.DBNull.Value'。 – 2013-04-30 01:12:47