web-dev-qa-db-ja.com

DataRow:特定の列名でセル値を選択します

本当に苦労している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を返します。 (タイプミスではないことを確認するためだけに!)

列番号を使用してデータ行から物事を選択することはできましたが、列の順序が変更されるとソフトウェアが破損するため、そうするのは嫌です。

40
VaticanUK

どのバージョンの.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));
}
56
Hassan

これは新しい機能か何かでなければなりません。そうでなければ、なぜ言及されていないのか分かりません。

row["ColumnName"]を使用して、DataRowオブジェクトの列の値にアクセスできます。

DataRow row = table.Rows[0];
string rowValue = row["ColumnName"].ToString();
46
Jimmy

次の操作を行うと、簡単にアクセスできます。

        for (int i = 0; i < Table.Rows.Count-1; i++) //Looping through rows
        {
            var myValue = Table.Rows[i]["MyFieldName"]; //Getting my field value

        }
9
Gabriel G

ヒント

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];        
    }
}
6
sll

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;
  }
2
Abraham Roy

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

1
Kamran
for (int i=0;i < Table.Rows.Count;i++)
{
      Var YourValue = Table.Rows[i]["ColumnName"];
}
0