簡體   English   中英

帶有多個結果表的SqlCommand

[英]SqlCommand with more than one result table

我正在使用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()總是假的,所以我永遠不會得到第二個表的結果。

有誰知道我做錯了什么? 我該怎么做才能從查詢中接收和讀取兩個結果?

如果這是使用存儲過程,你需要這樣的東西: 注意命令類型

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

好的,我已經運行了一些測試,發現問題來自dataTable.Load(reader); 不知何故,我不知道為什么以及該方法背后究竟發生了什么。 但如果你使用

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

一切都按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM