服务器端TADOQuery主从数据集动态存取数据 |
缺席
|
JustinShen
中階會員 發表:22 回覆:104 積分:80 註冊:2003-09-20 發送簡訊給我 |
请教各位大大,
我遇到的项目中,由于服务器端数据表非常多而且未来有增长的可能,所以建立一个含有全部数据表和提供者的RemoteDataModule是不合适的。
因此,我试图全部使用TADOQuery来存取数据表,建立对应DataSetProvider的OnDataRequest事件,处理TClientDataSet传来的参数并重建对应的SQL Statement获取数据,同时根据数据字典的描述设置每个字段的ProviderFlags/DisplayLabel/DisplayWidth/CustomConstraints。从而保证数据显示的语言/数据输入的合法性校验(使用Regular)/数据更新。
我的方法在单一TADOQuery时全部测试正确无误;但作为主从数据集使用时仅仅获取主数据表时没有问题,一旦试图获取从表数据立刻会出现Record changed by an onther,此时并未到变更数据的环节。后来单独建立一对TADOQuery的主从数据集不做任何处理,在客户端取数据时仍然有这样的问题,不知道这是什么原因。我的程式如下:
function TBaseServer.dspNestDataDataRequest(Sender: TObject;
Input: OleVariant): OleVariant;
var
i: Integer;
tmpStr: String;
begin
CheckLogin;
PrePareNestQuery(Input); //处理传入的SQL
if qryMaster.SQL.Text<>NestInput.MasterSQLStr then
begin
if qryDetail.Active then qryDetail.Close;
if qryMaster.Active then qryMaster.Close;
qryMaster.SQL.Text:=NestInput.MasterSQLStr;
qryDetail.SQL.Text:=NestInput.DetailSQLStr;
end
else
if qryDetail.SQL.Text<>NestInput.DetailSQLStr then
begin
if qryDetail.Active then qryDetail.Close;
qryDetail.SQL.Text:=NestInput.DetailSQLStr;
end;
if not qryMaster.Active then qryMaster.Open;
if not qryDetail.Active then qryDetail.Open;
FieldValid.Clear;
ChangeDisplayLabel(qryMaster); //bulid void stringlist for output to client
ChangeDisplayLabel(qryDetail); //bulid void stringlist for output to client
if frmSrvMain.FSettings.Debuging then Log;
FieldValid.Add(NestInput.MasterSQLStr);
FieldValid.Add(NestInput.DetailSQLStr);
Result:=FieldVaidToVariant(FieldValid);
//返回处理会的SQL Statement和每个字段的Regular
end; Justin Shen 發表人 - JustinShen 於 2005/05/05 10:30:19 發表人 - JustinShen 於 2005/05/05 10:37:12 發表人 - JustinShen 於 2005/05/05 10:39:34
------
==================== 我为一切作努力! Justin Shen |
JustinShen
中階會員 發表:22 回覆:104 積分:80 註冊:2003-09-20 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |