首页 > 解决方案 > 具有多个结果表的 SqlCommand

问题描述

我正在使用 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()总是错误的,所以我从来没有得到第二个表格结果。

有谁知道我做错了什么?我应该怎么做才能接收和读取查询的两个结果?

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

解决方案


如果这是使用存储过程,你需要这样的东西:注意命令类型

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];

推荐阅读