5

我正在使用 SqlDataAdapter 和 DataSet 从 MSSQL 服务器检索数据。从那个数据集中我正在创建一个数据表。我的目标是将表格的每一列转换为元素以逗号分隔的字符串。我想在使分隔符起作用之前,我会先尝试字符串转换。

该代码在 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 列,所有列都在网页上以每行一条记录适当地呈现。

我在http://msdn.microsoft.com/en-us/library/system.data.datacolumn.tostring.aspx看到了 LOOP2 的代码,这似乎完全符合我的需要,但它实际上并没有做我想要的。

LOOP2 唯一要做的就是在网页上写 4 行。每行都有相应表格列的标题,但没有其他数据。显然,要么是我的逻辑缺陷,要么我误解了 DataColumn 和 .toString 的工作原理。请帮我解决这个问题。提前致谢。

编辑:这是一个 SQL 查询结果示例,这就是表格的样子: 表格查询结果@ImageShack

我想要结束的是四个字符串,这是将从第二列创建的字符串的示例:“-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"字符串。


编辑: 我看到您选择将列声明为 var 而不是 DataColumn,这是个人喜好/风格的问题还是编码有问题?

考虑以下场景(在与上述相同的数据表示例中):

// 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 222两次。为什么?我们.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 回答