有關Delphi中ADO數據保存問題 |
尚未結案
|
比爾丐自
初階會員 發表:33 回覆:115 積分:29 註冊:2003-02-14 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
引言: 各位,你們好,我有一個問題,不知大家是否知道,在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 發送簡訊給我 |
|
比爾丐自
初階會員 發表:33 回覆:115 積分:29 註冊:2003-02-14 發送簡訊給我 |
|
比爾丐自
初階會員 發表:33 回覆:115 積分:29 註冊:2003-02-14 發送簡訊給我 |
|
比爾丐自
初階會員 發表:33 回覆:115 積分:29 註冊:2003-02-14 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
引言:運用 Calculated Field : 1. select 工號,工資 from B ( MainDataSet ). 2. select 姓名,性別 from A where 工號=[MainDataSet.工號]( MainDataSet.onCalcFields ). 3. 如須詳細說明, 可搜尋相關文章. /* Free 和 Create 一樣重要 */引言: 我通常是用子查詢寫的。 不過不知道你用的資料庫是否支援。你好,我試了,還是不行,比如A表中有工號,姓名,性別...等,當然工號唯一, 而另一表如表B,字段有工號,工資....等,而現在B表中用A表的其它字段如姓名,性別 我用 select B.工號,B.工資,A.姓名,A.性別 where B.工號=(SELECT * FROM A),這時ADO引擎還是要修改A表中的姓名,性別,其實我隻想修改或新增B表.請問子查詢是這樣寫的嗎? |
比爾丐自
初階會員 發表:33 回覆:115 積分:29 註冊:2003-02-14 發送簡訊給我 |
運用 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 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
引言: 謝謝你 我現就是用計算字段方法來做的,可這樣每次一打開表單速度很慢,我不想用此方法看能不能用其它方法。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 發送簡訊給我 |
引言:樓上的朋友,謝謝你,第一種我早已將A table 相關 TField.ReadOnly := True,結果是不能修改A表中的相關字段,但保存時提示錯誤,但還是保存了我要的B表中的資料,我最後查看了一下SQL中剛才所做的ADO引擎做了兩件事,一件是新增A表中的相關字段,不過我想剛才保存提示錯誤就是新增A表時工號為空所以報錯,而保存A表沒成功,另一件是新增B表.所以你可分析一下第一種能否改動一下會OK. 關於第二種我不明白,你能否說的更明白,或試舉一個試例當然不是全部。多謝謝!引言: 謝謝你 我現就是用計算字段方法來做的,可這樣每次一打開表單速度很慢,我不想用此方法看能不能用其它方法。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 發送簡訊給我 |
引言: 你應該先啟動 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 發送簡訊給我 |
引言: 關於第二種我不明白,你能否說的更明白,或試舉一個試例當然不是全部。多謝謝!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 發送簡訊給我 |
|
比爾丐自
初階會員 發表:33 回覆:115 積分:29 註冊:2003-02-14 發送簡訊給我 |
引言:謝謝我試了一下你講的,前面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; 如果不是這樣,請指明。非常的感謝!引言: 關於第二種我不明白,你能否說的更明白,或試舉一個試例當然不是全部。多謝謝!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 |
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
1. 如果用 TField.ProviderFlags 設定已經可以達到你的需求, 就可以不用管第八點了, 補充第八點只是要說明 ApplyUpdate 可以更有彈性, 當然可以對不同的 UpdateKind 做不同的控制, 端看需求而定.
2. DBGrid 只是 DataControl, 可以把她想成是 DataSet 的"展現"元件,
所有的資料處理當然是控制 DataSet 而非 DBGrid.
3. 該 event 是發生在 DataSetProvider 要 ApplyUpdate 到數據庫之前,
UpdateKind 不應該異動.
4. 細節部分恐怕須你自行測試了.留一點樂趣給你... /*
|
比爾丐自
初階會員 發表:33 回覆:115 積分:29 註冊:2003-02-14 發送簡訊給我 |
引言: 1. 如果用 TField.ProviderFlags 設定已經可以達到你的需求, 就可以不用管第八點了, 補充第八點只是要說明 ApplyUpdate 可以更有彈性, 當然可以對不同的 UpdateKind 做不同的控制, 端看需求而定. 2. DBGrid 只是 DataControl, 可以把她想成是 DataSet 的"展現"元件, 所有的資料處理當然是控制 DataSet 而非 DBGrid. 3. 該 event 是發生在 DataSetProvider 要 ApplyUpdate 到數據庫之前, UpdateKind 不應該異動. 4. 細節部分恐怕須你自行測試了.留一點樂趣給你... /* >>< face="Verdana, Arial, Helvetica"> 謝謝你,我隻有這點分,給你點不要嫌少。以後還請多多指教! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |