サンプルコード:
_ 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番目の方法はあるタイプに値をキャストしますが、別の違いはありますか?備考セクション を参照してください。主な違いは次のとおりです。
DataSetクラスは、null値をDBNullクラス。 null値で列にアクセスした統合言語クエリ(LINQ)式は、InvalidCastException実行時。さらに、DataSetはnullable型をサポートしていません。 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")
そして答えは:それらは同じです。
それはあなたの目的に依存しますが、あなたがあなたに言うかもしれない両方の定義を見れば;
DataRow.Itemプロパティ(DataColumn) _row["name"]
_
DataRowExtensions.Fieldメソッド(DataRow、DataColumn)row.Field<string>("name")