我正在使用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”。
答案 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)