李
李颖
Unregistered / Unconfirmed
GUEST, unregistred user!
耐心看下去,多少有点启发......
目的:
三层结构中客户端取数一般是采用
TClientDataSet =====> TDataSetProvider + TDataSet
有些人使用TDataSetProvider + TTable,然后在设计期间设置TTable的属性
缺点很明显:
1、不能使用SQL实现复杂的查询
2、TTable的属性在设计期间完全确定了,也就只能只能打开固定的一个表,
要使用多个表怎么办?只好在RemoteDataModule中放无数的
TDataSetProvider和TTable
这种做法不能满足我们的要求,我们需要的是:
1、在Client端使用SQL语句打开数据集
2、Provider应该能访问任意数据,
最好做到多个ClientDataSet同时使用一个Provider访问不同的数据
Delphi的帮助里没有例子,不过我们还是很容易就找到了实现方法:
Server端:TDataSetProvider + TQuery
Client端:TClientDataSet
// for Delphi 5:
TDataSetProvider.Options属性中应该包括poAllowCommandText,
允许ClientDataSet使用SQL命令
Client端程序:
with ClientDataSetdo
begin
Close;
CommandText := 'Select xxx ......';
Open;
end;
// for Delphi 4:
手头找不到D4了,因此不知道D4是否支持TClientDataSet.CommandText,
我们以前是这样做的:
Client端程序:
with ClientDataSetdo
begin
Close;
DataRequest('Select xxx ......');
Open;
end;
Server端程序:
TDataSetProvider.OnDataRequest(Sender: TObject;
Input: OleVariant): OleVariant;
begin
// 这里的Input就是客户端的ClientDataSet调用DataRequest方法时传递的参数
// 将它赋值给Query.SQL.Text就可以了
Query.SQL.Text := Input;
end;
好了,用上面的方法我们在Client端使用SQL了,也使得Provider与数据集无关,
Server端只需要公布一个Provider就可以供Client端的多个ClientDataSet使用了,
看起来真不错,问题似乎得到了完美的解决 )
目的:
三层结构中客户端取数一般是采用
TClientDataSet =====> TDataSetProvider + TDataSet
有些人使用TDataSetProvider + TTable,然后在设计期间设置TTable的属性
缺点很明显:
1、不能使用SQL实现复杂的查询
2、TTable的属性在设计期间完全确定了,也就只能只能打开固定的一个表,
要使用多个表怎么办?只好在RemoteDataModule中放无数的
TDataSetProvider和TTable
这种做法不能满足我们的要求,我们需要的是:
1、在Client端使用SQL语句打开数据集
2、Provider应该能访问任意数据,
最好做到多个ClientDataSet同时使用一个Provider访问不同的数据
Delphi的帮助里没有例子,不过我们还是很容易就找到了实现方法:
Server端:TDataSetProvider + TQuery
Client端:TClientDataSet
// for Delphi 5:
TDataSetProvider.Options属性中应该包括poAllowCommandText,
允许ClientDataSet使用SQL命令
Client端程序:
with ClientDataSetdo
begin
Close;
CommandText := 'Select xxx ......';
Open;
end;
// for Delphi 4:
手头找不到D4了,因此不知道D4是否支持TClientDataSet.CommandText,
我们以前是这样做的:
Client端程序:
with ClientDataSetdo
begin
Close;
DataRequest('Select xxx ......');
Open;
end;
Server端程序:
TDataSetProvider.OnDataRequest(Sender: TObject;
Input: OleVariant): OleVariant;
begin
// 这里的Input就是客户端的ClientDataSet调用DataRequest方法时传递的参数
// 将它赋值给Query.SQL.Text就可以了
Query.SQL.Text := Input;
end;
好了,用上面的方法我们在Client端使用SQL了,也使得Provider与数据集无关,
Server端只需要公布一个Provider就可以供Client端的多个ClientDataSet使用了,
看起来真不错,问题似乎得到了完美的解决 )