想开发一个TXClientDataSet控件,不知大家意见怎么
想开发一个TXClientDataSet控件,不知大家意见如何?
本人做的程序中,喜欢二层的快速,但又看中了TClientDataSet批处理优势,只是觉得它的使用很是不方便.
TAdoquery -> TDataSetProvider-> TClientDataSet
这样做一个数据集就要放置三个元件,多个数据集就更麻烦了.
于是想做一个TXClientDataSet的元件.它包含了TAdoQuery和TDataSetProvider这两个对象.
新增TXClientDataSet.Connection属性,可以在设计器上指定一个TAdoConnection.
新增TXClientDataSet.UseInsideProvider属性,为True时就可以内在的TAdoQuery及TDataSetProvider,为False时就象普通的TClientDataSet一样使用.
TXClientDataSet变得象二层一样好用,但这样的元件有点死板,不知大家意见如何?
------解决方案--------------------
你可以参照dbexpress页的TSimpleDataSet,
它相当于DataSetProvider+ClientDataset
------解决方案--------------------
我就是用ClientDataSet做两层, 比ADO更灵活, 但是比较慢.
------解决方案--------------------
TConnectionX-> TDataSet-> TDataSetProvider-> ClientDataSet-> TDatasource
设计期间是用这些组件, 但是在运行期间是用封装好的类, 也就是说在运行期间只要用TClientDataSet, TDataSource或者只用ClientDataSet.
IDBase = interface
[ '{4DA7AE65-31AE-4458-BE9B-21E0D05EF2FF} ']
//描述: 执行SQL语句不返回记录集, 执行成功返回真否则返回假
// 参数: @strSQL 要执行的SQL语句, 此函数主要用于 INSERT, UPDATE, DELETE 操作
// 如果要返回记录集, 用GetData函数
// @ReturnRec: 是否返回结果集.
function ExecSQL(const strSQL: string; ReturnRec: Boolean = False): Boolean; stdcall;
//返回数据集; @strSQL 必须是有返回记录集的SQL语句, 一般为Select 语句
function GetData(const strSQL: string): OleVariant; overload;stdcall;
function UpdateDelta(ACds: TClientDataSet): Boolean; stdcall;
procedure BeginGetData; stdcall;
procedure EndGetData; stdcall;
//描述:多个数据集获取数据获取数据串行获取数据时候使用, 调用
// getData要用beginGetDat与endGetData封装
// strSQL:获取数据的SQL句
// ACDS:保存由strSQL获取数据的数据集组件
procedure GetData(strSQL: string; ACds: TClientDataSet); overload;stdcall;
//描述:保存执行的SQL语句 }
procedure SaveSQL(SaveSQL: Boolean; Path: string = ' '); stdcall;
//描述: 判断是否正在打开、初始化、刷新一个数据集 }
function Opening: Boolean; stdcall;
//........ 省略了其它的方法
end;
调用的时代只要用
ClientDataSet1.Data := DB.GetData(SQL);
就可以得到数据, 并且可以根据编译条件生成生成两层或三层, 当然三层是假三层.
------解决方案--------------------
ClientDataSet在数据量大的时候速度非常慢!但是使用上比ADO灵活!
有人知道如何得到ADOQuery异动的数据吗?就是对应clientdataset的delta属性。
如果ADO能得到这些数据的话,处理起来的方便多了!
------解决方案--------------------
比如一次返回2万以上就非常慢了。虽然说可以多加条件减少返回的数据量,但是有时候还是避免不了要返回大量的数据的
------解决方案--------------------
TClientDataSet的CommandText不支持 select field1 ,SUM(field2),AVG(Field2) from table group by field1这样的语句,怎么办????救命啊!!!!!
------解决方案--------------------
比如我提供一个检索数据的地方给客户使用,客户输入不同的条件就返回不同的数量的结果,如果客户输入的条件比较宽松,那么返回的数据量可能就会比较大了。
我就碰到了一个客户,他拥有46W条数据,我总共设置了六个条件给他使用,但是他说,很多情况下使用了多个条件,但是仍然返回了1-2w条数据。
------解决方案--------------------
其实没有必要做这个TClientDataSetX,客户端只放一个clientdataset就可以了,应用服务器返回data属性值,更新数据的时候,传delta属性值给服务器,如果是多表更新则传多个delta属性值给服务器,当然,如果生成SQL语句,这个是要自己写代码来分析delta里的数据了。
我一直都是这样使用的
本人做的程序中,喜欢二层的快速,但又看中了TClientDataSet批处理优势,只是觉得它的使用很是不方便.
TAdoquery -> TDataSetProvider-> TClientDataSet
这样做一个数据集就要放置三个元件,多个数据集就更麻烦了.
于是想做一个TXClientDataSet的元件.它包含了TAdoQuery和TDataSetProvider这两个对象.
新增TXClientDataSet.Connection属性,可以在设计器上指定一个TAdoConnection.
新增TXClientDataSet.UseInsideProvider属性,为True时就可以内在的TAdoQuery及TDataSetProvider,为False时就象普通的TClientDataSet一样使用.
TXClientDataSet变得象二层一样好用,但这样的元件有点死板,不知大家意见如何?
------解决方案--------------------
你可以参照dbexpress页的TSimpleDataSet,
它相当于DataSetProvider+ClientDataset
------解决方案--------------------
我就是用ClientDataSet做两层, 比ADO更灵活, 但是比较慢.
------解决方案--------------------
TConnectionX-> TDataSet-> TDataSetProvider-> ClientDataSet-> TDatasource
设计期间是用这些组件, 但是在运行期间是用封装好的类, 也就是说在运行期间只要用TClientDataSet, TDataSource或者只用ClientDataSet.
IDBase = interface
[ '{4DA7AE65-31AE-4458-BE9B-21E0D05EF2FF} ']
//描述: 执行SQL语句不返回记录集, 执行成功返回真否则返回假
// 参数: @strSQL 要执行的SQL语句, 此函数主要用于 INSERT, UPDATE, DELETE 操作
// 如果要返回记录集, 用GetData函数
// @ReturnRec: 是否返回结果集.
function ExecSQL(const strSQL: string; ReturnRec: Boolean = False): Boolean; stdcall;
//返回数据集; @strSQL 必须是有返回记录集的SQL语句, 一般为Select 语句
function GetData(const strSQL: string): OleVariant; overload;stdcall;
function UpdateDelta(ACds: TClientDataSet): Boolean; stdcall;
procedure BeginGetData; stdcall;
procedure EndGetData; stdcall;
//描述:多个数据集获取数据获取数据串行获取数据时候使用, 调用
// getData要用beginGetDat与endGetData封装
// strSQL:获取数据的SQL句
// ACDS:保存由strSQL获取数据的数据集组件
procedure GetData(strSQL: string; ACds: TClientDataSet); overload;stdcall;
//描述:保存执行的SQL语句 }
procedure SaveSQL(SaveSQL: Boolean; Path: string = ' '); stdcall;
//描述: 判断是否正在打开、初始化、刷新一个数据集 }
function Opening: Boolean; stdcall;
//........ 省略了其它的方法
end;
调用的时代只要用
ClientDataSet1.Data := DB.GetData(SQL);
就可以得到数据, 并且可以根据编译条件生成生成两层或三层, 当然三层是假三层.
------解决方案--------------------
ClientDataSet在数据量大的时候速度非常慢!但是使用上比ADO灵活!
有人知道如何得到ADOQuery异动的数据吗?就是对应clientdataset的delta属性。
如果ADO能得到这些数据的话,处理起来的方便多了!
------解决方案--------------------
比如一次返回2万以上就非常慢了。虽然说可以多加条件减少返回的数据量,但是有时候还是避免不了要返回大量的数据的
------解决方案--------------------
TClientDataSet的CommandText不支持 select field1 ,SUM(field2),AVG(Field2) from table group by field1这样的语句,怎么办????救命啊!!!!!
------解决方案--------------------
比如我提供一个检索数据的地方给客户使用,客户输入不同的条件就返回不同的数量的结果,如果客户输入的条件比较宽松,那么返回的数据量可能就会比较大了。
我就碰到了一个客户,他拥有46W条数据,我总共设置了六个条件给他使用,但是他说,很多情况下使用了多个条件,但是仍然返回了1-2w条数据。
------解决方案--------------------
其实没有必要做这个TClientDataSetX,客户端只放一个clientdataset就可以了,应用服务器返回data属性值,更新数据的时候,传delta属性值给服务器,如果是多表更新则传多个delta属性值给服务器,当然,如果生成SQL语句,这个是要自己写代码来分析delta里的数据了。
我一直都是这样使用的