江湖救急!三层COM+数据更新的问题。能解决者分数随你要。 (100分)

  • 主题发起人 主题发起人 3368aa
  • 开始时间 开始时间
3

3368aa

Unregistered / Unconfirmed
GUEST, unregistred user!
在COM+的应用中,当客户端取服务器的数据时,我在服务器上建立了一个过程
function TSupMTS.OpenSQL(const SQLStr: WideString): OleVariant;
begin
ConnDatabase;
with qry1do
begin
close;
sql.clear;
sql.Add(SQLStr);
try
open;
setcomplete;
except
setabort;
end;
end;
result := dsp1.Data;
end;
其中DSP是与dataset想连接的datasetprovider
在客户端再将取得的数据加载到一个clientdataset中,然后在客户端操作,有添加及删除
等操作。
当我准备将数据更新到服务器时,我在服务器端建立了一个过程,如下
procedure TNewMTS.ApplyData(const SQLStr: WideString;
vdata: OleVariant;
iMaxError: Integer;
var iErrorCount: Integer);
begin
ConnDatabase;
try
qry.Close;
qry.SQL.Clear;
qry.SQL.Text := SQLStr;
qry.Open;
dsp.UpdateMode := upWhereChanged;
dsp.ApplyUpdates(vData, iMaxError, iErrorCount);
setcomplete;
except
setabort;
end;
end;

其中SQLSTR是取数据时用的SQL语句,但更新不成功,应该怎么写呀?
 

1、取数据与提交数据时的ADOQUERY都不需要OPEN。
2、提交数据时的ADOQUERY里的SQL语句根据不是什么更新的SQL语句。
例 如:
function TSupMTS.OpenSQL(const SQLStr: WideString): OleVariant;
begin
ConnDatabase;
with qry1do
begin
close;
sql.clear;
sql.Add('select * from table');
//此处也不需要事务
end;
result := dsp1.Data;
end;

procedure TNewMTS.ApplyData(const SQLStr: WideString;
vdata: OleVariant;
iMaxError: Integer;
var iErrorCount: Integer);
begin
ConnDatabase;
try
qry.Close;
qry.SQL.Clear;
qry.SQL.Text := 'select * from table';
dsp.UpdateMode := upWhereChanged;
dsp.ApplyUpdates(vData, iMaxError, iErrorCount);
setcomplete;
except
setabort;
end;
end;

 
那应该怎么提交数据呀,给个思路也行
服务器端用adoquery和datasetprovider,服务器端用clientdataset
 
高手真的不在吗?
帮帮我吧!有郑州或洛阳的,到春节我请吃饭。
 
你的设计方法不对
服务器能自动更新各种客户端的查询语句 应是不可能
更新一个表的数据还是多表的数据?
 
to 张无计
我传入的SQL语句就是取客户端数据时的语句
如果设计有问题, 那应该怎么做?
 
ADODataSet1 --> DataSetProvider1 --> ClientDataSet1
ADODataSet2 --> DataSetProvider2 --> ClientDataSet2
....
单表更新设计
不同的查询语句固定到对应的ADODataSet里 不要用动态的方式
设定ADODataSet 的 各Field 的属性 ProviderFlags 属性
设定DataSetProvider的UpdateMode 属性 UpWhereKeyOnly
在DataSetProvider 的 OnGetTableName 事件里 设定要更新的表的名称
TableName := 'yourtable'
 
只所以采用动态的方式是因为数据库的表太多了,那样的话,我要在服务器端放N个dataset
有什么好的解决方案吗?
 
我倒。。。。。。。。。。。。。
告诉你方法不信,算 了
另外建议你多看看书,这样的问题的确太低级了点。
 
to 无忧鱼
  不OPEN怎么取数据?
  你所说是事务吧,把你所说的代码去掉,会触发ADO错误,一开始我也没有加那些代码
 
唉,
1、建议你去看一下DataSetProvider的源码,他在GETDATA时会自动OPEN数据集,也就是说如果你ADOQUERY.OPEN一次的话,那么DataSetProvider.data时就相当于做了两次OPEN,你愿意这样吗?
2、取数据还需要什么事务呢?你根本是在增加服务器的负荷。有关出错的问题,那是你自己设计的问题。
多看看资料,有好处的。。。
 
先学会爬 才能站 才能跑 才能。。。。
 
to 无忧鱼
  能告诉我具体数据怎么更新吗?已经在这里卡了两天了,如果解决了,分数随你要。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=226555
我按这个方法写也不行,不知道是不是写得不对。
 
请参看http://www.wisdomstar.net 慧思企业物流管理系统的实现 是用 MSSQL SERVER 2000 + ADO + ( COM+ ) + Delphi 6 实现的用DCOMConnection 连接的完整的多层应用系统
各种数据表的数据更新的方法已在此完美解决
 
如果我的连接没有用DCOM或socket呢?数据完全是自己通过接口取得的?
 
一样的
关键是要理解Midas 的数据更新的机制 ( 通过DataSetProvider 来自动更新数据 ,
还是自己写代码来更新数据 )
通过DataSetProvider 来自动更新数据 必须要理解相关的各个属性与事件
自己更新数据 只能是自己根据要求更新的数据 自己构造SQL语句来更新数据
想要个简单的类似你提出的更新数据的方式 来正确更新各种数据 是不可能的
 
to 张无计
能上QQ谈吗?
5254918
 
先建立一個事件, 比如 ExecuteSql
然后加上類似以下代碼:
procedure TErpConnection.ExecuteSql(const Sql_Str: WideString);
begin
try
with Conn_Querydo
begin
close;
sql.clear;
sql.Add(Sql_Str);
ExecSQL;
close;
SetComplete;
end;
except
on Exceptiondo
begin
SetAbort;
SaveLog('Execute SQL Statement Error:' + Sql_Str);
raise;
//Exception.Create('Execute SQL Statement Error:'+Sql_Str);
end;
end;

end;
 
你的解决方案不对,代码要通过在客户端的ClientDataSet来执行,不是在服务器端.
我的所有项目服务器都是5个AdoDataSet,一般情况下只会用到其中两个.
 
to hcm0790
 你所说的方法我已经实现。但我想把数据读到客户端,编辑完后再提交到服务器,现在还不能实现
to yutouda_cn
你所说的中间连接方式是什么?dcom?我不想在中间建立协议。
 
后退
顶部