很多朋友問如何在unidac 中執行一次查詢獲得多個數據集?
其實這個問題很簡單,unidac 很早就支持這個功能,但是很多人沒有研究過。
今天就簡單說一下,在unidac 中執行一次查詢獲得多個數據集。首先這個需要數據庫支持,如果
數據庫不支持的話,unidac 也是沒有辦法實現的。
今天以sql server 2014 為例,說一下如何實現這個功能。
首先我們在uniquery中執行下面的查詢語句。
procedure TForm2.Button7Click(Sender: TObject); begin cx.SQL.Clear; cx.SQL.Add('SELECT * FROM DWB d'); cx.SQL.Add('SELECT * FROM FJRYB f'); cx.Open; end;
很明顯,如果我們直接運行這一段代碼,就會和正常的語句一樣,返回第一個select 語句的結果
那么我們怎么取得第二個數據集呢?很簡單
procedure TForm2.Button8Click(Sender: TObject); begin if not cx.OpenNext then exit; end;
我們只需調用OpenNext 過程。如果有第二個數據集,當前的數據集就移動到第二個數據集了
由於只有兩個數據集,如果再次執行opennext 就關閉數據集了。什么也不顯示了。
那么再來一次,又可以顯示第一個數據集了,說明這個opennext 是環形的。
當然了在存儲過程中這個也是類似的。
我們首先寫一個存儲過程。
CREATE PROCEDURE dbo.MYSUM @sumok INT OUTPUT AS BEGIN SET @sumok = 1 + 2 SELECT * FROM DWB d SELECT * FROM FJZB f END GO
我們要返回兩個數據集,一個輸出參數。
procedure TForm2.Button6Click(Sender: TObject); var i:integer; tablelist:Tlist<Tdataset> ; begin sp.Params[1].ParamType:=ptInputOutput; sp.Params[1].DataType:=ftInteger; sp.Params[1].AsInteger:=10; sp.Execute; repeat showmessage( sp.Fields[1].AsString); until not sp.OpenNext; i:=sp.Params[1].AsInteger; showmessage(i.ToString); end;
運行結果為:
說明一切運行正常。