全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4416
推到 Plurk!
推到 Facebook!

如何一次回傳多個資料表

答題得分者是:cancer
superrakce
一般會員


發表:24
回覆:35
積分:11
註冊:2006-10-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-05-24 08:35:13 IP:114.33.xxx.xxx 訂閱
遠端連線資料庫,需要一次取回多個資料集
例如:
SELECT * FROM A_TABLE WHERE ID ='ID';
SELECT * FROM B_TABLE WHERE ID ='ID';
SELECT * FROM C_TABLE WHERE ID ='ID';

能否一次取回?
主要為減少與遠端資料庫往返的次數,以增加效率。
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-05-24 08:43:50 IP:59.120.xxx.xxx 未訂閱
我是不卻定你這三個資料是否要放在一起(做成一個資料集)
假如是的話
請用Union串起來即可


===================引 用 superrakce 文 章===================
遠端連線資料庫,需要一次取回多個資料集
例如:
SELECT * FROM A_TABLE WHERE ID ='ID';
SELECT * FROM B_TABLE WHERE ID ='ID';
SELECT * FROM C_TABLE WHERE ID ='ID';

能否一次取回?
主要為減少與遠端資料庫往返的次數,以增加效率。
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-05-24 08:59:42 IP:220.128.xxx.xxx 未訂閱
Hi, 應該是不可能的,用 Sql Server 2005 的 Management studio 可以這樣下指令,但傳回的資料,是分開三個 Grid 來呈現。
指明欄位名稱,欄位型和順序一致,可以用 union,但就您的目的來看,並非如此。
我覺得,為減少與遠端資料庫往返的次數,一次傳回,沒有甚麼好處,去讀硬碟的時間是相同的,而傳輸方面,在主機記憶體剩下不多的情形下,有可能反而比較慢,三個指令併在一起的資料比較大,要移動記憶體出來,比較麻煩,三個小指令分別傳回的話,就是三段小記憶體,比較好移動。
就算資料庫容許這樣做,一個 Dataset 就是存放一個資料集,才是正確的邏輯,好比一個身份證號碼,發給三個人,會亂掉。
===================引 用 superrakce 文 章===================
遠端連線資料庫,需要一次取回多個資料集
例如:
SELECT * FROM A_TABLE WHERE ID ='ID';
SELECT * FROM B_TABLE WHERE ID ='ID';
SELECT * FROM C_TABLE WHERE ID ='ID';

能否一次取回?
主要為減少與遠端資料庫往返的次數,以增加效率。
編輯記錄
cancer 重新編輯於 2011-05-23 19:00:35, 註解 無‧
superrakce
一般會員


發表:24
回覆:35
積分:11
註冊:2006-10-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-05-24 11:52:17 IP:114.33.xxx.xxx 訂閱
會有這個想法是之前在寫C#,C# 裡的DataSet 可以像我提的問題那樣,一次取回n個資料表
DataSet.tables[0] 、DataSet.tables[1]、DataSet.tables[2]....如此便可操作要使用的資料集
想說delphi 的強大,應該也有類似方便的功能

一切都是為了效率
三個資料集(假設每個傳回的table 有二百筆資料)
一、AP->DB(TABLE1)->AP->DB(TABLE2)->AP->DB(TABLE3)->AP
二、AP->DB(TABLE1、TABLE2、TABLE3)->AP

會是二比較快吧……

cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-05-24 13:49:39 IP:220.128.xxx.xxx 未訂閱
.net 的 DataSet,跟 Delphi 的 DataSet 並不相同,.net 的 DataSet 是 "資料表集合",這是 Delphi 所沒有的,但以 Delphi角度來看,可視為 DataSet 陣列。
再說,您怎麼知道資料是一次傳回來?還是多次傳回來?微軟應該不會把實作過程也公佈吧。
===================引 用 superrakce 文 章===================
會有這個想法是之前在寫C#,C# 裡的DataSet 可以像我提的問題那樣,一次取回n個資料表
DataSet.tables[0]? 、DataSet.tables[1]、DataSet.tables[2]....如此便可操作要使用的資料集
想說delphi 的強大,應該也有類似方便的功能

一切都是為了效率
三個資料集(假設每個傳回的table 有二百筆資料)
一、AP->DB(TABLE1)->AP->DB(TABLE2)->AP->DB(TABLE3)->AP
二、AP->DB(TABLE1、TABLE2、TABLE3)->AP

會是二比較快吧……

superrakce
一般會員


發表:24
回覆:35
積分:11
註冊:2006-10-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-05-24 14:30:00 IP:114.33.xxx.xxx 訂閱
微軟怎麼弄我也不清楚
目前就先分開傳,多謝大大指教
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-05-24 19:31:16 IP:220.128.xxx.xxx 未訂閱
謝謝大大結案給分,我自己也摸過一下 asp.net,感覺上,.net 的資料庫讀取方式有多種方法,做相同的事情,卻弄出各種各樣的方法,真是眼花撩亂,讓我覺得一定是有問題,才會一直提供新方法,但有一點我有看過國外網頁評論,就是 .net 的 Dataset 讀取方式,很佔資源,我寫的 asp.net 網頁,都是使用後來出來的 SqlDataSource,一個元件搞定,這個元件居然不用呼叫 Close 或 Open 之類的,連線設好之後,一填入 Sql 指令,不用呼叫 Open(),就直接讀取資料庫。

還是 Delphi 的資料庫讀取方式簡單易用,連線設好,元件都串接好,只要 ds.Close; ds.CommandText := ...; ds.Open,就讀取資料了,就算十年沒寫程式,也不容易忘記,因為實在太簡單了,.net 的 DataSet 因為太複雜了,我每次寫好沒多久就忘掉,都是拿先前的程式出來抄。
後來微軟又搞了一套資料庫的讀取指令,可以取代 Sql 指令,名稱忘了,不過,我卻完全沒有興趣,因為我們寫 Sql 指令,不是下 select, update, where 甚麼的就夠,常常要使用到資料庫本身提供的函式,例如 substring, len 之類的,還是用 sql 指令比較好。
===================引 用 superrakce 文 章===================
微軟怎麼弄我也不清楚
目前就先分開傳,多謝大大指教

編輯記錄
cancer 重新編輯於 2011-05-24 05:32:06, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-05-25 00:31:24 IP:122.126.xxx.xxx 訂閱
照我這樣做,拉1個adoconnection,連到pubs資料庫,再拉1個adodataset叫ds1,將connection設成剛那個,再拉一個adodataset名叫ds2,一個按鈕。


[code cpp]
int i=0;
ds1->Active = false;
ds1->CommandText = L"select * from jobs; select * from sales";
ds1->Active = true;

while (!ds1->Eof)
{
ds1->Next();
}


ds2->Recordset = ds1->NextRecordset(i);

while (!ds2->Eof)
{
ShowMessage(ds2->Fields->FieldByNumber(6)->Value);
ds2->Next();
}

[/code]


===================引 用 superrakce 文 章===================
微軟怎麼弄我也不清楚
目前就先分開傳,多謝大大指教
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
superrakce
一般會員


發表:24
回覆:35
積分:11
註冊:2006-10-09

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-05-25 09:16:21 IP:114.33.xxx.xxx 訂閱
依您給的範例作了測試
'SELECT * FROM A_TABLE;SELECT * FROM B_TABLE'
I:=0;
aq2.Recordset :=aq.NextRecordset(i);
I:=1;
aq3.Recordset :=aq.NextRecordset(i);
出現了錯誤:access Violation ,aq3.Recordset 筆數是0
所以,aq1預設是第一個資料集;aq2取得第二個資料集;aq3 只能吃自已(沒有第三個資料集)。
而且,不管 i 的值給他多少,他只會取得「NextRecordset」下一個資料集,那給值有什麼功能?

以下為測試時遇到的已解決的問題:
原來不能直接DS1.NextRecordset(0),要傳「變數」進去才行,否則出現下列錯誤:
TYPES OF ACTUAL AND FORMAL VAR PARAMETERS MUST BE IDENTICAL



目前有兩個新的小問題:
1. Open || Close 跟 Active := true || false 有什麼差別?
2.ds2如果只是要接ds1的其中一個資料集,為什麼需要connection ?還是說ds2會去連線到資料庫?
===================引 用 aftcast 文 章===================
照我這樣做,拉1個adoconnection,連到pubs資料庫,再拉1個adodataset叫ds1,將connection設成剛那個,再拉一個adodataset名叫ds2,一個按鈕。


[code cpp]
int i=0;
ds1->Active = false;
ds1->CommandText = L"select * from jobs; select * from sales";
ds1->Active = true;

while (!ds1->Eof)
{
ds1->Next();
}


ds2->Recordset = ds1->NextRecordset(i);

while (!ds2->Eof)
{
ShowMessage(ds2->Fields->FieldByNumber(6)->Value);
ds2->Next();
}

[/code]


===================引 用 superrakce 文 章===================
微軟怎麼弄我也不清楚
目前就先分開傳,多謝大大指教
編輯記錄
superrakce 重新編輯於 2011-05-24 19:47:16, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2011-05-25 09:23:48 IP:210.64.xxx.xxx 訂閱
我的範例自然是有測過是ok的,而你的錯誤看來是另一個問題。
我不用adoquery的,不知道為何幾乎delphi/bcb的人都愛用那個,那個元件不是真實ms ado 中的元件。
請使用adodataset。如果你想要用parameters來控制可參照我之前的一篇,我等一下查好補上來。

Open || Close 跟 Active := true || false 有什麼差別? 沒區別,是一樣的結果,結果一樣。

ds2不需要connection,我上面沒說要!連ACTIVE都不需要。

暫可以先測一下沒有PATRAMETERS的試一下吧!

補: 可參照右邊網址 http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=102388
但重點是最後的回覆,我簡截如下:

TAdoQuery裡的sql是不行的)

TAdoQuery裡的sql是不行的)

===================引 用 superrakce 文 章===================
依您給的範例作了測試,卻出現了以下的錯誤
TYPES OF ACTUAL AND FORMAL VAR PARAMETERS MUST BE IDENTICAL
ADOQuery 或者ADODataSet都一樣…

目前有兩個新的小問題:
1. Open || Close 跟 Active := true || false 有什麼差別?
2.ds2如果只是要接ds1的其中一個資料集,為什麼需要connection ?還是說ds2會去連線到資料庫?

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2011-05-24 19:29:20, 註解 無‧
superrakce
一般會員


發表:24
回覆:35
積分:11
註冊:2006-10-09

發送簡訊給我
#11 引用回覆 回覆 發表時間:2011-05-25 10:01:55 IP:114.33.xxx.xxx 訂閱
我先貼文再作進一步的測試,沒想到大大已經回文了,那個問題已解決,原來不是parameters 的問題,
而是這個問題:http://delphi.ktop.com.tw/board.php?cid=30&fid=1498&tid=95669
您的範例就漏看了一行「宣告 i:integer ; 」

ADOQuery、ADODataSet 都可以達到此目地,或者 RES1,RES2:_RECORDSET; 這樣子也行

ADOQuery、ADODataSet 沒有學到很深,所以我在使用上不覺的有什麼差別,只是看大家這麼用就跟著這麼用

目前問題已解決,多謝aftcast 讓我長知識,delphi 果然強大

===================引 用 aftcast 文 章===================
我的範例自然是有測過是ok的,而你的錯誤看來是另一個問題。
我不用adoquery的,不知道為何幾乎delphi/bcb的人都愛用那個,那個元件不是真實ms ado 中的元件。
請使用adodataset。如果你想要用parameters來控制可參照我之前的一篇,我等一下查好補上來。

Open || Close 跟 Active := true || false 有什麼差別? 沒區別,是一樣的結果,結果一樣。

ds2不需要connection,我上面沒說要!連ACTIVE都不需要。

暫可以先測一下沒有PATRAMETERS的試一下吧!

補: 可參照右邊網址 http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=102388
但重點是最後的回覆,我簡截如下:

TAdoQuery裡的sql是不行的)

TAdoQuery裡的sql是不行的)

===================引 用 superrakce 文 章===================
依您給的範例作了測試,卻出現了以下的錯誤
TYPES OF ACTUAL AND FORMAL VAR PARAMETERS MUST BE IDENTICAL
ADOQuery 或者ADODataSet都一樣…

目前有兩個新的小問題:
1. Open || Close 跟 Active := true || false 有什麼差別?
2.ds2如果只是要接ds1的其中一個資料集,為什麼需要connection ?還是說ds2會去連線到資料庫?

aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#12 引用回覆 回覆 發表時間:2011-05-25 10:55:16 IP:210.64.xxx.xxx 訂閱
唯一的差別就是 ADOQuery 沒有 uniocde的能力 !!   當你處理 unicode時你就會知道~   先給你一個印象,未來也許會用到。

^ ^


===================引 用 superrakce 文 章===================

ADOQuery、ADODataSet 沒有學到很深,所以我在使用上不覺的有什麼差別,只是看大家這麼用就跟著這麼用

目前問題已解決,多謝aftcast 讓我長知識,delphi 果然強大


------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#13 引用回覆 回覆 發表時間:2011-05-27 13:50:32 IP:220.128.xxx.xxx 未訂閱
應該是開發環境沒有 Unicode 能力吧?
用版次更高的 Delphi 就有 Unicode 能力了,我用 Delphi 2006 的 .net,TAdoQuery, TAdoDataSet,..AsString() 全部都是 Unicode,用最新版的 Delphi 肯定全部都是 Unicode。
===================引 用 aftcast 文 章===================
唯一的差別就是 ADOQuery 沒有 uniocde的能力 !!?? 當你處理 unicode時你就會知道~?? 先給你一個印象,未來也許會用到。

cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#14 引用回覆 回覆 發表時間:2011-05-27 13:54:59 IP:220.128.xxx.xxx 未訂閱
TAdoQuery 是全能元件,它可以做 TAdoDataSet 和 TAdoCommand 的工作,TAdoDataSet 不能做 insert,update 等 Sql 指令。
我是這樣分配的,畫面上的 DBGrid 用 TAdoDataSet,而短時間讀取資料並馬上關閉的,都是使用 TAdoQuery,程式碼較好了解。
===================引 用 aftcast 文 章===================
我的範例自然是有測過是ok的,而你的錯誤看來是另一個問題。
我不用adoquery的,不知道為何幾乎delphi/bcb的人都愛用那個,那個元件不是真實ms ado 中的元件。
請使用adodataset。如果你想要用parameters來控制可參照我之前的一篇,我等一下查好補上來。

aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#15 引用回覆 回覆 發表時間:2011-05-27 18:32:51 IP:210.64.xxx.xxx 訂閱
Delphi NET 是 .net framework,它當然是 unicode。 delphi 點net  不等於delphi。

用最新版的 Delphi 肯定全部都是 Unicode。 這當然是正確的,但也要2009版(含)以後才是可以unicode。

而我說的TAdoDataset 是無論幾版,無論是不是net 通通一開始就是unicode。

===================引 用 cancer 文 章===================
應該是開發環境沒有 Unicode 能力吧?
用版次更高的 Delphi 就有 Unicode 能力了,我用 Delphi 2006 的 .net,TAdoQuery, TAdoDataSet,..AsString() 全部都是 Unicode,用最新版的 Delphi 肯定全部都是 Unicode。


------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
js6749
一般會員


發表:0
回覆:3
積分:0
註冊:2011-04-21

發送簡訊給我
#16 引用回覆 回覆 發表時間:2011-06-20 11:04:21 IP:220.128.xxx.xxx 訂閱
cancer & aftcast 兩位針對adodatase跟adoquery的見解真是令小弟增廣見識,不過delphi 2009後雖支援unicode但是小弟使用delphi 2010連接oracle 9i時
,使用adoquery存取資料庫還是會有亂碼情形發生(存取越文字型),最後是update 新的oracle driver才得以解決.

不曉的兩位針對連接不同資料庫的unicode支援問題有沒有其他的見解.


===================引 用 aftcast 文 章===================
Delphi NET 是 .net framework,它當然是 unicode。 delphi 點net 不等於delphi。

用最新版的 Delphi 肯定全部都是 Unicode。 這當然是正確的,但也要2009版(含)以後才是可以unicode。

而我說的TAdoDataset 是無論幾版,無論是不是net 通通一開始就是unicode。

===================引 用 cancer 文 章===================
應該是開發環境沒有 Unicode 能力吧?
用版次更高的 Delphi 就有 Unicode 能力了,我用 Delphi 2006 的 .net,TAdoQuery, TAdoDataSet,..AsString() 全部都是 Unicode,用最新版的 Delphi 肯定全部都是 Unicode。


------

~Wrote by Eric.
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#17 引用回覆 回覆 發表時間:2011-06-21 14:58:19 IP:64.62.xxx.xxx 未訂閱

===================引 用 cancer 文 章===================
...恕删...
後來微軟又搞了一套資料庫的讀取指令<---LINQ,可以取代 Sql 指令,名稱忘了,不過,我卻完全沒有興趣,因為我們寫 Sql 指令,不是下 select, update, where 甚麼的就夠,常常要使用到資料庫本身提供的函式,例如 substring, len 之類的,還是用 sql 指令比較好。 ===================引 用 superrakce 文 章===================
微軟怎麼弄我也不清楚
目前就先分開傳,多謝大大指教

Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#18 引用回覆 回覆 發表時間:2011-09-14 08:57:04 IP:118.170.xxx.xxx 訂閱
你好 :

TClientDataset 搭配 DatasetField (Field.DataType 為 ftDataset) 應該可以達到你要的.

===================引 用 superrakce 文 章===================
遠端連線資料庫,需要一次取回多個資料集
例如:
SELECT * FROM A_TABLE WHERE ID ='ID';
SELECT * FROM B_TABLE WHERE ID ='ID';
SELECT * FROM C_TABLE WHERE ID ='ID';

能否一次取回?
主要為減少與遠端資料庫往返的次數,以增加效率。
系統時間:2024-11-25 19:56:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!