如果允许空值,如何将nvarchar(x)读入String?

时间:2012-10-17 11:50:15

标签: c# .net sql-server

我有一个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;

虽然有效但需要大量额外的代码,看起来非常不优雅。

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

2 个答案:

答案 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