我在中间层中定义了一个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
提交事务;
Abort属于哑中断,如果执行了它,后面的所有内容都不会执行,按你程序的意思应为回滚才对
if ErrCount >0 then
回滚事务
else
提交事务;
#4
而且感觉 前端的: DCOMConnection1.AppServer.ApplyUpdates(CustVar); //此句调用
这行与中间层有那么一点冲突,除非你在中间层拦截了DataSetProvider1.OnBeforeUpdateRecord事件处理(将Applied显示置为True) 或者 你的前端ClientDataSet1远程ProviderName恰好是DataSetProvider1且DataSetProvider1对应的TDataSet已打开,否则肯定会出错的
这行与中间层有那么一点冲突,除非你在中间层拦截了DataSetProvider1.OnBeforeUpdateRecord事件处理(将Applied显示置为True) 或者 你的前端ClientDataSet1远程ProviderName恰好是DataSetProvider1且DataSetProvider1对应的TDataSet已打开,否则肯定会出错的
#5
DreamStrat(梦启动的摇篮…):
1、 if ErrCount >0 then
回滚事务
else
提交事务;
这样的写法我试过了,问题不是出在这里。
2、 “你的前端ClientDataSet1远程ProviderName恰好是DataSetProvider1且DataSetProvider1对应的TDataSet已打开”正是你所说的如此。
3、 这个错误的意思是格式化文本时出错,所以很奇怪。
谢谢你的关注!
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);
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
提交事务;
Abort属于哑中断,如果执行了它,后面的所有内容都不会执行,按你程序的意思应为回滚才对
if ErrCount >0 then
回滚事务
else
提交事务;
#4
而且感觉 前端的: DCOMConnection1.AppServer.ApplyUpdates(CustVar); //此句调用
这行与中间层有那么一点冲突,除非你在中间层拦截了DataSetProvider1.OnBeforeUpdateRecord事件处理(将Applied显示置为True) 或者 你的前端ClientDataSet1远程ProviderName恰好是DataSetProvider1且DataSetProvider1对应的TDataSet已打开,否则肯定会出错的
这行与中间层有那么一点冲突,除非你在中间层拦截了DataSetProvider1.OnBeforeUpdateRecord事件处理(将Applied显示置为True) 或者 你的前端ClientDataSet1远程ProviderName恰好是DataSetProvider1且DataSetProvider1对应的TDataSet已打开,否则肯定会出错的
#5
DreamStrat(梦启动的摇篮…):
1、 if ErrCount >0 then
回滚事务
else
提交事务;
这样的写法我试过了,问题不是出在这里。
2、 “你的前端ClientDataSet1远程ProviderName恰好是DataSetProvider1且DataSetProvider1对应的TDataSet已打开”正是你所说的如此。
3、 这个错误的意思是格式化文本时出错,所以很奇怪。
谢谢你的关注!
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);
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);