本当に苦労しているDataRowに問題があります。
データ行は、OleDbConnectionを使用してExcelスプレッドシートから読み込まれます。
列名を使用してDataRowからデータを選択しようとすると、そこにデータがあってもDBNullが返されます。
しかし、それはそれほど単純ではありません。
datarow.Table.Columns[5].ColumnName
は「my column」を返します。datarow["my column"]
はDBNullを返します。datarow[5]
は500を返します。datarow[datarow.Table.Columns[5].ColumnName]
はDBNullを返します。 (タイプミスではないことを確認するためだけに!)
列番号を使用してデータ行から物事を選択することはできましたが、列の順序が変更されるとソフトウェアが破損するため、そうするのは嫌です。
どのバージョンの.NETを使用していますか? .NET 3.5以降、dataTables、dataRowsなどのさまざまな便利な拡張機能を含むAssembly System.Data.DataSetExtensionsがあります。
あなたが使用してみることができます
row.Field<type>("fieldName");
それがうまくいかない場合、これを行うことができます:
DataTable table = new DataTable();
var myColumn = table.Columns.Cast<DataColumn>().SingleOrDefault(col => col.ColumnName == "myColumnName");
if (myColumn != null)
{
// just some roww
var tableRow = table.AsEnumerable().First();
var myData = tableRow.Field<string>(myColumn);
// or if above does not work
myData = tableRow.Field<string>(table.Columns.IndexOf(myColumn));
}
これは新しい機能か何かでなければなりません。そうでなければ、なぜ言及されていないのか分かりません。
row["ColumnName"]
を使用して、DataRow
オブジェクトの列の値にアクセスできます。
DataRow row = table.Rows[0];
string rowValue = row["ColumnName"].ToString();
次の操作を行うと、簡単にアクセスできます。
for (int i = 0; i < Table.Rows.Count-1; i++) //Looping through rows
{
var myValue = Table.Rows[i]["MyFieldName"]; //Getting my field value
}
ヒント
DataTable table = new DataTable();
table.Columns.Add("Column#1", typeof(int));
table.Columns.Add("Column#2", typeof(string));
table.Rows.Add(5, "Cell1-1");
table.Rows.Add(130, "Cell2-2");
編集:追加
string cellValue = table.Rows[0].GetCellValueByName<string>("Column#2");
public static class DataRowExtensions
{
public static T GetCellValueByName<T>(this DataRow row, string columnName)
{
int index = row.Table.Columns.IndexOf(columnName);
return (index < 0 || index > row.ItemArray.Count())
? default(T)
: (T) row[index];
}
}
Jimmyが言ったことに加えて、Convert.ChangeType
を必要なnullチェックと一緒に使用して、selectをジェネリックにすることもできます。
public T GetColumnValue<T>(DataRow row, string columnName)
{
T value = default(T);
if (row.Table.Columns.Contains(columnName) && row[columnName] != null && !String.IsNullOrWhiteSpace(row[columnName].ToString()))
{
value = (T)Convert.ChangeType(row[columnName].ToString(), typeof(T));
}
return value;
}
VB.netで列の値を取得できます
Dim row As DataRow = fooTable.Rows(0)
Dim temp = Convert.ToString(row("ColumnName"))
また、C#では Jimmy's Answer を使用できますが、ToString()
に変換するときは注意してください。代わりにデータがnullの場合はnull例外をスローできますConvert.ToString(your_expression)
を使用してnull例外を回避します reference
for (int i=0;i < Table.Rows.Count;i++)
{
Var YourValue = Table.Rows[i]["ColumnName"];
}