MIDAS高手请进!!!!!!(急急急)(100分)

  • 主题发起人 主题发起人 kinn_liu
  • 开始时间 开始时间
K

kinn_liu

Unregistered / Unconfirmed
GUEST, unregistred user!
环境:Window2000,delphi5.0,sqlserver2000
目的:由Client端提供参数,如:表名,动态变换页面,浏览并修改表中数据。
我的做法:
1,服务器端定义接口:Setquery(sqlstr).由Client端通过IAppserver接口调用它,设置
query的SQL属性,达到动态变换的目的。
2,Client端调用Setquery,同时刷新Client。
问题:
在DBgrid中可以看到变化时数据是属于不同表的。所以,表的变换没用问题。
可是更新时,只有最初的表可以更新(就是我在Design时设置的表),变换SQL后,就不能
更新了。
我不知道问题会出在什么地方,我设置了Query的Requstlive,而且变换后又设置了一次,
Clientdataset也用的是ApplyUpdate(-1)。呵呵,实在是病急乱投医了,还是搞不定,
请各位大虾帮忙!!!
需要的话,我将部分代码贴出来。
 
贴代码看看.
 
代码很简单,如下:
server端的Setquery
procedure TDCSInternetServer.setquery(const sql: WideString);
begin
Query1.Active := false;
Query1.SQL.clear;
Query1.SQL.Add(sql);
query1.RequestLive := true;
Query1.Active := true;
query1.RequestLive := true;
end;
Client端的调用:
procedure TForm1.Button1Click(Sender: TObject);
var
a : widestring;
begin
ClientDataSet1.Active := false;
DataSource1.Enabled := false;

a:= 'select * from dbo.CITY';
DCOMConnection1.AppServer.setquery(a);
DCOMConnection1.Connected := true;
ClientDataSet1.Active := true;
DataSource1.Enabled := true;
end;
 
是delphi6吧.

DCOMConnection1.Connected := true;
一行去掉即可.
 
这是delphi6的一个bug.
但是用DcomConnection调函数时,还必须让其connected=true;
 
to LiZhongYu:
我用的是DELPHI5.0。
我去了DCOMConnection1.Connected := true;试了,没有效果
 
这样试试,先Connect。
DCOMConnection1.Connected := true;
DCOMConnection1.AppServer.setquery(a);
如果不行,用TSocketConnection, 我就是这样用的。给你个例子:
with SocketConnection1do
begin
Open;
SocketConnection.AppServer.smsproc('out',vararrayof(['','','','',]));
Close;
end;
 
谢谢大家,我想可能是我没说请问题所在。
现在Client连接Server没有问题,调用IAppserver的接口没有问题,因为我的Dbgrid中的
数据和列名都变化了,问题出在更新数据上。
当我运行程序是,开始可以修改数据并更新到数据库中去。这时候数据表是我在Design的
时候设置的表,可是当我调用Appserver.setquery之后,变换了Server端Provide的数据表
这时候只能浏览,不能把修改的数据更新到数据库中了。
不知道是MIDAS的BUG,还是什么问题。
 
你在更新的时候用UpDataSQL组件试试
 
DBgrid 中的数据是从多张表中得来的吗?
如是,则要对IPROVIDER 中的OPTIONGS的做相应的设置
 
to jezon:
不是,我的测试的SQL是这样的:'select * from dbo.CITY'
 
观念模糊,完全错误!!!
原因:
三层结构是无状态的,你这样做即使程序调通了,在多用户的条件下也会出错.
因为你保证不了别人会和你一样改变sql.
解决办法:
客户端:
利用OWNERDATA传递SQL语句.
服务器端:
接收SQL语句,修改QUERY,执行.
 
补充:
上面解释的原因说错了(解决方法正确).抱歉.
原因:
setquery与ClientDataSet1.Active := true;不再同一线程内,无论如何不会调通.

 

query1.RequestLive := true;
去掉试试
 
还有看看ClientDataSet是不是ReadOnly:=True,如果ReadOnly := TRue是不能更新的
 
to 李衍智:
请详细讲一讲你的思路,最好贴个范例代码。谢谢!
 
服务端用TADOQuery试试看。
 
你看看是不是这个问题,在三层结构中sql叙述可以是datasetprovider(可能写的不对)
直接对数据库更新或通过与其连接的query更新.看你的问题应该是直接和数据库连接的
这样你的query的sql改变没有起到作用.改一下datasetprovider的属性,至于那一个我记不清了
查查帮助吧.
我正在学三层,希望能够多交流
 
后退
顶部