我有一个SQL表,其中包含nvarchar(20)
类型的列,并希望使用SqlDataReader
读取该列。看起来唯一的方法是使用GetSqlChars()
后跟ToSqlString()
:
String result = reader.GetSqlChars(index).ToSqlString().Value
问题是如果存储的值恰好是null(并且这对我的情况有效)我得到了
[SqlNullValueException: Data is Null. This method or property cannot be called on Null values.]
System.Data.SqlTypes.SqlString.get_Value() +3212527
所以我必须首先检查ToSqlString()
返回的值IsNull()
返回的内容:
SqlString asSqlString = reader.GetSqlChars(index).ToSqlString();
String result = asSqlString.IsNull() ? null : asSqlString.Value;
虽然有效但需要大量额外的代码,看起来非常不优雅。
是否有更优雅的方式来达到同样的效果?
答案 0 :(得分:9)
也许:
var value = reader.IsDBNull(index) ? null : reader.GetString(index);
甚至更短:
var value = reader[index] as string;
答案 1 :(得分:3)
您可以使用GetValue()
方法:
// define your query
string query = "SELECT YourField FROM dbo.YourTable WHERE ID = 1";
using(SqlConnection conn = new SqlConnection("......"))
using(SqlCommand cmd = new SqlCommand(query, conn))
{
conn.Open();
using(SqlDataReader rdr = cmd.ExecuteReader())
{
if(rdr.Read())
{
string fieldValue = rdr.GetValue(2).ToString();
}
}
conn.Close();
}
GetString
方法专门编码为在数据库值为null时抛出异常。这是设计的。
GetString状态的文档:
调用IsDBNull以在调用此方法之前检查空值
另一方面,如果您使用GetValue()
并最终得到DBNull
个对象作为您的值,则DBNull.ToString
方法会自动返回String.Empty
。