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

如何讓多次查詢過的資料累積並顯示出來??

答題得分者是:GrandRURU
老大仔
尊榮會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-08-19 17:01:10 IP:59.120.xxx.xxx 未訂閱
大家好,小弟有個問題想請教一下,
當我在查詢資料(以ADOQuery下SQL指令)時,
要如何將上一次所查詢出來的資料與這次的查詢資料直接放在一起呢?
舉例來說...
上一次所查詢出來的資料為:
AAA
BBB
CCC
此時DBGrid所顯示的就是:
AAA
BBB
CCC

而這次(第二次查詢)所查詢出來的資料為:
DDD
EEE
FFF
此時DBGrid所顯示出來的不是DDD、EEE"FFF,而應該是要:
AAA
BBB
CCC
DDD
EEE
FFF

當然,假如還有下次的查詢,也是需再加上的,
除非使用者想重新查詢,才需清空重來。

小弟想法太天真...
想說可以用DataSet的資料累加上來@@
便用了以下方法:
DBGrid1.DataSource.DataSet := DBGrid1.DataSource.DataSet DataSource2.DataSet;
但因為太天真了..所以理所當然是失敗的/ \
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-08-19 17:52:40 IP:59.120.xxx.xxx 訂閱
搭配ClientDataSet吧
TClinetDataSet的方法中有一項「AppendData」,理應符合你的需要

實際的用法:
如何将一ClientDataSet的数据添加至另一ClientDataSet中?


===================引 用 老大仔 文 章===================
大家好,小弟有個問題想請教一下,
當我在查詢資料(以ADOQuery下SQL指令)時,
要如何將上一次所查詢出來的資料與這次的查詢資料直接放在一起呢?
舉例來說...
上一次所查詢出來的資料為:
AAA
BBB
CCC
此時DBGrid所顯示的就是:
AAA
BBB
CCC

而這次(第二次查詢)所查詢出來的資料為:
DDD
EEE
FFF
此時DBGrid所顯示出來的不是DDD、EEE"FFF,而應該是要:
AAA
BBB
CCC
DDD
EEE
FFF

當然,假如還有下次的查詢,也是需再加上的,
除非使用者想重新查詢,才需清空重來。

小弟想法太天真...
想說可以用DataSet的資料累加上來@@
便用了以下方法:
DBGrid1.DataSource.DataSet := DBGrid1.DataSource.DataSet DataSource2.DataSet;
但因為太天真了..所以理所當然是失敗的/ \
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-08-19 20:43:39 IP:114.35.xxx.xxx 訂閱
要使用 GrandRURU 提供的方法有一個前提,就是 ClientDataSet 所有欄位的 ProviderFlags 中不可有 pfInKey
有 pfInKey 的欄位資料是不可重複的,否則會發 Key Violation 的 Exception
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
smallfox
高階會員


發表:2
回覆:113
積分:128
註冊:2003-02-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-08-22 00:39:58 IP:203.67.xxx.xxx 訂閱
在第N次查詢的 SQL command 與第N-1次查詢的 SQL command 之間,

使用 UNION 指令, 以查出所有資料.

(不知你的 SQL command 熟悉程度如何, 希望這樣描述你看得懂)

老大仔
尊榮會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-08-22 15:46:29 IP:59.120.xxx.xxx 未訂閱

To GrandRURU大大:
您分享的連結我有閱讀過了
假如是用AppendData方法
那裡面的參數要怎麼替換掉呢??
因為範例中是用AppendData(ClinetDataSet, ....)
而我撈資料的元件是用TADOQuery
所以不太知道要怎麼替換掉
===================引 用 GrandRURU 文 章===================
搭配ClientDataSet吧
TClinetDataSet的方法中有一項「AppendData」,理應符合你的需要

實際的用法:
如何将一ClientDataSet的数据添加至另一ClientDataSet中?



老大仔
尊榮會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-08-22 15:47:06 IP:59.120.xxx.xxx 未訂閱
To sryang大大:
您說的...我看不懂/ \
小弟實力還不到那個火候><

===================引 用 sryang 文 章===================
要使用 GrandRURU 提供的方法有一個前提,就是 ClientDataSet 所有欄位的 ProviderFlags 中不可有 pfInKey
有 pfInKey 的欄位資料是不可重複的,否則會發 Key Violation 的 Exception
老大仔
尊榮會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-08-22 15:48:19 IP:59.120.xxx.xxx 未訂閱
To smallfox大大:
您說的方式我剛好也有想過
就是每次查詢時把上次的SQL指令累積下來
然後再與這次的SQL指令union起來
可是這樣子做的話
就會把上次的資料又再查詢一次
然後才繼續(union)這次的查詢
按照這樣下去...
那萬一使用者查了個3~4次的話
應該會很耗時@@
所以這方法我還不太敢採用

===================引 用 smallfox 文 章===================
在第N次查詢的 SQL command 與第N-1次查詢的 SQL command 之間,

使用 UNION 指令, 以查出所有資料.

(不知你的 SQL command 熟悉程度如何, 希望這樣描述你看得懂)

GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-08-22 16:10:05 IP:59.120.xxx.xxx 訂閱
改變作法不多,但會讓你覺得毛毛的
技法:
MyBase資料庫的應用

需要:
TDataSetProvider * 1
TClientDataSet * 2

將 DataSetProvider1 和 ClientDataSet1 指向到ADOQuery1

由ClientDataSet1來取得資料

然後把ClientDataSet1取得的資料倒入ClientDataSet2
也就是
ClientDataSet2.AppendData(ClientDataSet1, False);
這個作法

就像Sryang大所說的一樣,要注意資料是否會因重複而產生衝突 (如果ClientDataSet2沒設定PK就不需注意)

還有在這邊的ClientDataSet2的資料結構必須和ClientDataSet1一樣


===================引 用 老大仔 文 章===================

To GrandRURU大大:
您分享的連結我有閱讀過了
假如是用AppendData方法
那裡面的參數要怎麼替換掉呢??
因為範例中是用AppendData(ClinetDataSet, ....)
而我撈資料的元件是用TADOQuery
所以不太知道要怎麼替換掉
===================引 用 GrandRURU 文 章===================
搭配ClientDataSet吧
TClinetDataSet的方法中有一項「AppendData」,理應符合你的需要

實際的用法:
如何将一ClientDataSet的数据添加至另一ClientDataSet中?



編輯記錄
GrandRURU 重新編輯於 2011-08-22 02:41:06, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-08-22 17:11:41 IP:118.169.xxx.xxx 未訂閱
嗨! 老大仔
依你的實力應該不致是low level 的級數, 所以我提供的做法, 不知你接受否, 還是你想要更高技巧的
如果是對初學者, 我的建議是
先創建一個db檔, 然後把每一次查詢的結果append到這裡面就好了, 這樣應該夠簡單明瞭了!
優點:簡單, 先決條件只要你會基礎資料庫的操控即可, 沒有任何技術可言
缺點:必須先創建一個已存在的資料庫檔, 只能適用於已知欄位個數的運用, 如果你每次都是不同的檔案, 不同的欄位結構, 那就很麻煩了(我不是說做不到哦! 上面已提是就初學者來談)

如果是已有中等程度的資料庫經驗,
如樓主使用 clientdataset 來做, 也不失一個方法, 其實與上面的db是同出一轍

如果你對資料庫有深入研究,
不妨考慮使用kbm元件, 很容易建立不同的資料庫的欄位及結構, 甚至將原檔的結構如數一行指令複製過去都成, 再來要附加資料也可以一行指令完成, 是我用到目前為止, 比clientdataset 元件要好用, 要更強的工具
===================引 用 老大仔 文 章===================
大家好,小弟有個問題想請教一下,
當我在查詢資料(以ADOQuery下SQL指令)時,
要如何將上一次所查詢出來的資料與這次的查詢資料直接放在一起呢?
舉例來說...
上一次所查詢出來的資料為:
AAA
BBB
CCC
此時DBGrid所顯示的就是:
AAA
BBB
CCC

而這次(第二次查詢)所查詢出來的資料為:
DDD
EEE
FFF
此時DBGrid所顯示出來的不是DDD、EEE"FFF,而應該是要:
AAA
BBB
CCC
DDD
EEE
FFF

當然,假如還有下次的查詢,也是需再加上的,
除非使用者想重新查詢,才需清空重來。

小弟想法太天真...
想說可以用DataSet的資料累加上來@@
便用了以下方法:
DBGrid1.DataSource.DataSet := DBGrid1.DataSource.DataSet DataSource2.DataSet;
但因為太天真了..所以理所當然是失敗的/ \
salo0610
高階會員


發表:42
回覆:120
積分:107
註冊:2003-02-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2011-08-22 17:30:03 IP:60.249.xxx.xxx 未訂閱
嗯!!  搭配ClientDataSet   

但要控制資料重覆的 Append 到 ClientDataSet


===================引 用 GrandRURU 文 章===================
搭配ClientDataSet吧
TClinetDataSet的方法中有一項「AppendData」,理應符合你的需要

實際的用法:
如何将一ClientDataSet的数据添加至另一ClientDataSet中?


===================引 用 老大仔 文 章===================
大家好,小弟有個問題想請教一下,
當我在查詢資料(以ADOQuery下SQL指令)時,
要如何將上一次所查詢出來的資料與這次的查詢資料直接放在一起呢?
舉例來說...
上一次所查詢出來的資料為:
AAA
BBB
CCC
此時DBGrid所顯示的就是:
AAA
BBB
CCC

而這次(第二次查詢)所查詢出來的資料為:
DDD
EEE
FFF
此時DBGrid所顯示出來的不是DDD、EEE"FFF,而應該是要:
AAA
BBB
CCC
DDD
EEE
FFF

當然,假如還有下次的查詢,也是需再加上的,
除非使用者想重新查詢,才需清空重來。

小弟想法太天真...
想說可以用DataSet的資料累加上來@@
便用了以下方法:
DBGrid1.DataSource.DataSet := DBGrid1.DataSource.DataSet DataSource2.DataSet;
但因為太天真了..所以理所當然是失敗的/ \
mephise
高階會員


發表:4
回覆:149
積分:205
註冊:2004-02-09

發送簡訊給我
#11 引用回覆 回覆 發表時間:2011-08-22 21:06:34 IP:220.137.xxx.xxx 訂閱
我不熟 M$ SQL, 不知道這樣行不行, Oracle倒是可以的

Select * from A where ......
union
Select * from A where ........
union
Select * from A where ........ 可以一直延伸, 直到機器操掛為止

union 的意思, 就是假設兩個結構完全相同的 Table, 你可以利用 union 變成一個新的臨時 Table, 資料內容就是兩個 Table 相加
如果你可以保證資料完全不會重覆, 可以用 union all 取代 union, 速度我上次測試快至少20倍

------
Mephise Chen
前興德工程師
編輯記錄
mephise 重新編輯於 2011-08-22 07:10:20, 註解 無‧
smallfox
高階會員


發表:2
回覆:113
積分:128
註冊:2003-02-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2011-08-23 00:45:47 IP:211.74.xxx.xxx 訂閱
1. 如果每一次查詢都要 Append 個 10,000 筆資料, 使用者查詢個 3 - 4 次,

你覺得是在 Client 端快, 還是在 Server 端快, 你自己可以評估.

2. 如果你開發的是多使用者的系統, 在第 N-1 次的查詢資料中, 也許會有其他使用者異動或新增了紀錄,

如果每次查詢都能更新, 重新取得最新的資料, 可以避免萬一你需要在前端修改並回存資料時, 發生問題.

3. 前幾位前輩所說的都是很好的解決方式, 但哪一種合適,

你需要依你的系統規模, 查詢筆數, 網路速度, Client 效能, 未來增量等因素來評估.
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#13 引用回覆 回覆 發表時間:2011-08-23 11:05:48 IP:61.66.xxx.xxx 訂閱
 您好:
