带有多个结果表的SqlCommand

时间:2018-10-16 12:18:04

标签: c# asp.net sql-server-2008 visual-studio-2010

我正在使用Visual Studio 2010开发ASP.NET Web应用程序。我的目标框架是“ .NET Framework 4”,并且正在向SQL Server 2008数据库发送查询,该数据库版本是“ Microsoft SQL Server 2008 R2”。 (SP2)”。

我正在使用以下连接字符串"Data Source=XXXX;Initial Catalog=XXXX;Integrated Security=False;User Id=XXXX;Password= XXXX;MultipleActiveResultSets=True"进行连接,并使用以下代码发送查询:

public static List<DataTable> getData(String query)
{
    var results = new List<DataTable>();

    try
    {
        using (SqlConnection connection = new SqlConnection(ConnectionString))
        {
            using (SqlCommand command = new SqlCommand(query, connection))
            {
                connection.Open();
                command.CommandTimeout = 0;

                using (SqlDataReader reader = command.executeReader())
                {
                    do
                    {
                        while (reader.Read()) ;
                        var dataTable = new DataTable();
                        dataTable.Load(reader);
                        results.Add(dataTable);
                    } while (reader.NextResult());
                }

                connection.Close();
            }
        }
    }
}

我要发送的查询是一个存储过程,该存储过程返回两个表,首先,它具有一个循环,该循环根据某些内部条件,在tempdb..#table上的创建和插入以及两个SELECT语句来调用另一个存储过程。

但是现在它仅包含:

SELECT 1,2,3,4,5

SELECT 6,7,8,9,0

我不知道为什么,但是reader.NextResult()始终为假,因此我永远都不会得到第二张表的结果。

有人知道我在做什么错吗?我应该怎么做才能从查询中接收和读取两个结果?

2 个答案:

答案 0 :(得分:3)

如果这是使用存储的proc,则需要这样的内容:注意命令类型

using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(myConnString))
{
    using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand())
    {
        cmd.CommandText = "myMultipleTablesSP";
        cmd.Connection = conn;
        cmd.CommandType = CommandType.StoredProcedure;

        conn.Open();

        System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter(cmd);

        DataSet ds = new DataSet();
        adapter.Fill(ds);

        conn.Close();
    }
}

例如,如果您在SP中返回2个表,例如:

SELECT * FROM [TableA];
SELECT * FROM [TableB];

您将以以下方式访问此表:

DataTable tableA = ds.Tables[0];
DataTable tableB = ds.Tables[1];

答案 1 :(得分:0)

好的,我已经进行了一些测试,发现问题出自dataTable.Load(reader);,但我不知道该方法的原因以及到底发生了什么。 但是如果您使用

do {
   while(reader.Read()) {
      ...
   }
} while (reader.NextResult());

一切正常。