C#-DataReader无法返回多个结果集

C#-DataReader无法返回多个结果集,c#,sqldatareader,C#,Sqldatareader,我试图做的与OP在这里提出的问题类似: 我试图将一个或多个SQL查询的结果存储到单独的数据表中。上述问题方法的问题在于,它只适用于每个结果集中的离散值。最好使用DataTablesLoad(reader)方法将每个结果集存储在一条语句中,而不是遍历DataReader的所有列 在下面的代码中,我有两个SQL查询(尽管这适用于任意数量的查询),我尝试将其结果存储在临时数据表中,然后存储到数据表列表中。我的代码的问题是,它只返回第一个查询的结果集,添加后续查询会引发读卡器关闭异常 usin

我试图做的与OP在这里提出的问题类似:

我试图将一个或多个SQL查询的结果存储到单独的数据表中。上述问题方法的问题在于,它只适用于每个结果集中的离散值。最好使用DataTables
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。我已经在我的其他代码中这样做了。我上面发布的代码来自一个黑客控制台应用程序,我编写该应用程序是为了快速解决我的问题。