web-dev-qa-db-ja.com

文字列キャストでNull障害を防ぐための最良の方法

_callReportCode = reader["Call Report Code"].ToString();

ToStringを呼び出しているオブジェクトがNULLになる可能性を処理しようとしています。上記のステートメントをいくつかの変数で使用しますが、それぞれに個別のtry/catchを作成したくありません...文字列のnullチェックを行うための最良の方法は何ですか。

他のデータ型はこれを行っています:

int.TryParse(reader["Account Number"].ToString(), out _accountNumber);

このコードでは、「リーダー」はSqlDataReaderを指しますが、この質問ではそれほど重要ではありません。

10
jth41

null合体演算子 を使用します:_??_

_callReportCode = (reader["Call Report Code"] ?? "").ToString();
_

フィールドのデータが_DBNull.Value_(nullではなく)の場合、_DBNull.Value_はnullではないため、これは引き続き機能します。したがって、_??_は使用されず、DBNull.Value.ToString()は_""_であり、これが必要です。

31
Bobson
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
11
Andre Calil

文字列が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;
3
dasblinkenlight

私の提案は、データが文字列でない場合は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.
3
Matthew

私はいくつかの最も簡単で一般的な方法を持っています。

 public static string ToNULLString(this string Values)
        {
            if (string.IsNullOrEmpty(Values))
            {
                return "";
            }
            else
            {
                return Values.ToString();
            }
        }

c#で使用

string item = null;
string value = item.ToNULLString();
1
Neo Vijay

私が見つけた最も簡単な方法は

_callReportCode = reader["Call Report Code"] + "";
1
CADmageren

_callReportCode = Convert.ToString(reader ["Call Report Code"])は、そこにnullがないことを確認する必要があります。

0
eXecute

チェックを行うときに呼び出すメソッドを作成できます。このように、try catchを1回だけ入力する必要があります...または、これを行うために文字列クラスの拡張メソッドを作成できます

0
Fabio Marcolini

次のコード行を使用します。

_callReportCode = String.IsNullorEmpty(reader["Call Report Code"]) ?
                  String.Empty :
                  reader["Call Report Code"].ToString();

次の行の代わりに:

_callReportCode = reader["Call Report Code"].ToString();
0

null合体演算子null条件演算子 の組み合わせを使用するのが好きです。

string nn = MyObject.myNullableVar?.ToString() ?? "";

基本的にはこれと同じです

string ss = (MyObject.MyNullableVar == null) ? "" : MyObject.MyNullableVar.ToString();

しかし、より短い。

0
RayLoveless