線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1307
推到 Plurk!
推到 Facebook!

有關Delphi中ADO數據保存問題

尚未結案
比爾丐自
初階會員


發表:33
回覆:115
積分:29
註冊:2003-02-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-02-14 09:03:13 IP:218.18.xxx.xxx 未訂閱
各位,你們好,我有一個問題,不知大家是否知道,在BDE中的數據控件Tquery能查詢多個連接表而隻新增或修改其中的一個表,可用TupdateSQL對應,但在ADO中確沒有這樣的對應物件嗎?因為我也用幾個連接查詢表,可用TADODdataSet或TadoQuery但隻想編輯其中的一個表,但ADO引擎自動將所有連接的相應欄位修改了,我是不是用的方法不對或要在什麼地方寫程序進行控制.多謝各位!
Mickey
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-02-14 16:19:32 IP:61.219.xxx.xxx 未訂閱
引言: 各位,你們好,我有一個問題,不知大家是否知道,在BDE中的數據控件Tquery能查詢多個連接表而隻新增或修改其中的一個表,可用TupdateSQL對應,但在ADO中確沒有這樣的對應物件嗎?因為我也用幾個連接查詢表,可用TADODdataSet或TadoQuery但隻想編輯其中的一個表,但ADO引擎自動將所有連接的相應欄位修改了,我是不是用的方法不對或要在什麼地方寫程序進行控制.多謝各位!
設定 TField.providerflags property 應該可以, 我不確定. /* Free 和 Create 一樣重要 */ 發表人 - Mickey 於 2003/02/14 16:21:23
alice100001
一般會員


發表:21
回覆:49
積分:19
註冊:2002-09-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-02-16 22:38:47 IP:203.204.xxx.xxx 未訂閱
我通常是用子查詢寫的。 不過不知道你用的資料庫是否支援。
比爾丐自
初階會員


發表:33
回覆:115
積分:29
註冊:2003-02-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-02-17 08:43:34 IP:218.17.xxx.xxx 未訂閱
謝謝你,我用過此屬性,可看了ADO引擎還是修改了另一個連接表,不知此屬性為什麼不起作用?
比爾丐自
初階會員


發表:33
回覆:115
積分:29
註冊:2003-02-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-02-17 08:46:44 IP:218.17.xxx.xxx 未訂閱
引言: 我通常是用子查詢寫的。 不過不知道你用的資料庫是否支援。
謝謝你,我用SQL當然可以,我可試一下你所說的用子查詢,不過我是在一個表中用計算方法將另一個相關的表字段連過來,不過每次打開表單很慢。
比爾丐自
初階會員


發表:33
回覆:115
積分:29
註冊:2003-02-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-02-17 17:12:15 IP:218.18.xxx.xxx 未訂閱
引言: 我通常是用子查詢寫的。 不過不知道你用的資料庫是否支援。
你好,我試了,還是不行,比如A表中有工號,姓名,性別...等,當然工號唯一, 而另一表如表B,字段有工號,工資....等,而現在B表中用A表的其它字段如姓名,性別 我用 select B.工號,B.工資,A.姓名,A.性別 where B.工號=(SELECT * FROM A),這時ADO引擎還是要修改A表中的姓名,性別,其實我隻想修改或新增B表.請問子查詢是這樣寫的嗎?
Mickey
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-02-18 09:11:45 IP:61.219.xxx.xxx 未訂閱
引言:
引言: 我通常是用子查詢寫的。 不過不知道你用的資料庫是否支援。
你好,我試了,還是不行,比如A表中有工號,姓名,性別...等,當然工號唯一, 而另一表如表B,字段有工號,工資....等,而現在B表中用A表的其它字段如姓名,性別 我用 select B.工號,B.工資,A.姓名,A.性別 where B.工號=(SELECT * FROM A),這時ADO引擎還是要修改A表中的姓名,性別,其實我隻想修改或新增B表.請問子查詢是這樣寫的嗎?
運用 Calculated Field : 1. select 工號,工資 from B ( MainDataSet ). 2. select 姓名,性別 from A where 工號=[MainDataSet.工號]( MainDataSet.onCalcFields ). 3. 如須詳細說明, 可搜尋相關文章. /* Free 和 Create 一樣重要 */
比爾丐自
初階會員


發表:33
回覆:115
積分:29
註冊:2003-02-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-02-18 10:18:02 IP:218.18.xxx.xxx 未訂閱
運用 Calculated Field : 1. select 工號,工資 from B ( MainDataSet ). 2. select 姓名,性別 from A where 工號=[MainDataSet.工號]( MainDataSet.onCalcFields ). 3. 如須詳細說明, 可搜尋相關文章. /* Free 和 Create 一樣重要 */ [/quote] 謝謝你 我現就是用計算字段方法來做的,可這樣每次一打開表單速度很慢,我不想用此方法看能不能用其它方法。
懷舊的人
高階會員


發表:28
回覆:152
積分:141
註冊:2003-01-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-02-18 10:58:05 IP:152.104.xxx.xxx 未訂閱
你應該先啟動 ADOConnection1.BeginTrans; 完成後 ADOConnection1.CommitTrans; 有兩本書你可以參考 1. 李維 的 實戰 Delphi 5.x ADO/MTS/COM 專業程式設計篇 2. Advanced Delphi Developer's Guide to ADO
Mickey
版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-02-18 11:19:55 IP:61.219.xxx.xxx 未訂閱
引言: 謝謝你 我現就是用計算字段方法來做的,可這樣每次一打開表單速度很慢,我不想用此方法看能不能用其它方法。
1.如果 select B.*,A.工號,A.姓名,A.性別... from A,B where ... 將 A table 相關 TField.ReadOnly := True, 這樣可以達到需求乎 ? 2.透過 TProvider -> TClientDataset, Provider.BeforeUpdateRecord event 整理你要的 Delta. /* Free 和 Create 一樣重要 */ 發表人 - Mickey 於 2003/02/18 11:59:48
比爾丐自
初階會員


發表:33
回覆:115
積分:29
註冊:2003-02-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-02-18 14:24:15 IP:218.17.xxx.xxx 未訂閱
引言:
引言: 謝謝你 我現就是用計算字段方法來做的,可這樣每次一打開表單速度很慢,我不想用此方法看能不能用其它方法。
1.如果 select B.*,A.工號,A.姓名,A.性別... from A,B where ... 將 A table 相關 TField.ReadOnly := True, 這樣可以達到需求乎 ? 2.透過 TProvider -> TClientDataset, Provider.BeforeUpdateRecord event 整理你要的 Delta. /* Free 和 Create 一樣重要 */ 發表人 - Mickey 於 2003/02/18 11:59:48
樓上的朋友,謝謝你,第一種我早已將A table 相關 TField.ReadOnly := True,結果是不能修改A表中的相關字段,但保存時提示錯誤,但還是保存了我要的B表中的資料,我最後查看了一下SQL中剛才所做的ADO引擎做了兩件事,一件是新增A表中的相關字段,不過我想剛才保存提示錯誤就是新增A表時工號為空所以報錯,而保存A表沒成功,另一件是新增B表.所以你可分析一下第一種能否改動一下會OK. 關於第二種我不明白,你能否說的更明白,或試舉一個試例當然不是全部。多謝謝!
比爾丐自
初階會員


發表:33
回覆:115
積分:29
註冊:2003-02-14

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-02-18 14:27:47 IP:218.17.xxx.xxx 未訂閱
引言: 你應該先啟動 ADOConnection1.BeginTrans; 完成後 ADOConnection1.CommitTrans; 有兩本書你可以參考 1. 李維 的 實戰 Delphi 5.x ADO/MTS/COM 專業程式設計篇 2. Advanced Delphi Developer's Guide to ADO
多謝,以上工作我都做了,不過我想問一下第二種書Advanced Delphi Developer's Guide to ADO 是英文版的嗎?有沒有中文的我找了很久有關這方面的書隻找到第一種書。
Mickey
版主


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-02-18 15:26:06 IP:163.29.xxx.xxx 未訂閱
引言: 關於第二種我不明白,你能否說的更明白,或試舉一個試例當然不是全部。多謝謝!
1. Add DataSetProvider on your Form; 2. Assign DataSetProvider.DataSet property := ADOQuery; 3. Set DataSetProvider.ResolveToDataSet := True; 4. Add ClientDataSet on your Form; 5. Assign ClientDataSet.Provider property := 1.DataSetProvider; 6. Create ADOQuery & ClientDataSet all TFields; 7. Tfield.ProviderFlags 就有效了 !// 我不知道為什麼 class="code"> procedure TForm1.DataSetProvider1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean); begin if UpdateKind =ukDelete then Applied := True; with DeltaDs do begin Edit; .... Post; end; end; /* Free 和 Create 一樣重要 */ 發表人 - Mickey 於 2003/02/18 15:35:36
懷舊的人
高階會員


發表:28
回覆:152
積分:141
註冊:2003-01-08

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-02-18 15:50:15 IP:152.104.xxx.xxx 未訂閱
這書是英文的,這方面的書比較少翻譯,如果你還有這方面的問題我想你把問題程式放到求助區,多一點人幫你測試也許比較容易有結果。 (這本書,有空我幫你看看有沒有寫這方面的例子) 發表人 - 懷舊的人 於 2003/02/18 15:59:06
比爾丐自
初階會員


發表:33
回覆:115
積分:29
註冊:2003-02-14

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-02-18 16:57:30 IP:218.17.xxx.xxx 未訂閱
引言:
引言: 關於第二種我不明白,你能否說的更明白,或試舉一個試例當然不是全部。多謝謝!
1. Add DataSetProvider on your Form; 2. Assign DataSetProvider.DataSet property := ADOQuery; 3. Set DataSetProvider.ResolveToDataSet := True; 4. Add ClientDataSet on your Form; 5. Assign ClientDataSet.Provider property := 1.DataSetProvider; 6. Create ADOQuery & ClientDataSet all TFields; 7. Tfield.ProviderFlags 就有效了 !// 我不知道為什麼 class="code"> procedure TForm1.DataSetProvider1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean); begin if UpdateKind =ukDelete then Applied := True; with DeltaDs do begin Edit; .... Post; end; end; /* Free 和 Create 一樣重要 */ 發表人 - Mickey 於 2003/02/18 15:35:36
謝謝我試了一下你講的,前面7條可以,當我插入時後台SQL所表現的ADO引擎隻修改了我所要修改的,不過我現要搞清我寫的二層能否用DataSetProvider控件,否則到時會出問題.不過我還是想問一下第8項中所示例子中是不是要寫三種情況,UpdateKind =ukDelete,還有ukInsert,ukModify,這時對每一種情況要分別處理是嗎?比如插入時 用 UpdateKind =ukInsert,是嗎?不過我還不明,因我用的是DBGRID控件,已綁定,所以我該如何給賦值,比如我現在插入,DeltaDs表中有工號,(姓名,性別二者來自A表),工資...現我隻能給B表中賦值是嗎? with DeltaDs do begin Edit; DeltaDs工號.value:=? 是這樣的嗎?那給什麼值(我用DBGRID綁定) DeltaDs工資.value:=? .... Post; end; 如果不是這樣,請指明。非常的感謝!
Mickey
版主


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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-02-18 17:21:40 IP:61.219.xxx.xxx 未訂閱
1. 如果用 TField.ProviderFlags 設定已經可以達到你的需求, 就可以不用管第八點了, 補充第八點只是要說明 ApplyUpdate 可以更有彈性, 當然可以對不同的 UpdateKind 做不同的控制, 端看需求而定.  2. DBGrid 只是 DataControl, 可以把她想成是 DataSet 的"展現"元件,  所有的資料處理當然是控制 DataSet 而非 DBGrid. 3. 該 event 是發生在 DataSetProvider 要 ApplyUpdate 到數據庫之前,    UpdateKind 不應該異動. 4. 細節部分恐怕須你自行測試了.留一點樂趣給你... /*
比爾丐自
初階會員


發表:33
回覆:115
積分:29
註冊:2003-02-14

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-02-19 13:35:14 IP:218.17.xxx.xxx 未訂閱
引言: 1. 如果用 TField.ProviderFlags 設定已經可以達到你的需求, 就可以不用管第八點了, 補充第八點只是要說明 ApplyUpdate 可以更有彈性, 當然可以對不同的 UpdateKind 做不同的控制, 端看需求而定. 2. DBGrid 只是 DataControl, 可以把她想成是 DataSet 的"展現"元件, 所有的資料處理當然是控制 DataSet 而非 DBGrid. 3. 該 event 是發生在 DataSetProvider 要 ApplyUpdate 到數據庫之前, UpdateKind 不應該異動. 4. 細節部分恐怕須你自行測試了.留一點樂趣給你... /* >< face="Verdana, Arial, Helvetica"> 謝謝你,我隻有這點分,給你點不要嫌少。以後還請多多指教!
系統時間:2024-05-20 12:38:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!