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

时间:2022-12-05 20:11:12
问题是这样的:
我在中间层中定义了一个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函数取消异常处理后出现的。)

请问:怎么会出现这个错误呢?应该怎么解决呢?谢谢!

7 个解决方案

#1


没人知道吗?自己顶

#2


不是真的没人来吧 ?谁来帮帮忙呀?

#3


错在这行: if ErrCount >0 then Abort;

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

 if ErrCount >0 then
   回滚事务
 else
   提交事务;

#4


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

#5


DreamStrat(梦启动的摇篮…):
1、 if ErrCount >0 then
      回滚事务
    else
      提交事务;
    这样的写法我试过了,问题不是出在这里。
2、 “你的前端ClientDataSet1远程ProviderName恰好是DataSetProvider1且DataSetProvider1对应的TDataSet已打开”正是你所说的如此。
3、 这个错误的意思是格式化文本时出错,所以很奇怪。
谢谢你的关注!

#6


结了结了,难道等你来强制结贴?

#7


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);


#1


没人知道吗?自己顶

#2


不是真的没人来吧 ?谁来帮帮忙呀?

#3


错在这行: if ErrCount >0 then Abort;

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

 if ErrCount >0 then
   回滚事务
 else
   提交事务;

#4


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

#5


DreamStrat(梦启动的摇篮…):
1、 if ErrCount >0 then
      回滚事务
    else
      提交事务;
    这样的写法我试过了,问题不是出在这里。
2、 “你的前端ClientDataSet1远程ProviderName恰好是DataSetProvider1且DataSetProvider1对应的TDataSet已打开”正是你所说的如此。
3、 这个错误的意思是格式化文本时出错,所以很奇怪。
谢谢你的关注!

#6


结了结了,难道等你来强制结贴?

#7


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);