如果value为null,如何将值返回到sqldatareader?

Cun*_*ers 5 sql vb.net sql-server sql-server-2008

我目前正在使用sql数据读取器(在vb.net中)通过SQL Server 2008数据库中的存储过程提取文章对象.该对象的一部分包括以下两个属性:

theArticle.Truthfulness = ((myReader.GetInt32(myReader.GetOrdinal("Truthfulness"))))
theArticle.Relevance = ((myReader.GetInt32(myReader.GetOrdinal("Relevance"))))
Run Code Online (Sandbox Code Playgroud)

我的问题是,真实性和相关性可能会返回一个空值,这会导致函数失效.

我想我理解为什么.我要求一个整数值(getin32),因为返回null失败.

如何容纳数据库中的空值,以免它倒下?

mar*_*c_s 20

您可以检查给定的序号位置是否为空.IsDBNull(),然后执行某些操作 - 例如,将值设置为-1或者其他值:

int myOrdinal = myReader.GetOrdinal("Truthfullness");

if(myReader.IsDBNull(myOrdinal))
{
  theArticle.Truthfulness = -1;
}
else
{
  theArticle.Truthfulness = myReader.GetInt32(myOrdinal);
}
Run Code Online (Sandbox Code Playgroud)

正如Mike Hofer在他的回答中指出的那样,你也可以将所有这些逻辑包装成一个扩展方法:

public static class SqlDataReaderExtensions 
{
    public static int SafeGetInt32(this SqlDataReader reader, 
                                   string columnName, int defaultValue) 
    {
        int ordinal = reader.GetOrdinal(columnName);

        if(!reader.IsDbNull(ordinal))
        {
           return reader.GetInt32(ordinal);
        } 
        else
        {
           return defaultValue;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后只使用"SafeGetInt32"方法:

  theArticle.Truthfulness = myReader.SafeGetInt32("Truthfullness", -1);
Run Code Online (Sandbox Code Playgroud)

  • 是的,你也可以这样做 - 但是避免异常比捕获和处理异常更好(一般情况下) (2认同)