3

タイプの列を持つ 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;

これは機能しますが、多くの余分なコードが必要であり、本当に洗練されていません。

同じ効果を達成するためのよりエレガントな方法はありますか?

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メソッドは、データベース値が null の場合に例外をスローするように特別にコーディングされています。これは仕様によるものです。GetString 状態のドキュメント: IsDBNull を呼び出して、このメソッドを呼び出す前に null 値を確認します。

一方、 を使用GetValue()DBNullて値としてオブジェクトになった場合、DBNull.ToStringメソッドは自動的に を返しますString.Empty

于 2012-10-17T11:57:05.627 に答える