2017-06-19 50 views
0

我很難弄清楚如何讓多個SQL查詢在C#中工作。我有這樣的事情:C中的多個SQL查詢#

breakControlq.CommandText = 
      @"SELECT something as q1 From table" + 
      "SELECT somethingelse as q2 FROM table where this = this"; 

breakControlq.CommandType = CommandType.Text; 
breakControlq.Connection = hd01Connect; 
try 
{ 
    hd01Connect.Open(); 
    breakControlRead = breakControlq.ExecuteReader(); 
    while (breakControlRead.Read()) 
    { 
     textBox1.AppendText(breakControlRead["q1"].ToString()); 
     textBox2.AppendText(breakControlRead["q2"].ToString()); 
    } 
    catch(System.Data.SqlClient.SqlException ex) 
    { 
     MessageBox.Show(ex.Message, "Connection Error"); 
    } 

這可能嗎? 我是否必須對每個查詢重複連接/命令?

我在這方面很新穎,你們中的一些人會告訴我這已經在某個地方得到了回答,但是我搜索了那麼多帖子,以至於當開始搜索解決方案時我更加困惑。

+0

我建議你同時運行查詢分開。您可以重用命令和連接對象。在你的情況下,我沒有看到需要立即運行查詢接受,以避免2個數據庫調用。 – Habeeb

+0

替代方法是將查詢包裝在存儲過程中並執行它。然後您可以將值讀取爲2個表格。如果你想減少數據庫命中的數量,就是這種情況。 – Habeeb

+0

爲了記錄,我**不認爲上述鏈接的帖子(https://stackoverflow.com/questions/13677318/how-to-run-multiple-sql-commands-in-a-single-sql連接)是這個的重複;該問題是詢問如何分別運行兩個查詢**;這個問題是問如何在**單個**查詢中發出多個'SELECT'。完全不同的東西!由@PaulF添加的看起來好多了:https://stackoverflow.com/questions/12715620/how-do-i-return-multiple-result-sets-with-sqlcommand –

回答

3

您正在尋找.NextResult().Read()方法更改爲當前網格中的下一行; .NextResult()移動到下一個網格

while (breakControlRead.Read()) 
{ 
    // process rows from first grid 
} 
if(breakControlRead.NextResult()) { 
    while (breakControlRead.Read()) 
    { 
     // process rows from second grid 
    } 
} 

可選擇地; 「短小精悍」 將通過.QueryMultiple()使本:

using(var multi = conn.QueryMultiple(sql, args)) { 
    var s = multi.Read<string>().AsList(); // items from first grid 
    var i = multi.ReadSingle<int>(); // items from second grid 
    // ... 
} 

注意!你確實需要確保你的兩個查詢被空格或;分開;你的情況,這將是罰款:

@"SELECT something as q1 From table 
     SELECT somethingelse as q2 FROM table where this = this"; 

(注意空格)

另一種更正確:

@"SELECT something as q1 From table; 
     SELECT somethingelse as q2 FROM table where this = this;"; 

或:

@"SELECT something as q1 From table;SELECT somethingelse as q2 FROM table where this = this;"; 
+0

完美的,就是這樣。只需將SQL更改爲:select something as q1從表「+ 」SELECT somethingelse as q2 FROM table where this = this「;並添加了第一個選項,現在工作得很好,非常感謝... – Hugo

+0

爲什麼在最後一次查詢結束時是否需要最後一個「;」? – Hugo

+0

@Hugo最好的練習比其他任何事情都好;如果說查詢引擎即使省略也能應付它,那麼你會是正確的 - 但是如果你得到進入多操作命令:爲什麼不能同時獲得100%正確的語法? –

0

我無法弄清楚如何獲得更多然後一個SQL查詢在C# 工作

那麼,在存儲過程中包裝兩個SQL語句,並呼籲從程序你像

​​

應用程序代碼見How to: Execute a Stored Procedure that Returns Rows以獲取更多信息

+1

您不需要存儲過程來發出多個查詢,並且它不會改變您從ADO.NET與它進行交互的方式。我不認爲這個答案可以增加對這裏做什麼的理解。 –

+0

@MarcGravell,這是正確的,但不建議通過特別查詢方式發送大量文本 – Rahul

+0

我必須在數據庫中創建一個sp只是爲了在C#中有多個查詢?如果我在編寫代碼時不得不做更多的查詢,那麼這只是我想要做的一小部分?我是否需要在sp中查詢所有查詢,然後在應用代碼中調用sp? – Hugo