如何安全地从SQL Server读取可能为null的字符串值?

时间:2014-01-23 22:04:52

标签: c# sql sql-server tsql isnull

当Address2列为空时,此行:

string address2 = sqlD8aReader.GetString(ADDRESS2_OFFSET);

...失败了:

  System.Data.SqlTypes.SqlNullValueException was unhandled by user code
  HResult=-2146232015
  Message=Data is Null. This method or property cannot be called on Null values.
  Source=System.Data
  StackTrace:
       at System.Data.SqlClient.SqlBuffer.get_String()
       at System.Data.SqlClient.SqlDataReader.GetString(Int32 i)
       at HandheldServer.Models.SQLServerPOCRepository..ctor() in c:\HandheldServer\HandheldServer\Models\SQLServerPOCRepository.cs:line 58
  InnerException:

如何安全地读取可能为null的字符串?它应该以某种方式在SQL中处理(如果是这样,如何?)还是应该在read / C#代码中处理?

5 个答案:

答案 0 :(得分:5)

我不知道你的数据是如何填充的,但是当我们执行我工作的查询时,如果必须为某些操作设置空字符串而不是null,我们将使用ISNULL(column, '')在可能返回null的列上,所以我们的应用程序层不需要担心值是否为null,它只会像字符串一样处理它。

否则,如果你想处理它的应用程序端,你可以使用它:

if(!sqlD8aReader.IsDBNull(ADDRESS2_OFFSET))
{
    string address2 = sqlD8aReader.GetString(ADDRESS2_OFFSET);
}

答案 1 :(得分:3)

快速单行将是

string address2 = sqlD8aReader.IsDBNull(ADDRESS2_OFFSET) 
                  ? null 
                  :sqlD8aReader.GetString(ADDRESS2_OFFSET);

或作为扩展方法:

public static GetStringOrNull(this IDataRecord dr, int i)
{
    return dr.IsDBNull(i) 
           ? null 
           : dr.GetString(i);
}

并致电

string address2 = sqlD8aReader.GetStringOrNull(ADDRESS2_OFFSET);

答案 2 :(得分:1)

你可以在你的SQL查询中实现这一点,如:

    select * from SomeTable where SomeColumn is not null

这样你就不会得到那个例外。但是你也应该检查返回的值是否为空或者不像akousmata所说的那样。

答案 3 :(得分:1)

从数据库端处理

1)插入

时确保Address不为NULL
INSERT INTO t(Address) VALUES(ISNULL(@Address, ''))

2)如果为NULL

,则返回空字符串
SELECT ISNULL(Address, '') as Address FROM t

您已经从其他用户sqlReader.IsDBNull

获得了很好的答案

答案 4 :(得分:1)

最简单/最佳的解决方案是让您的SQL查询打印其他值而不是null。例如,如果我有一个column1,我可能会得到空值,我会调用此查询:

SELECT isnull(column1,0) FROM table

打印0而不是空值

而不是调用此查询:

SELECT column1 FROM table 

打印空值并在使用C#检索数据时抛出异常。