3

我有一个带有类型列的 SQL 表,nvarchar(20)并希望使用SqlDataReader. 看起来这样做的唯一方法是使用GetSqlChars()后跟ToSqlString()

 String result = reader.GetSqlChars(index).ToSqlString().Value

问题是,如果存储的值恰好为空(这对我的情况有效)我得到

[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;

这可行,但需要大量额外的代码,而且看起来很不优雅。

有没有更优雅的方式来达到同样的效果?

4

2 回答 2

9

也许:

var value = reader.IsDBNull(index) ? null : reader.GetString(index);

甚至更短:

var value = reader[index] as string;
于 2012-10-17T11:55:13.443 回答
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如果数据库值为空,则方法被专门编码为抛出异常。这是设计使然。GetString 状态的文档:调用 IsDBNull 以在调用此方法之前检查空值

另一方面,如果您使用GetValue()并且最终以一个DBNull对象作为您的值,则该DBNull.ToString方法会自动返回String.Empty.

于 2012-10-17T11:57:05.627 回答