本人数据库新手,改造了一下 delphi7 自带的 pooler demo 做中间层,然后自己做了一个 client.结构是这样:
中间层: pooler + rdm + sqlconnection + sqlquery + datasetprovider1client:dm + clientdataset + datasource + dbgrid ...
可是现在发现一个问题,假如我的一个client 连接中间层,使用 datasetprovider1 连接了一个表 A 。同时,另一个client也使用 datasetprovider1 连接了表 B。这个时候,第一个 client 进行更新 applyupdate 就会出错:field name not found。我知道这个可能是因为 datasetprovider1 被第二个 client 占用了。但是,不是说 pooler 机制会自动管理这种问题吗?怎么会出现这种情况?郁闷呀!!!难道我要全部改成两层?高手知道怎么做吗?指点一下我呀。救命的呀!很多表要连接,难道我每一个表建一对 sql query + datasetproviderX ?那 pooler 有什么用?救命呀,谢谢!
中间层: pooler + rdm + sqlconnection + sqlquery + datasetprovider1client:dm + clientdataset + datasource + dbgrid ...
可是现在发现一个问题,假如我的一个client 连接中间层,使用 datasetprovider1 连接了一个表 A 。同时,另一个client也使用 datasetprovider1 连接了表 B。这个时候,第一个 client 进行更新 applyupdate 就会出错:field name not found。我知道这个可能是因为 datasetprovider1 被第二个 client 占用了。但是,不是说 pooler 机制会自动管理这种问题吗?怎么会出现这种情况?郁闷呀!!!难道我要全部改成两层?高手知道怎么做吗?指点一下我呀。救命的呀!很多表要连接,难道我每一个表建一对 sql query + datasetproviderX ?那 pooler 有什么用?救命呀,谢谢!
www.netyi.net有得下载电子图书
但是既然是个demo,当然就只提供这些功能,
如果你想扩展,也就是说同时持有多个数据集的话,就要自己设计机制,
简单说,现在的provider其实是有状态的,所以不能更新成功,因此,你可以在需要更新的时候,让provider重新用你的cds的sql来打开一下
在Provider.BeforeApplyUpdates中将得到的SQL语句赋值给 SQLQuery.SQL.Text
程序如下:
Client端:
procedure xxxx.ClientDataSetBeforeApplyUpdates(Sender: TObject; var OwnerData: OleVariant);
begin
with (Sender as TClientDataSet) do
OwnerData := CommandText;
end;Server端:
procedure xxxx.ProviderBeforeApplyUpdates(Sender: TObject;
var OwnerData: OleVariant);
begin
SQLQuery.SQL.Text := OwnerData;
end;实际上是告诉 SQLquery 此时需要更新的表。(一般用 select 语句)这样就可以更新了。只是不知道执行效率和数据安全性如何。试一试吧?