web-dev-qa-db-ja.com

DataRowから値を取得することの違い

サンプルコード:

_    DataTable table = new DataTable();

    // ...
    // insert column to table

    table.Columns.Add("name");

    // ...
    // insert value to table

    foreach (DataRow row in table.Rows) {
         row["name"];
         row.Field<string>("name");     
    }
_

私の質問は:

  • _row["name"]_とrow.Field<string>("name")の使用に違いはありますか?もちろん、2番目の方法はあるタイプに値をキャストしますが、別の違いはありますか?
  • どちらの方法を使用するのが良いですか?
19
nirmus

備考セクション を参照してください。主な違いは次のとおりです。

DataSetクラスは、null値をDBNullクラス。 null値で列にアクセスした統合言語クエリ(LINQ)式は、InvalidCastException実行時。さらに、DataSetnullable型をサポートしていません。 Fieldメソッドは、nullable型として列にアクセスするためのサポートを提供します。 DataSetの基になる値がValueの場合、返されるnull許容型の値はnullになります。

指定されたDataColumnの値がnullであり、[〜#〜] t [〜#〜]は参照型またはnull許容型であり、戻り値の型はnullになります。 FieldメソッドはValueを返しません。

Fieldメソッドは型変換を実行しません。型変換が必要な場合は、最初にFieldメソッドを使用して列の値を取得する必要があります。次に、列の値を別のタイプに変換する必要があります。

最後の段落は、データベースに文字列として格納されている数値をよく見ているので、データの取得時にvarcharからintへの変換が必要になるため、この場合はDataColumnを使用する方が適切です。例えば:

_int test = row.Field<int>("Test"); // InvalidCastException
int test = Convert.ToInt32(row["Test"]); // Works like a charm
_

DataRowExtensions.Field<T> Method (DataRow, String)は.NET3.5で最初に登場し、「指定された行の各列値への強い型のアクセスを提供します。Fieldメソッドはnullableタイプ。」

Afaik、_row["name"]_はobjectを返し、row.Field<string>("name")Stringを返します。リンゴとナシを比較するべきではないので、何が良いかを尋ねる必要があります。

row["name"].ToString() vs row.Field<string>("name")そして答えは:それらは同じです。

16
Грозный

それはあなたの目的に依存しますが、あなたがあなたに言うかもしれない両方の定義を見れば;

DataRow.Itemプロパティ(DataColumn) _row["name"]_

DataRowExtensions.Fieldメソッド(DataRow、DataColumn)row.Field<string>("name")

0
Coops