我都是用 ListView 來解決這個問題
裡面有個好用的func:FindCaption
只要找不到資料就會回傳 nil
這時候在做新增動作~

VAR L1,L2:TListItem;

L2:= LISTVIEW1.FindCaption(0,'AAA',false,true,false);
IF L2=NIL THEN
BEGIN
L1:=LISTVIEW1.ITEMS.ADD;
L1.CAPTION:='AAA';
L1.SUBITEMS.ADD('???');
END;
------
======================
昏睡~
不昏睡~
不由昏睡~
老大仔
尊榮會員


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2011-08-23 14:37:17 IP:59.120.xxx.xxx 未訂閱
謝謝GrandRURU、sryang、P.D.、salo0610、mephise、smallfox、ko等各位前輩的建議
小弟我目前先採用了GrandRURU大大的方法
而小弟做了個測試
可是卻是得到Access violation 的錯誤訊息
以下是小弟的測試方式:
-----------------------------------------------
ADOConnection1 連到主機資料庫(MSSQL2005)

ADOQuery1 連到 ADOConnection1 (這是最後拿來做儲存資料用,目前用不到)
DBGrid1.DataSource 連到 DataSource1 再連到 ADOQuery1

ADOQuery2 連 ADOConnection1 (用於查詢)
DataSetProvider1.DataSet 連到 ADOQuery2
ClientDataSet.ProviderName 連到 DataSetProvider1

程式碼:
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery2.Close;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add(' Select Top 10 日期, 單號, 發票號碼, 身分證號, 姓名 From AAA ');
ADOQuery2.Prepared := True;
ADOQuery2.Open;
ClientDataSet2.AppendData(ClientDataSet1.Data, False);
end;

-----------------------------------------------
程式只要一到AppendData時就會出現:

Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 004BE2E4 in module 'Project1.exe'.
Read of address 00000000'.
Process stopped.
Use Step or Run to continue.

(為避免訊息太長,所以我有斷行)

請問為什麼會這樣呢?


ps: 以上的測試還沒寫到顯示出資料的部份
可是小弟後來有再測試是否有資料
DBGrid1.DataSource 連到 DataSource1 再連到 ClientDataSet1
結果沒反應...
編輯記錄
老大仔 重新編輯於 2011-08-23 00:38:43, 註解 無‧
老大仔 重新編輯於 2011-08-23 01:38:24, 註解 無‧
老大仔
尊榮會員


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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2011-08-23 14:55:37 IP:59.120.xxx.xxx 未訂閱
TO P.D.大大:
小弟確實還是個小小新手^^
實力還需再加強,多多學習
您所提供的方法小弟都是願意去學的
畢竟,那也是一門技術~

您的第一個方式我後來有想過
先建個專門暫存這些查詢過的資料的Table
每查一次就存一次
然後再撈出來放到DBGrid中
除非是要重新查詢才需清空
這方法我還在保留中
因為我想測試多一些方法看看
然後再來決定哪個方式比較好維護
(感覺上應該是這個方法較易維護)

第二個方法小弟目前正在測試中~

第三個方法
我知道有kbm這元件但就是還沒用過@@
假如會用到第三方元件的話
上面的人可能不接受= =
但經您這麼一說
我還是會找時間去測試看看的
因為多學一個方法就多增長一些知識^^


===================引 用 P.D. 文 章===================
嗨! 老大仔
依你的實力應該不致是low level 的級數, 所以我提供的做法, 不知你接受否, 還是你想要更高技巧的
如果是對初學者, 我的建議是
先創建一個db檔, 然後把每一次查詢的結果append到這裡面就好了, 這樣應該夠簡單明瞭了!
優點:簡單, 先決條件只要你會基礎資料庫的操控即可, 沒有任何技術可言
缺點:必須先創建一個已存在的資料庫檔, 只能適用於已知欄位個數的運用, 如果你每次都是不同的檔案, 不同的欄位結構, 那就很麻煩了(我不是說做不到哦! 上面已提是就初學者來談)

如果是已有中等程度的資料庫經驗,
如樓主使用 clientdataset 來做, 也不失一個方法, 其實與上面的db是同出一轍

如果你對資料庫有深入研究,
不妨考慮使用kbm元件, 很容易建立不同的資料庫的欄位及結構, 甚至將原檔的結構如數一行指令複製過去都成, 再來要附加資料也可以一行指令完成, 是我用到目前為止, 比clientdataset 元件要好用, 要更強的工具

編輯記錄
老大仔 重新編輯於 2011-08-23 01:00:36, 註解 無‧
老大仔
尊榮會員


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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2011-08-23 15:00:08 IP:59.120.xxx.xxx 未訂閱
To mephise大大:
union的方法小弟知道
MSSQL也是用union的語法
您的意思應該是與smallfox大大相同的
只是這方式會再每一次查詢時
再與上次所累積的語法合併
然後再查一次
這樣下去
之前所查詢過的還要再查詢一次
會"多做了好次"
所以這方法目前還沒考量進來><


===================引 用 mephise 文 章===================
我不熟 M$ SQL, 不知道這樣行不行, Oracle倒是可以的

Select * from A where ......
union
Select * from A where ........
union
Select * from A where ........ 可以一直延伸, 直到機器操掛為止

union 的意思, 就是假設兩個結構完全相同的 Table, 你可以利用 union 變成一個新的臨時 Table, 資料內容就是兩個 Table 相加
如果你可以保證資料完全不會重覆, 可以用 union all 取代 union, 速度我上次測試快至少20倍

GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#17 引用回覆 回覆 發表時間:2011-08-23 15:21:16 IP:59.120.xxx.xxx 訂閱
因為使用了DataSnap,所以後續的動作幾乎會在ClientDataSet上使用
看您的作法好像是要把收集的ClientDataSet2寫回到資料庫中,那麼以我來說
配置原則是一個ADOQuery對一個ADOConnection
所以實際上的配法可能會是
ADOConnection1 ADOQuery1 DataSetProvider1 ClientDataSet1 DataSource1 DBGrid1
ADOConnection2 ADOQuery2 DataSetProvider2 ClientDataSet2 DataSource2 DBGrid2

設定在ADOQuery1,但啟動的工作交給ClientDataSet1來做
ClientDataSet2則保持開啟

然後程式段的部份會像是
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientDataSet1.Close;
ADOQryTmp.SQL.Clear;
ADOQryTmp.SQL.Add(' Select Top 10 日期, 單號, 發票號碼, 身分證號, 姓名 From AAA ');
ADOQryTmp.Prepared := True;
ClientDataSet1.Open;
ClientDataSet2.AppendData(ClientDataSet1.Data, False);
end;

如此一來,就可以在同一個畫面上看到你的結果了。

===================引 用 老大仔 文 章===================
謝謝GrandRURU、sryang、P.D.、salo0610、mephise、smallfox、ko等各位前輩的建議
小弟我目前先採用了GrandRURU大大的方法
而小弟做了個測試
可是卻是得到Access violation 的錯誤訊息
以下是小弟的測試方式:
-----------------------------------------------
ADOConnection1 連到主機資料庫(MSSQL2005)

ADOQuery1 連到 ADOConnection1 (這是最後拿來做儲存資料用,目前用不到)
DBGrid1.DataSource 連到 DataSource1 再連到 ADOQuery1

ADOQuery2 連 ADOConnection1 (用於查詢)
DataSetProvider1.DataSet 連到 ADOQuery2
ClientDataSet.ProviderName 連到 DataSetProvider1

程式碼:
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQryTmp.Close;
ADOQryTmp.SQL.Clear;
ADOQryTmp.SQL.Add(' Select Top 10 日期, 單號, 發票號碼, 身分證號, 姓名 From AAA ');
ADOQryTmp.Prepared := True;
ADOQryTmp.Open;
ClientDataSet2.AppendData(ClientDataSet1.Data, False);
end;

-----------------------------------------------
程式只要一到AppendData時就會出現:

Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 004BE2E4 in module 'Project1.exe'.
Read of address 00000000'.
Process stopped.
Use Step or Run to continue.

(為避免訊息太長,所以我有斷行)

請問為什麼會這樣呢?


ps: 以上的測試還沒寫到顯示出資料的部份
可是小弟後來有再測試是否有資料
DBGrid1.DataSource 連到 DataSource1 再連到 ClientDataSet1
結果沒反應...
老大仔
尊榮會員


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

發送簡訊給我
#18 引用回覆 回覆 發表時間:2011-08-23 15:37:46 IP:59.120.xxx.xxx 未訂閱
To GrandRURU大大: 
其實ADOQryTmp就是ADOQuery2啦 @@
只是我在PO文過來時沒有改好就PO了
真糟糕>"<
Sorry
下次會注意


===================引 用 GrandRURU 文 章===================
因為使用了DataSnap,所以後續的動作幾乎會在ClientDataSet上使用
看您的作法好像是要把收集的ClientDataSet2寫回到資料庫中,那麼以我來說
配置原則是一個ADOQuery對一個ADOConnection
所以實際上的配法可能會是
ADOConnection1 ADOQuery1 DataSetProvider1 ClientDataSet1 DataSource1 DBGrid1
ADOConnection2 ADOQuery2 DataSetProvider2 ClientDataSet2 DataSource2 DBGrid2

設定在ADOQuery1,但啟動的工作交給ClientDataSet1來做
ClientDataSet2則保持開啟

然後程式段的部份會像是
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientDataSet1.Close;
ADOQryTmp.SQL.Clear;
ADOQryTmp.SQL.Add(' Select Top 10 日期, 單號, 發票號碼, 身分證號, 姓名 From AAA ');
ADOQryTmp.Prepared := True;
ClientDataSet1.Open;
ClientDataSet2.AppendData(ClientDataSet1.Data, False);
end;

如此一來,就可以在同一個畫面上看到你的結果了。

===================引 用 老大仔 文 章===================
謝謝GrandRURU、sryang、P.D.、salo0610、mephise、smallfox、ko等各位前輩的建議
小弟我目前先採用了GrandRURU大大的方法
而小弟做了個測試
可是卻是得到Access violation 的錯誤訊息
以下是小弟的測試方式:
-----------------------------------------------
ADOConnection1 連到主機資料庫(MSSQL2005)

ADOQuery1 連到 ADOConnection1 (這是最後拿來做儲存資料用,目前用不到)
DBGrid1.DataSource 連到 DataSource1 再連到 ADOQuery1

ADOQuery2 連 ADOConnection1 (用於查詢)
DataSetProvider1.DataSet 連到 ADOQuery2
ClientDataSet.ProviderName 連到 DataSetProvider1

程式碼:
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery2.SQL.Clear;
ADOQuery2.Prepared := True;
ADOQuery2.Open;
ClientDataSet2.AppendData(ClientDataSet1.Data, False);
end;

-----------------------------------------------
程式只要一到AppendData時就會出現:

Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 004BE2E4 in module 'Project1.exe'.
Read of address 00000000'.
Process stopped.
Use Step or Run to continue.

(為避免訊息太長,所以我有斷行)

請問為什麼會這樣呢?


ps: 以上的測試還沒寫到顯示出資料的部份
可是小弟後來有再測試是否有資料
DBGrid1.DataSource 連到 DataSource1 再連到 ClientDataSet1
結果沒反應...
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#19 引用回覆 回覆 發表時間:2011-08-23 15:44:47 IP:59.120.xxx.xxx 訂閱
原來是我誤會了,失禮失禮
ClientDataSet2的部份可以先在Design Mode時就先開好
那這樣應該就ok了
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientDataSet1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(' Select Top 10 日期, 單號, 發票號碼, 身分證號, 姓名 From AAA WHERE 條件 ');
ADOQuery1.Prepared := True;
ClientDataSet1.Open;
ClientDataSet2.AppendData(ClientDataSet1.Data, False);
end;

原來以前就有這方面的文章了 (大驚)
TClientDataSet.Data 的問題

===================引 用 老大仔 文 章===================
To GrandRURU大大:
其實ADOQryTmp就是ADOQuery2啦 @@
只是我在PO文過來時沒有改好就PO了
真糟糕>"<
Sorry
下次會注意


===================引 用 GrandRURU 文 章===================
因為使用了DataSnap,所以後續的動作幾乎會在ClientDataSet上使用
看您的作法好像是要把收集的ClientDataSet2寫回到資料庫中,那麼以我來說
配置原則是一個ADOQuery對一個ADOConnection
所以實際上的配法可能會是
ADOConnection1 ADOQuery1 DataSetProvider1 ClientDataSet1 DataSource1 DBGrid1
ADOConnection2 ADOQuery2 DataSetProvider2 ClientDataSet2 DataSource2 DBGrid2

設定在ADOQuery1,但啟動的工作交給ClientDataSet1來做
ClientDataSet2則保持開啟

然後程式段的部份會像是
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientDataSet1.Close;
ADOQryTmp.SQL.Clear;
ADOQryTmp.SQL.Add(' Select Top 10 日期, 單號, 發票號碼, 身分證號, 姓名 From AAA ');
ADOQryTmp.Prepared := True;
ClientDataSet1.Open;
ClientDataSet2.AppendData(ClientDataSet1.Data, False);
end;

如此一來,就可以在同一個畫面上看到你的結果了。
編輯記錄
GrandRURU 重新編輯於 2011-08-23 01:48:01, 註解 無‧
老大仔
尊榮會員


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

發送簡訊給我
#20 引用回覆 回覆 發表時間:2011-08-23 18:01:41 IP:59.120.xxx.xxx 未訂閱
To ko 大大:
您的方式雖然也是可行的
但是可能不符合本需求
因為小弟的程式原本的設計是用DBGrid來做資料顯示並做一些修改、儲存資料
所以無法改成 ListView 來達成><
而您的方式小弟會學起來
下次有類似的問題時或許就派的上用場了
謝謝您的意見^^


題外話...
剛看了您的簽名檔
您也是霹靂迷嗎??
"分說,不分說,不由分說。"

===================引 用 ko 文 章===================
您好:
我都是用 ListView 來解決這個問題
裡面有個好用的func:FindCaption
只要找不到資料就會回傳 nil
這時候在做新增動作~

VAR L1,L2:TListItem;

L2:= LISTVIEW1.FindCaption(0,'AAA',false,true,false);
IF L2=NIL THEN
BEGIN
L1:=LISTVIEW1.ITEMS.ADD;
L1.CAPTION:='AAA';
L1.SUBITEMS.ADD('???');
END;
老大仔
尊榮會員


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

發送簡訊給我
#21 引用回覆 回覆 發表時間:2011-08-23 18:05:52 IP:59.120.xxx.xxx 未訂閱
啥毀!!??(驚)
原來前人也有同樣的問題@@
真是太巧了

GrandRURU 大大您沒誤會
是我在PO程式碼時沒改好
造成您的誤會><
and~
謝謝 GrandRURU 大大
所有的問題已順利解決^^
又學到一招

最後
再次感謝所有參與本問題討論的前輩們( sryang smallfox P.D. salo0610 mephise ko )
讓小弟著實學到不少東西^^
我當初沒想到可以用 TClientDataSet 來達成此目的
只是一味的用ADO元件來想>"<
真是收益良多^^

因本問題已解決
所以要結案了
本次答題得分的是: GrandRURU


===================引 用 GrandRURU 文 章===================
原來是我誤會了,失禮失禮
ClientDataSet2的部份可以先在Design Mode時就先開好
那這樣應該就ok了
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientDataSet1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(' Select Top 10 日期, 單號, 發票號碼, 身分證號, 姓名 From AAA WHERE 條件 ');
ADOQuery1.Prepared := True;
ClientDataSet1.Open;
ClientDataSet2.AppendData(ClientDataSet1.Data, False);
end;

原來以前就有這方面的文章了 (大驚)
TClientDataSet.Data 的問題


編輯記錄
老大仔 重新編輯於 2011-08-23 04:07:45, 註解 無‧
系統時間:2024-03-29 12:56:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!