如何一次回傳多個資料表 |
答題得分者是:cancer
|
superrakce
一般會員 發表:24 回覆:35 積分:11 註冊:2006-10-09 發送簡訊給我 |
|
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
我是不卻定你這三個資料是否要放在一起(做成一個資料集)
假如是的話 請用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 發送簡訊給我 |
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 發送簡訊給我 |
會有這個想法是之前在寫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 發送簡訊給我 |
.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 發送簡訊給我 |
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
謝謝大大結案給分,我自己也摸過一下 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 發送簡訊給我 |
照我這樣做,拉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 發送簡訊給我 |
依您給的範例作了測試
'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 發送簡訊給我 |
我的範例自然是有測過是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 發送簡訊給我 |
我先貼文再作進一步的測試,沒想到大大已經回文了,那個問題已解決,原來不是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 發送簡訊給我 |
唯一的差別就是 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 發送簡訊給我 |
應該是開發環境沒有 Unicode 能力吧?
用版次更高的 Delphi 就有 Unicode 能力了,我用 Delphi 2006 的 .net,TAdoQuery, TAdoDataSet,..AsString() 全部都是 Unicode,用最新版的 Delphi 肯定全部都是 Unicode。 ===================引 用 aftcast 文 章=================== 唯一的差別就是 ADOQuery 沒有 uniocde的能力 !!?? 當你處理 unicode時你就會知道~?? 先給你一個印象,未來也許會用到。 |
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
===================引 用 cancer 文 章=================== ...恕删... 後來微軟又搞了一套資料庫的讀取指令<---LINQ,可以取代 Sql 指令,名稱忘了,不過,我卻完全沒有興趣,因為我們寫 Sql 指令,不是下 select, update, where 甚麼的就夠,常常要使用到資料庫本身提供的函式,例如 substring, len 之類的,還是用 sql 指令比較好。 ===================引 用 superrakce 文 章=================== 微軟怎麼弄我也不清楚 目前就先分開傳,多謝大大指教 |
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
你好 :
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'; 能否一次取回? 主要為減少與遠端資料庫往返的次數,以增加效率。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |