Rea*_*tor 5 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>");
}
Run Code Online (Sandbox Code Playgroud)
在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".
此代码将连接每列下的单元格的值", ":
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
}
Run Code Online (Sandbox Code Playgroud)
例如,对于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);
Run Code Online (Sandbox Code Playgroud)
......它会产生"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);
}
Run Code Online (Sandbox Code Playgroud)
我们假设我们现在得到了列值列表的列表.所以,当我们打印它们时,像这样:
foreach (var lisOfValues in columnsValues)
{
foreach (var value in listOfValues)
{
Debug.Write(value + " ");
}
Debug.WriteLine("");
}
Run Code Online (Sandbox Code Playgroud)
我们希望看到1 11 111随后2 22 222.对?
错了.
此代码将输出2 22 222两次.为什么?我们.Select(r => r[column].ToString()) 捕获 column变量 - 不是它的值,而是变量本身 - 并且由于我们不立即使用它,一旦我们离开循环,我们所知道的是最后的值column.
要了解有关此概念的更多信息,请搜索闭包和捕获的变量 - 例如,在此类帖子中.
摘要:
在这种情况下,很你可以走DataColumn在foreach声明.这并不重要,因为我们在.Select(r => r[dc])循环中通过我们的任何一种方式进行枚举(确切地说,string.Join对我们来说都是这样),在我们进行下一次迭代之前产生结果 - 无论我们捕获什么,都会立即使用.
| 归档时间: |
|
| 查看次数: |
17229 次 |
| 最近记录: |