tdatasetprovider元件連結的資料集元件更新 |
尚未結案
|
sundy6719
初階會員 發表:136 回覆:78 積分:42 註冊:2002-07-10 發送簡訊給我 |
在Tdatasetprovider元件更新資料時有二種方法第一種是sql敘逑的方法applydates()來更新和另一個方法是由tdatasetprovider元件連結的資料集元件來負責更新元件那麼我現在想要用第二種方法也就是tdatasetprovider元件連結的資料集元件我除了要把resolvetodatase設為true那麼我還要做什麼設定呢
還有我把resolvetodataset設為true那麼我的sql資料庫下達applyupdates(0)都沒有辦法更新我的作法是那錯誤了呢
| ||
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: 在Tdatasetprovider元件更新資料時有二種方法第一種是sql敘逑的方法applydates()來更新和另一個方法是由tdatasetprovider元件連結的資料集元件來負責更新元件那麼我現在想要用第二種方法也就是tdatasetprovider元件連結的資料集元件我除了要把resolvetodatase設為true那麼我還要做什麼設定呢 還有我把resolvetodataset設為true那麼我的sql資料庫下達applyupdates(0)都沒有辦法更新我的作法是那錯誤了呢1.要看你連的DataSet種類是ADO還是BDE,ADO應該不用設定什麼,BDE的話就要像Client/Server一樣可增刪修的設定。 2.應該是某個地方出錯了,你可監測SQL狀態,或設定將更新的錯誤訊息Show出。
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
||
sundy6719
初階會員 發表:136 回覆:78 積分:42 註冊:2002-07-10 發送簡訊給我 |
|||
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
引言: 還有我把resolvetodataset設為true那麼我的sql資料庫下達applyupdates(0)都沒有辦法更新我的作法是那錯誤了呢sundy6719 你好 DatasetProvider的resolvetodataset 屬性只是很單純的讓設計師決定,欲更新資料的SQL指令是由誰來產生罷了,設為False時是由DataSetProvider內部的SQLResolver來產生更新資料的SQL指令,而設為True時,則交給DataSetProvider.DataSet來產生更新資料的SQL指令, 你的DataSetProvider.DataSet是使用ADO的資料集元件,基本上其包容性比其他的資料集元件(如BDE)還大,所以我覺得你可以從以下幾點著手找到問題的原因: 1.先確定元件關聯的正確性是否如下 TAdoDataSet->TDataSetProvider->TClientDataSet->.. 2.TDataSetProvider.Options 是否AllowCommandText 3.是:看看ClientdataSet.Commandtext 的SQL指令為何 4.否:看看TAdoDataSet.Commandtext的SQL指令為何 5.檢查TDataSetProvider.Options 中的DiableEdits、DiableInsert....等等與資料更新相關的屬性是否為True; |
||
sundy6719
初階會員 發表:136 回覆:78 積分:42 註冊:2002-07-10 發送簡訊給我 |
|||
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
sundy6719 你好 一般我們使用TQuery時,不是常用
Query1.Edit;
Query1.FieldByName('Field1').AsString := 'xxxxx';
....
Query1.Post ;
如上程式,當Query1.Post;後其實TQuery已將你異動的情形分析後產生SQL指令,交給後端資料庫來更新資料,因此我們可以知道TQuery可以解決資料更新的SQL指令產生的工作所以它可視為Resolver(resolver直譯為[解決者]) 在多層架構中的TDataSetProvider也具有如此的能力,但它並不專權,還開放了一個屬性,由設計師來決定,這個工作應該交誰來作;所以resolvetodataset=true;就是說產生更新資料的SQL指令的工作交給參與datasetProvider合作的資料集元件來作,否則就由DataSetProvider自已作(DatasetProvider內部有個SQLResolver成員可以勝任)來處理 另外,ADO的資料集元件,可以處理關聯資料的異動
AdoDataset.CommandText := 'Select * from tablea a, tableb b Where a.ID_NO=b.ID_NO' ;
AdoDataset.Open;
AdoDataset.Edit;
AdoDataSet.FieldByName('xxxx').AsString := 'xxxxx;
.....
AdoDataSet.Post;
此時ADO的資料集元件會自動分析出來,這筆異動是要更新回兩個資料表,依據其關聯性而產生兩個SQL指令分別更新TableA及TableB兩個表格(這可從SQL Profile中看出) , 所以當你的datasetProvider之dataset連結到ADO的資料集時,resolvetodataset若為False,交給datasetprovider來分析,由於datasetprovide與BDE的資料集元件一樣,只能處理單一資料表的更新,對於多資料表的的更新,只好認輸,然後秀出錯誤訊息了;相對的resolvetodataset若設為true,交由AdoDataset來處理,就OK了
|
||
sundy6719
初階會員 發表:136 回覆:78 積分:42 註冊:2002-07-10 發送簡訊給我 |
|||
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
引言: resolvetodataset為true則可以處理兩個資料表以上的更新而resolvetodatasetsundy6719 你好 不!它是有先決條件的 1.dataSetProvider的Dataset是連接Ado的資料集才可以 2.resolvetodataset為true 是因為ADO有處理關聯資料表的更新功能而不是DatasetProvider,resolvetodataset設為true則DatasetProvider把解析更新的SQL的工作交給ADO來處理。 |
||
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |