單位BDECLIENTDATASET;
介面
使用Windows,Sysutils,變體,類,DB,DBCOMMON,MIDAS,
sqltimst,dbclient,dblocal,提供商,dbtables;
類型
{tbdequery}
tbdequery = class(tquery)
私人的
fkeyfields:string;
受保護
功能psgetDefaultOrder:tindexDef;覆蓋;
結尾;
{tbdeclientdataset}
tbdeclientdataset = class(tcustomcacheddataset)
私人的
fcommandText:string;
fcurrentCommand:string;
fdataset:tbdequery;
fdatabase:tdatabase;
絮狀:tparams;
fstreamedactive:布爾人;
程序CheckmastersOrceActive(Mastersource:tdatasource);
程序setDetailsactive(值:boolean);
函數getConnection:tdatabase;
函數getDataset:tdataset;
功能GetMasterSource:tdatasource;
功能GetMasterFields:String;
過程setConnection(值:tdatabase);
過程setDataSource(值:tdatasource);
過程setLocalParams;
過程SetMasterFields(const value:string);
過程setParamsFromsQl(const value:string);
過程setsql(const value:string);
受保護
函數getCommandText:string;覆蓋;
加載過程;覆蓋;
過程通知(分解:TCOMPONENT;操作:檯面);覆蓋;
過程setActive(值:布爾值);覆蓋;
過程setCommandText(value:string);覆蓋;
民眾
構造函數創建(Alower:tcomponent);覆蓋;
毀滅者銷毀;覆蓋;
程序clonecursor(來源:tcustomclientdataset; reset:boolean;
keepSettings:boolean = false);覆蓋;
過程getFieldNames(列表:tstrings);覆蓋;
函數getQuotechar:字符串;
屬性數據集:tdataset read getDataset;
出版
屬性活動;
屬性命令文本:字符串讀取getCommandText寫入setCommandText;
屬性dbConnection:tdatabase讀取getConnection寫入setConnection;
屬性Masterfields讀取GetMasterfields Write setMasterfields;
物業Mastersource:TDATASOURCE閱讀GetMasterSource Write SetDatasource;
結尾;
程序登記冊;
執行
使用BDECONST,MIDCONST;
類型
{tbdecdsparams}
tbdecdsparams = class(tparams)
私人的
ffieldname:tstrings;
受保護
Procedure parseSelect(SQL:String);
民眾
構造函數創建(所有者:tpersistent);
毀滅者銷毀;覆蓋;
結尾;
構造函數tbdecdsparams.create(所有者:tpersistent);
開始
遺傳;
ffieldName:= tstringlist.create;
結尾;
destructor tbdecdsparams.destroy;
開始
Freeandnil(ffieldname);
遺傳;
結尾;
過程tbdecdsparams.parselect(sql:string);
const
sselect ='select';
var
fwherefound:布爾值;
開始:PCHAR;
fname,value:string;
sqltoken,cursection,lasttoken:tsqltoken;
參數:整數;
開始
如果pos('' + sselect +'',則小寫(string(pchar(sql)+8)))> 1然後退出; //無法解析子查詢
開始:= PCHAR(PARSESQL(PCHAR(SQL),true));
遏制:= stunknown;
LastToken:= stunknown;
fwherefound:= false;
參數:= 0;
重複
重複
sqltoken:= squltoken(start,fname,cursection);
如果在[sthere]中的sqltoken
開始
fwherefound:= true;
LastToken:= sthere;
結束否則,如果[sttableName]中的sqltoken,則
開始
{檢查所有者合格的表名}
如果開始^ ='。'然後
NextSqlToken(start,fname,cutsection);
結束
如果(sqltoken = stvalue)和(lastToken = sthere),則
sqltoken:= stfieldName;
如果SQLSections中的SQLTOKEN,則均衡:= sqlToken;
直到[stfieldname,Stend]中的sqltoken;
如果[[stfieldname]中的fwhere和(sqltoken),則
重複
sqltoken:= squltoken(start,value,cursection);
如果SQLSections中的SQLTOKEN,則均衡:= sqlToken;
直到[Stend,Stvalue,Stisnull,Stisnotnull,stfieldName]
如果值='?'然後
開始
ffieldName.Add(fname);
inc(params);
結尾;
直到(params = count)或([stend]中的sqltoken);
結尾;
{tbdequery}
函數tbdequery.psgetDefaultOrder:tindexDef;
開始
如果fkeyfields ='',則
結果:=繼承的psgetDefaultOrder
別的
開始//詳細表默認順序
結果:= tindexdef.create(nil);
結果:= [ixunique]; // Keyfield是唯一的
result.name:= stringreplace(fkeyfields,';','_',[rfreplaceall]);
result.fields:= fkeyfields;
結尾;
結尾;
{tbdeclientdataset}
constructor tbdeclientdataset.create(awher:tcomponent);
開始
繼承的創建(Alower);
fdataset:= tbdequery.create(nil);
fdataset.name:= self.name +'dataset1';
dataSet dataSet:= fdataset;
sqldbtype:= typebde;
絮凝物:= tparams.create;
結尾;
destructor tbdeclientdataset.destroy;
開始
Freeandnil(絮狀);
fdataset.close;
Freeandnil(fdataset);
繼承銷毀;
結尾;
過程tbdeclientdataset.getFieldNames(列表:tstrings);
var
開放:布爾人;
開始
打開:=(active = false);
嘗試
如果打開
打開;
繼承的getFieldNames(list);
最後
如果打開,請關閉;
結尾;
結尾;
函數tbdeclientdataset.getCommandText:string;
開始
結果:= fcommandText;
結尾;
函數tbdeclientdataset.getDataset:tdataset;
開始
結果:= fdataset作為tdataset;
結尾;
程序tbdeclientdataset.CheckmastersOrceActive(MasterSource:tdatasource);
開始
如果分配(MasterSource)並分配(Mastersource.dataset),則
如果不是Mastersource.dataset.Active
數據庫(smasternotopen);
結尾;
過程tbdeclientdataset.setparamsfromsql(const value:string);
var
數據集:tquery;
tableName,tempquery,q:string;
列表:tbdecdsparams;
我:整數;
場:Tfield;
開始
tableName:= getTablEnameFromsql(value);
如果tablename <>'',則
開始
tempquery:= value;
列表:= tbdecdsparams.create(self);
嘗試
list.parselect(tempquery);
List.AssignValues(params);
對於i:= 0到list.count -1做
列表[i] .paramtype:= ptinput;
數據集:= tquery.create(nil);
嘗試
dataset.databasename:= fdataset.databasename;
問:= getQuotechar;
dataset.sql.add('select * from' + q + tablename + q +'whene 0 = 1'); {不要本地化}
嘗試
dataset.open;
對於i:= 0到list.count -1做
開始
如果list.ffieldname.count>我然後
開始
嘗試
字段:= dataset.fieldbyname(list.ffieldname [i]);
除了
字段:= nil;
結尾;
結束
字段:= nil;
如果分配(字段),則
開始
如果field.datatype <> ftString,則
列表[i] .datatype:= field.datatype
否則如果Tstringfield(field).fixedchar,則
列表[i] .datatype:= ftfixedchar
別的
列表[i] .datatype:= ftString;
結尾;
結尾;
除了
//忽略所有例外
結尾;
最後
dataset.free;
結尾;
最後
如果list.count> 0,然後
params.Assign(list);
list.free;
結尾;
結尾;
結尾;
過程tbdeclientdataset.setsql(const value:string);
開始
如果分配(提供者。dataset)
開始
tquery(dataSet).sql.clear;
如果值<>'',則
tquery(davider.dataset).sql.add(value);
繼承的setCommandText(value);
結束
數據庫(snodataprovider);
結尾;
過程tbdeclientdataset.loaded;
開始
繼承加載;
如果fstreamedactive
開始
setActive(true);
fstreamedactive:= false;
結尾;
結尾;
函數tbdeclientdataset.getMasterfields:string;
開始
結果:=繼承的Masterfields;
結尾;
過程tbdeclientdataset.setmasterfields(const value:string);
開始
繼承的Masterfields:= value;
如果值<>'',則
indexFieldNames:= value;
fdataset.fkeyfields:='';
結尾;
過程tbdeclientdataset.setCommandText(value:string);
開始
繼承的setCommandText(value);
fcommandText:= value;
如果不是(ComponentState中的CSLOAD),則
開始
fdataset.fkeyfields:='';
indexFieldNames:='';
Masterfields:='';
indexname:='';
indexdefs.clear;
params.clear;
if(componentState中的csdesign)和(value <>''),則
setParamsFromsQl(value);
結尾;
結尾;
函數tbdeclientdataset.getConnection:tdatabase;
開始
結果:= fdatabase;
結尾;
過程tbdeclientdataset.setConnection(值:tdatabase);
開始
如果值= fdatabase,則退出;
檢查;
如果分配(值),則
開始
如果不是
數據庫(sdatabasenamissing);
fdataset.databasename:= value.databasename;
結束
fdataset.databasename:='';
fdatabase:= value;
結尾;
函數tbdeclientdataset.getQuotechar:string;
開始
結果:='';
如果分配(FDATASET)
結果:= fdataset.psgetquotechar;
結尾;
過程tbdeclientdataset.clonecursor(來源:tcustomclientdataset; reset:boolean;
keepSettings:boolean = false);
開始
如果不是(源是tbdeclientdataset),則
數據庫(sinvalidclone);
dataset:= tbdeclientdataset(source).provider.dataset;
dbConnection:= tbdeclientDataSet(source).dbConnection;
commandText:= tbdeclientDataSet(source).commandText;
繼承的clonecursor(源,重置,keepsettings);
結尾;
過程tbdeclientdataset.notification(acomponent:tcomponent; toperation; operation:toperation);
開始
繼承的通知(分支機構,操作);
如果操作= opremove,則
如果acomponent = fdatabase,則
開始
fdatabase:= nil;
setActive(false);
結尾;
結尾;
過程tbdeclientdataset.setlocalparams;
過程createparamsfrommasterfields(create:boolean);
var
我:整數;
列表:tstrings;
開始
列表:= tstringlist.create;
嘗試
如果創建然後
flocalparams.clear;
fdataset.fkeyfields:= Masterfields;
list.commatext:= masterfields;
對於i:= 0 to list.count -1做
開始
如果創建然後
flocalparams.createparam(ftunknown,Mastersource.dataset.fieldbyname(list [i])。fieldName,
ptinput);
flocalparams [i] .ASSIGNFIELD(MASTERSOURCE.DATASET.FIELDBYNAME(list [i]));
結尾;
最後
list.free;
結尾;
結尾;
開始
如果(Masterfields <>'')並分配(Mastersource)並分配(Mastersource.dataset)然後
開始
createparamsfrommasterfields(true);
fcurrentCommand:= addParamsqlfordetail(flocalParams,commandText,true,getquotechar);
結尾;
結尾;
過程tbdeclientdataset.setdatasource(值:tdatasource);
開始
繼承的MasterSource:= value;
如果分配(值),則
開始
如果packEtrecords = -1,則packEtrecords:= 0;
結束
開始
如果packEtrecords = 0,則packEtrecords:= -1;
結尾;
結尾;
函數tbdeclientdataset.getMasterSource:tdatasource;
開始
結果:=繼承的Mastersource;
結尾;
過程tbdeclientdataset.setdetailsactive(值:boolean);
var
detaillist:tlist;
我:整數;
開始
detaillist:= tlist.create;
嘗試
getDetaildatasets(detaillist);
對於i:= 0 to detaillist.count -1做
如果tdataset(detaillist [i])是tbdeclientdataset,則
tbdeclientdataset(tdataset(detaillist [i]))。活動:= value;
最後
detaillist.free;
結尾;
結尾;
過程tbdeclientdataset.setactive(值:boolean);
開始
如果值,則
開始
如果在componentState中加載,則
開始
fstreamedactive:= true;
出口;
結尾;
如果Masterfields <>'',則
開始
如果不是(ComponentState中的CSLOAD),則
Checkmastersourceective(Mastersource);
setlocalparams;
setSQL(fcurrentCommand);
參數:=絮狀;
fetchparams;
結束
開始
setSQL(fcommandText);
如果參數> 0,則
開始
fdataset.params:= params;
fetchparams;
結尾;
結尾;
結尾;
如果值和(fdataset.objectView <> ObjectView),則
fdataset.ObjectView:= ObjectView;
繼承的setActive(value);
setDetailsactive(value);
結尾;
程序登記冊;
開始
registerComponents('bde',[tbdeclientdataset]);
結尾;
結尾。
//以上經dblocalb.pas改裝而成,可存為任意文件名,當然擴展名是pas
//然後安裝此控件即可