5

SqlDataAdapter と DataSet を使用して MSSQL サーバーからデータを取得しています。その DataSet から、DataTable を作成しています。私の目標は、テーブルの各列を、要素がコンマで区切られた文字列に変換することです。区切り文字を機能させる前に、まず文字列変換を試みることにしました。

このコードは、ASP.Net ページのコード ビハインドで実行されます。最終的な目標は、文字列を jscript 変数に渡すことです。これは、列から区切られた文字列を作成し、最終的に jscript 変数にする必要がある「機能要件」です。

ここに私がこれまで持っているものがあります:

    DataSet myDataSet = new DataSet();
    mySqlDataAdapter.Fill(myDataSet);
    DataTable temperature = myDataSet.Tables["Table"];

    // LOOP1
    foreach (DataRow row in temperature.Rows)
    // this loop works fine and outputs all elements
    // of the table to the web page, this is just to
    // test things out
    {
        foreach (DataColumn col in temperature.Columns)
        {
            Response.Write(row[col] + " ### ");
        }
        Response.Write("<br>");
    }

    // LOOP2
    foreach (DataColumn column in temperature.Columns)
    // this loop was meant to take all elements for each
    // column and create a string, then output that string
    {
        Response.Write(column.ToString() + "<br>");
    }

LOOP1 では問題なく動作します。私のデータには 4 つの列があり、すべてが Web ページの行ごとに 1 つのレコードで適切にレンダリングされます。

http://msdn.microsoft.com/en-us/library/system.data.datacolumn.tostring.aspxでLOOP2 のコードを見ましたが、実際には必要なことを実行していないことを除いて、必要なことを正確に実行しているようです。

LOOP2 が行うことは、Web ページに 4 行を書き込むことだけです。各行には、それぞれのテーブル列のヘッダーがありますが、追加データはありません。明らかに、私の側に論理的な欠陥があるか、DataColumn と .toString がどのように機能するかを誤解しています。これについて私を助けてください。前もって感謝します。

編集: これは SQL クエリの結果の例です。これはテーブルがどのように見えるかです: テーブルクエリの結果 @ ImageShack

私が最終的に望むのは 4 つの文字列です。これは、2 番目の列から作成される文字列の例です: "-6.7, -7, -7.2, -7.3, -7.3".

4

3 に答える 3

9

このコードは、各列の下のセルの値を次のように連結します", "

foreach (var column in temperature.Columns)
{
    DataColumn dc = column as DataColumn;
    string s = string.Join(", ", temperature.Rows.OfType<DataRow>()
                                                 .Select(r => r[dc]));
    // do whatever you need with s now
}

たとえば、次のように定義された DataTable の場合:

DataTable table = new DataTable();
table.Columns.Add(new DataColumn("Column #1"));
table.Columns.Add(new DataColumn("Column #2"));
table.Rows.Add(1, 2);
table.Rows.Add(11, 22);
table.Rows.Add(111, 222);

..."1, 11, 111""2, 22, 222"文字列が生成されます。


編集: 列を DataColumn ではなく var として宣言することを選択したのを見ましたが、それは個人的な好み/スタイルの問題ですか、それともコーディングに問題がありますか?

次のシナリオを検討してください (上記と同じデータ テーブルの例で)。

// we decide we'll use results later, storing them temporarily here
List<IEnumerable<string>> columnsValues = new List<IEnumerable<string>>();
foreach (DataColumn column in temperature.Columns)
{
    var values = temperature.Rows.OfType<DataRow>()
                                 .Select(r => r[column].ToString())
    columnsValues.Add(values);
}

列値のリストのリストを取得したと仮定します。したがって、それらを印刷すると、次のようになります。

foreach (var lisOfValues in columnsValues)
{
    foreach (var value in listOfValues)
    {
        Debug.Write(value + " ");
    }

    Debug.WriteLine("");
}

1 11 111が続くと予想され2 22 222ます。右?

違う

このコードは2 22 2222 回出力されます。なんで?.Select(r => r[column].ToString()) 値ではなく、変数自体をキャプチャ しますcolumn。変数をすぐに使用しないため、ループを抜けると、の最後の値しかわかりませんcolumn

この概念の詳細については、クロージャキャプチャされた変数を検索してください(たとえば、このような投稿で) 。

まとめ

この場合、DataColumninforeachステートメントを使用できます。.Select(r => r[dc])ループ内でいずれかの方法で列挙しているため (正確にstring.Joinは、私たちのためにそれを行っています)、次の反復に到達する前に結果を生成しているため、ここでは問題ではありません。

于 2011-04-21T21:44:38.890 に答える
0

あなたが投稿したリンクは明確に述べています

プロパティが設定されている場合は、式の値。それ以外の場合は、ColumnNameプロパティ。

そしてそれが起こっていることです。列名を取得します。

于 2011-04-21T21:21:54.530 に答える
0

これは役に立ちます: C# で DataTable を文字列に変換する方法は?

于 2011-04-21T21:27:19.340 に答える