_callReportCode = reader["Call Report Code"].ToString();
ToStringを呼び出しているオブジェクトがNULLになる可能性を処理しようとしています。上記のステートメントをいくつかの変数で使用しますが、それぞれに個別のtry/catchを作成したくありません...文字列のnullチェックを行うための最良の方法は何ですか。
他のデータ型はこれを行っています:
int.TryParse(reader["Account Number"].ToString(), out _accountNumber);
このコードでは、「リーダー」はSqlDataReaderを指しますが、この質問ではそれほど重要ではありません。
null合体演算子 を使用します:_??
_
_callReportCode = (reader["Call Report Code"] ?? "").ToString();
_
フィールドのデータが_DBNull.Value
_(null
ではなく)の場合、_DBNull.Value
_はnull
ではないため、これは引き続き機能します。したがって、_??
_は使用されず、DBNull.Value.ToString()
は_""
_であり、これが必要です。
Convert.ToString(reader["Call Report Code"]);
値がnullの場合、string.Empty
を返します。
ソース: http://msdn.Microsoft.com/en-us/library/astxcyeh.aspx
更新:DBNull
でも動作します。確認しました。
更新2:念のため、ここでより完全なテストを行うことにしました。
DBNull dbNull = null;
DBNull dbNullEmpty = DBNull.Value;
string stringNull = null;
string stringEmpty = string.Empty;
var outcome1 = Convert.ToString(dbNull);//Empty string
var outcome2 = Convert.ToString(dbNullEmpty);//Empty string
var outcome3 = Convert.ToString(stringNull);//NULL
var outcome4 = Convert.ToString(stringEmpty);//Empty string
文字列がnull許容の場合は、SqlDataReader
から返された値をDBNull.Value
と照合する必要があります。
_callReportCode = reader["Call Report Code"] as string;
reader["Call Report Code"]
によって返されるオブジェクトがnot a string
の場合、それはDBNull.Value
であるため、as
キャストはの値を設定します。 _callReportCode
からnull
も同様です。
データベース値が欠落している場合に文字列をnull以外に設定する必要がある場合は、次のように??
を追加します。
_callReportCode = (reader["Call Report Code"] as string) ?? string.Empty;
私の提案は、データが文字列でない場合はToString
を変換しないことです。データがすでに文字列である場合、ToString
の呼び出しは冗長であり、必要なのはキャストだけです。
データベースのデータ型は整数であると想定しています。その場合、null許容のintを使用できます。
int? accountNumber = reader["Account Number"] == DBNull.Value ? null : (int?)reader["Account Number"];
私はまさにこのことを行うための拡張メソッドを作成しました。
public static class SqlDataReaderExtensions
{
public static T Field<T>(this SqlDataReader reader, string columnName)
{
object obj = reader[columnName];
if (obj == null)
{
throw new IndexOutOfRangeException(
string.Format(
"reader does not contain column: {0}",
columnName
)
);
}
if (obj is DBNull)
{
obj = null;
}
return (T)obj;
}
}
使用法
int? accountType = reader.Field<int?>("Account Number"); // will return NULL or the account number.
私はいくつかの最も簡単で一般的な方法を持っています。
public static string ToNULLString(this string Values)
{
if (string.IsNullOrEmpty(Values))
{
return "";
}
else
{
return Values.ToString();
}
}
c#で使用
string item = null;
string value = item.ToNULLString();
私が見つけた最も簡単な方法は
_callReportCode = reader["Call Report Code"] + "";
_callReportCode = Convert.ToString(reader ["Call Report Code"])は、そこにnullがないことを確認する必要があります。
チェックを行うときに呼び出すメソッドを作成できます。このように、try catchを1回だけ入力する必要があります...または、これを行うために文字列クラスの拡張メソッドを作成できます
次のコード行を使用します。
_callReportCode = String.IsNullorEmpty(reader["Call Report Code"]) ?
String.Empty :
reader["Call Report Code"].ToString();
次の行の代わりに:
_callReportCode = reader["Call Report Code"].ToString();