C#-DataReader无法返回多个结果集
我试图做的与OP在这里提出的问题类似: 我试图将一个或多个SQL查询的结果存储到单独的数据表中。上述问题方法的问题在于,它只适用于每个结果集中的离散值。最好使用DataTablesC#-DataReader无法返回多个结果集,c#,sqldatareader,C#,Sqldatareader,我试图做的与OP在这里提出的问题类似: 我试图将一个或多个SQL查询的结果存储到单独的数据表中。上述问题方法的问题在于,它只适用于每个结果集中的离散值。最好使用DataTablesLoad(reader)方法将每个结果集存储在一条语句中,而不是遍历DataReader的所有列 在下面的代码中,我有两个SQL查询(尽管这适用于任意数量的查询),我尝试将其结果存储在临时数据表中,然后存储到数据表列表中。我的代码的问题是,它只返回第一个查询的结果集,添加后续查询会引发读卡器关闭异常 usin
Load(reader
)方法将每个结果集存储在一条语句中,而不是遍历DataReader的所有列
在下面的代码中,我有两个SQL查询(尽管这适用于任意数量的查询),我尝试将其结果存储在临时数据表中,然后存储到数据表列表中。我的代码的问题是,它只返回第一个查询的结果集,添加后续查询会引发读卡器关闭异常
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是否只是针对我的用例设计得很差,或者我这里缺少一些基本的东西。如果您更喜欢使用DataTable.Load(reader),请尝试以下解决方案:
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())
{
bool haveresult = true;
while (haveresult)
{
DataTable tempTable = new DataTable();
tempTable.Load(reader);
dataTables.Add(tempTable);
try
{
reader.Read();
}
catch
{
haveresult = false;
}
}
}
}
}
使用这种方法是因为在读取器获得最后一个结果后,无法控制何时关闭连接。请注意,这可以用于任何数量的查询DataReader不适合我的需要,它的使用会导致代码冗长,因此我使用了Daniel Kelly建议的DataAdapter。读取多个结果集的代码现在相对简单:
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand
("SELECT TOP 10 Name, [Description] FROM Business; SELECT TOP 10 ConnectionId FROM Connection;SELECT TOP 10 Name FROM Business", connection))
{
connection.Open();
SqlDataAdapter adapter = new SqlDataAdapter(command);
DataSet set = new DataSet();
adapter.SelectCommand = command;
//Note here, that the adapter will create multiple tables for each result set
adapter.Fill(set);
foreach (DataTable t in set.Tables)
{
dataTables.Add(t);
}
dataTables.Add(tempTable);
}
}
阅读您的评论后,我发现我对reader.Read()和NextResult()的理解有缺陷。此外,每次调用DataReader的load方法时,读取器的连接都将关闭
谢谢大家的评论和建议。我不会接受我自己的答案,因为那样会很自负 您的reader.NextResult()应该在第一个之外,而(reader.Read())应该根据您的建议进行更新。但这也会引发“Reader is closed exception”(读取器已关闭异常)。问题是,在加载最后一个结果后,Detriable.Load(读取器)会自动关闭连接,因此您不能将其嵌入到一段时间内(Reader.Read()),如果您仍要使用Detriable.Load(Reader),则可以在知道有多少查询结果的情况下执行此操作,在本例中,您有2个,因此,您可以尝试使用SqlDataAdapter
而不是SqlDataReader
。在使用DataTable.Load(reader)时,不需要使用reader.NextResult(),reader.Read()将在表上循环,请自己尝试。我将尝试创建多个表的方式。如果读取器在加载后关闭,那么您是如何创建第二个表的?我建议将SqlDataAdapter
的用法包装在中,使用块,因为我认为它实现了IDisposable
。谢谢您,Daniel。我已经在我的其他代码中这样做了。我上面发布的代码来自一个黑客控制台应用程序,我编写该应用程序是为了快速解决我的问题。