请教一个用dataSetProvider更新数据的问题,请高手不吝赐教

Kevin_Lmx 2004-09-29 07:53:54
问题是这样的:
我在中间层中定义了一个ApplyUpdates的函数,原型如下(已经在Type Library中注册过):
procedure ApplyUpdates(var CustVar:OleVariant);safecall;

函数内容如下:
procedure ApplyUpdates(var CustVar:OleVariant);
var
ErrCount:Integer;
begin
try
DataBase1.StartTransaction;
CustVar := DataSetProvider1.ApplyUpdates(CustVar,0,ErrCount);
if ErrCount >0 then Abort;
DataBase1.Commit;
except
DataBase1.Rollback;
end;
end;

我在客户端中用来调用的函数的代码如下:
procedure ApplyUpdates;
var
CustVar :Olevariant;
begin
ClientDataSet1.CheckBrowseMode;
if ClientDataSet1.ChangeCount>0 then
begin
CustVar := ClientDataSet1.Delta;
DCOMConnection1.AppServer.ApplyUpdates(CustVar); //此句调用
end;
end;

编译通过,但是在运行时出现了一个的错误:Format '%s' invalid or incompatible with argument.
(注:中间层ApplyUpdates函数取消异常处理后出现的。)

请问:怎么会出现这个错误呢?应该怎么解决呢?谢谢!
...全文
159 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
DreamStrat 2004-10-01
  • 打赏
  • 举报
回复
1: 将函数
procedure ApplyUpdates(var CustVar:OleVariant);safecall;
声明成:
Function ApplyUpdates(var CustVar:OleVariant): OleVariant ;safecall;
格式


且在函数中发现这行中的CustVar即当传入参数,又当传出参数,你试着将此行改造成:
var rst: OleVariant
rst := DataSetProvider1.ApplyUpdates(CustVar,0,ErrCount);
result := rst;


前端的:
CustVar := ClientDataSet1.Delta;
DCOMConnection1.AppServer.ApplyUpdates(CustVar); //此句调用
改为:
var rst: OleVariant
CustVar := ClientDataSet1.Delta;
rst := DCOMConnection1.AppServer.ApplyUpdates(CustVar);


DreamStrat 2004-09-30
  • 打赏
  • 举报
回复
而且感觉 前端的: DCOMConnection1.AppServer.ApplyUpdates(CustVar); //此句调用
这行与中间层有那么一点冲突,除非你在中间层拦截了DataSetProvider1.OnBeforeUpdateRecord事件处理(将Applied显示置为True) 或者 你的前端ClientDataSet1远程ProviderName恰好是DataSetProvider1且DataSetProvider1对应的TDataSet已打开,否则肯定会出错的
DreamStrat 2004-09-30
  • 打赏
  • 举报
回复
错在这行: if ErrCount >0 then Abort;

Abort属于哑中断,如果执行了它,后面的所有内容都不会执行,按你程序的意思应为回滚才对

if ErrCount >0 then
回滚事务
else
提交事务;
Kevin_Lmx 2004-09-30
  • 打赏
  • 举报
回复
不是真的没人来吧 ?谁来帮帮忙呀?
Kevin_Lmx 2004-09-30
  • 打赏
  • 举报
回复
结了结了,难道等你来强制结贴?
Kevin_Lmx 2004-09-30
  • 打赏
  • 举报
回复
DreamStrat(梦启动的摇篮…):
1、 if ErrCount >0 then
回滚事务
else
提交事务;
这样的写法我试过了,问题不是出在这里。
2、 “你的前端ClientDataSet1远程ProviderName恰好是DataSetProvider1且DataSetProvider1对应的TDataSet已打开”正是你所说的如此。
3、 这个错误的意思是格式化文本时出错,所以很奇怪。
谢谢你的关注!
Kevin_Lmx 2004-09-29
  • 打赏
  • 举报
回复
没人知道吗?自己顶

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