【发布时间】:2014-06-26 10:55:58
【问题描述】:
我正在尝试做的类似于 OP 在此处询问的内容:
我正在尝试将一个或多个 SQL 查询的结果存储到单独的数据表中。上述问题方法的问题在于它仅适用于每个结果集中的离散值。最好使用 DataTables Load(reader) 方法将每个结果集存储在单个语句中,而不是遍历 DataReader 的所有列。
在下面的代码中,我有两个 SQL 查询(尽管这应该适用于任意数量的查询),我尝试将其结果存储在临时数据表中,然后存储到数据表列表中。我的代码的问题是它只返回第一个查询的结果集,添加后续查询会引发Reader is closed exception。
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand
("SELECT TOP 10 Column1, Column2 FROM Table1; SELECT TOP 10 Column1, Column2 FROM Table2", connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
tempTable.Reset();
tempTable.Load(reader);
dataTables.Add(tempTable);
}
if (reader.NextResult())
{
while (reader.Read())
{
tempTable.Reset();
tempTable.Load(reader);
dataTables.Add(tempTable);
}
}
}
}
}
我已经为此苦苦挣扎了好几个小时。我不确定 DataTable/DataReader 是否只是针对我的用例设计不佳,或者我在这里缺少一些基本的东西。
【问题讨论】:
-
你的 reader.NextResult() 应该在你的第一个 while(reader.Read()) 之外
-
根据您的建议进行了更新。不过,这也会引发“阅读器已关闭异常”。
-
问题是tempTable.Load(reader)在加载最后一个结果后会自动关闭连接,所以不能在while内嵌入(reader.Read())
-
如果你还想使用 tempTable.Load(reader),如果你知道你有多少个查询结果,你就可以这样做,在这种情况下你有 2 个,所以你在 for 循环中循环它直到达到结果数
-
您可以尝试使用
SqlDataAdapter而不是SqlDataReader。
标签: c# sqldatareader