遇到个奇怪的问题,同时开启本地和远程两个事务,远程事务是sql2000没问题,是sql2008的不报错,但是写不上数据
来源:互联网 发布:软件测试难学吗 编辑:程序博客网 时间:2024/05/29 15:58
遇到个奇怪的问题,同时开启本地和远程两个事务,远程事务是sql2000没问题,是sql2008的不报错,但是写不上数据。
倒腾了4、5天,找到最终的解决办法:直接调用AdoConnection.execute(sq脚本),看来AdoQuery调用AdoConnection的还是有兼容性问题。
Function TDM_Base.PassMarkBill(AQuery:TAdoQuery; lTrans:Boolean=True;
sID:String=''; sMachineID:String=''; sUserName:String='';
nAddinRate:Real=1; lAllowNegative:Boolean=True; lUpdateLastDate:Boolean=True):Boolean;
Var qry, qryR:TAdoQuery;
n:Real; lT:Boolean;
sErrMsg, sSql:string;
Begin
Result:=False; qryR:=nil;
Qry:=AQuery;
if not assigned(qry) then qry:=qry_R;
qryR:=getNewAdoQuery(qry.connection); //getNewAdoQuery(qry.connection);
sErrMsg:='';
With QryR do
Try
Close;
lT:=false;
if lTrans and (not connection.inTransaction) then begin
connection.BeginTrans;
lT:=true;
end;
//**************************调用执行sql存储过程***********************//
//20160727特别说明:用AdoQuery直接执行,在连接远程的事务中,会出现莫名其妙的错误
//下面屏蔽掉了的代码,执行完了不报错,但是在Frm_SalePos.SaveData中,
//调用iBaseBiz.moveMarkBill时,然后调用这里,会导致莫名其妙的错误,
//程序不报错,但是服务器那头没数据,事务自己撤销了
//********************************************************************//
sql.text:='declare @n real ';
sql.add('exec @n=passMarkBill '+quotedStr(sID)+', '+quotedStr(sUserName)+', '+
floatToStr(nAddinRate)+', '+iif(lAllowNegative,'1','0')+', '+iif(lUpdateLastDate,'1','0')+' ');
//sql.add(' exec @n=passMarkBill :sID, :sUser, :nRate, :lAllowNegative, :lUpdateLastDate ');
sql.add('select @n as nResult ');
//parameters.ParamValues['sID']:=sID;
//parameters.ParamValues['sUser']:=sUserName;
//parameters.ParamValues['nRate']:=nAddinRate;
//parameters.ParamValues['lAllowNegative']:=lAllowNegative;
//parameters.ParamValues['lUpdateLastDate']:=lUpdateLastDate;
//open; //execSql
sSql:=sql.text;
connection.Execute(sSql); //******用最底层的连接执行没问题********//
//n:=fields[0].Value;
//if n<>0 then raise exception.Create('审核出错!返回值非零。'+floatToStr(n));
//写日志
writeSysLog(qryR, sID, sID+'审核积分单据', self.name+'.PassMarkBill');
//
if lT then connection.CommitTrans;
Result:=True;
Except
On x:Exception do begin
if lT then connection.RollbackTrans;
sErrMsg:='[PassMarkBill]审核积分单'+sID+'出错!'#13+x.message;
End;
End;
if assigned(qryR) then freeAndNil(qryR);
if sErrMsg<>'' then Raise Exception.Create(sErrMsg);
End;
倒腾了4、5天,找到最终的解决办法:直接调用AdoConnection.execute(sq脚本),看来AdoQuery调用AdoConnection的还是有兼容性问题。
Function TDM_Base.PassMarkBill(AQuery:TAdoQuery; lTrans:Boolean=True;
sID:String=''; sMachineID:String=''; sUserName:String='';
nAddinRate:Real=1; lAllowNegative:Boolean=True; lUpdateLastDate:Boolean=True):Boolean;
Var qry, qryR:TAdoQuery;
n:Real; lT:Boolean;
sErrMsg, sSql:string;
Begin
Result:=False; qryR:=nil;
Qry:=AQuery;
if not assigned(qry) then qry:=qry_R;
qryR:=getNewAdoQuery(qry.connection); //getNewAdoQuery(qry.connection);
sErrMsg:='';
With QryR do
Try
Close;
lT:=false;
if lTrans and (not connection.inTransaction) then begin
connection.BeginTrans;
lT:=true;
end;
//**************************调用执行sql存储过程***********************//
//20160727特别说明:用AdoQuery直接执行,在连接远程的事务中,会出现莫名其妙的错误
//下面屏蔽掉了的代码,执行完了不报错,但是在Frm_SalePos.SaveData中,
//调用iBaseBiz.moveMarkBill时,然后调用这里,会导致莫名其妙的错误,
//程序不报错,但是服务器那头没数据,事务自己撤销了
//********************************************************************//
sql.text:='declare @n real ';
sql.add('exec @n=passMarkBill '+quotedStr(sID)+', '+quotedStr(sUserName)+', '+
floatToStr(nAddinRate)+', '+iif(lAllowNegative,'1','0')+', '+iif(lUpdateLastDate,'1','0')+' ');
//sql.add(' exec @n=passMarkBill :sID, :sUser, :nRate, :lAllowNegative, :lUpdateLastDate ');
sql.add('select @n as nResult ');
//parameters.ParamValues['sID']:=sID;
//parameters.ParamValues['sUser']:=sUserName;
//parameters.ParamValues['nRate']:=nAddinRate;
//parameters.ParamValues['lAllowNegative']:=lAllowNegative;
//parameters.ParamValues['lUpdateLastDate']:=lUpdateLastDate;
//open; //execSql
sSql:=sql.text;
connection.Execute(sSql); //******用最底层的连接执行没问题********//
//n:=fields[0].Value;
//if n<>0 then raise exception.Create('审核出错!返回值非零。'+floatToStr(n));
//写日志
writeSysLog(qryR, sID, sID+'审核积分单据', self.name+'.PassMarkBill');
//
if lT then connection.CommitTrans;
Result:=True;
Except
On x:Exception do begin
if lT then connection.RollbackTrans;
sErrMsg:='[PassMarkBill]审核积分单'+sID+'出错!'#13+x.message;
End;
End;
if assigned(qryR) then freeAndNil(qryR);
if sErrMsg<>'' then Raise Exception.Create(sErrMsg);
End;
0 0
- 遇到个奇怪的问题,同时开启本地和远程两个事务,远程事务是sql2000没问题,是sql2008的不报错,但是写不上数据
- 本地tomcat加载js没问题,但是放到远程上就报404
- 关于getByte()方法的说明,本地调用base64没问题,远程调用就出现问题
- SQL2000升级到了SQL2008遇到的问题之一
- Hibernate事务的开启问题
- sql2008 开启远程连接
- 这台服务器的配置是远程管理的默认远程桌面模式,这允许最多两个用户同时进行远程
- win2003+sql2000的远程访问的问题
- SQL2000远程连接不了的问题
- SQL2000无法远程连接的问题 [转]
- jfinal事务小例子,事务,是要自己写的,框架可以代劳部分工作,但是不能替代你写事务,程序员是要做工作的
- Oracle 客户端配置后,同时再装服务器端出现的无法同时链接远程服务器和本地的问题
- hive建表没使用LZO存储格式,但是数据是LZO格式时遇到的问题
- 分布式环境下,事务在客户端远程调用中事务不能传播的问题的解决
- 《Thinking in Java》RMI远程方法示例代码运行是可能遇到的问题及解决方法
- hibernate事务遇到的问题
- SQL2000和SQL2005和SQL2008同时安装问题
- sql2005和sql2000同时安装的问题
- mysql 5.6 优化
- java学习之TCP客户端程序
- foreach (int i in d.Values) Console.Write(i);
- KMP算法
- 网站建设和网站运营的关系
- 遇到个奇怪的问题,同时开启本地和远程两个事务,远程事务是sql2000没问题,是sql2008的不报错,但是写不上数据
- poj 2074
- SpringMVC验证
- RX操作符之Observable的创建方式二(defer、range、interval、timer、Empty、Never、Throw)
- 房贷计算器java版
- Mongodb主从复制
- 需求变更的控制及管理
- 让RecyclerView更通用
- 在头文件中加入#program once