如何将DataTable列的整个内容转换为C#中的分隔字符串?

时间:2011-04-21 21:17:06

标签: c# asp.net datatable dataset datacolumn

我正在使用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列,所有列都适当地呈现在网页上每行一条记录。

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

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

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

我最终想要的是四个字符串,这是从第二列创建的字符串示例:“ - 6.7,-7,-7.2,-7.3,-7.3”。

3 个答案:

答案 0 :(得分: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变量 - 不是它的值,而是变量本身 - 因为我们不立即使用它,所以一旦我们我们所知道的是{strong>最后值column

要详细了解此概念,请搜索闭包捕获的变量 - 例如,在this等帖子中。

<强>摘要

在这种情况下,您可以在DataColumn声明中使用foreach。这里没关系,因为我们在循环内部通过.Select(r => r[dc])枚举(确切地说,string.Join为我们做了这一点),在我们进入下一次迭代之前产生结果 - 无论我们捕获什么,立即使用。

答案 1 :(得分:0)

您发布的链接明确指出

  

表达式值,如果是属性   已设定;否则,ColumnName   属性。

这就是发生的事情。你得到了列名。

答案 2 :(得分:0)