当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#代码中处理?
答案 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不为NULLINSERT 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#检索数据时抛出异常。