2011-08-19 50 views
25

私は実際に苦労しているDataRowに問題があります。DataRow:指定した列名でセルの値を選択します。

datarowは、OleDbConnectionを使用してExcelスプレッドシートから読み込まれます。

列名を使用してDataRowからデータを選択しようとすると、そこにデータがあるのにDBNullが返されます。

しかし、それほど単純ではありません。

datarow.Table.Columns[5].ColumnNameは "my column"を返します。
datarow["my column"]は、DBNullを返します。
datarow[5]が返されます。
datarow[datarow.Table.Columns[5].ColumnName]は、DBNullを返します。

カラム番号を使ってdatarowから選択するだけでいいですが、カラムの順序が変わってもソフトウェアは壊れてしまいます。

+0

datarow.Table.Rows? – sll

+0

あなたのコードを表示できますか? – Reniuz

+0

スプレッドシートの外観は?上に空白の行がありますか?あなたの接続文字列は何ですか?それを再現するために必要なコードの最小量は何ですか? (サンプルシートを含む) – Will

答えて

37

以上を追加しましたか? .NET 3.5以降では、System.Data.DataSetExtensionsアセンブリがあり、これにはdataTables、dataRowsなどのさまざまな便利な拡張機能が含まれています。

あなたはそれが動作しない場合は、あなたがこれを行うことができ

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)); 
} 
+0

これを答えとしてマークすると、何が起こっているのかわかりました。クイックウォッチを使用しているときに間違った列IDを入力したと思います。正しい列IDを入力すると、行にデータがあってもnullが返されました。なぜそれがnullを返すのかは完全にはわかりませんが、データ型を解釈することとは何かがあると思います。これは、NULL以外の値を持つ唯一の行であり、他のすべての行で0を0に置き換えるためです。この行の正しい値を返すようにしました。 – VaticanUK

4

ヒント

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"); 

EDIT:どの.NETのバージョンを使用している

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];   
    } 
} 
+0

このコードを使用すると、**列名**でデータを取得できますか? – Reniuz

+0

@ Reenuuz:updated – sll

33

これは、新しい機能か何かでなければならない、そうでなければ私はなぜわからないんだけど言及されていない。

あなたはrow["ColumnName"]を使用してDataRowオブジェクト内の列の値にアクセスすることができます。

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

データエントリがNULLの場合は、ToStringが呼び出されたときにエラーがスローされると考えられます。 – Zorgarath

+0

@Zorgarath、本当の事実。 'table'に行がない場合にもエラーが発生します。 – Jimmy

1

ジミーが言ったことの上に、あなたはまた、必要に応じてヌルチェックと一緒にConvert.ChangeTypeを使用して、選択は一般的なことができます。

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

私はそれが簡単に次の操作を行って、それをアクセスするために見つける:

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

     } 
関連する問題