广告
淘宝内部优惠券
当前位置: 开发异常方案库» Delphi » ADO执行INSERT云端数据库丢失数据

ADO执行INSERT云端数据库丢失数据

开发异常方案库  收集整理于:2020-05-01 14:58:00  浏览:66次
最近接手一个项目 代码使用环境是本地 MSSQL2000  服务器 MSSQL2008   作用于发生交易后转存记录到服务器SQL2008上 局域网环境下使用没有任何问题。  但是最近迁移服务器到了阿里云服务器  经常性出现丢失记录行的情况  代码在局域网环境下执行了多年无任何异常和数据缺失问题。 (实际使用环境中可能有互联网接入质量差的问题。)     tmpTableName := SystemSetup.DataATableName;     //插入远程服务器表tmpTableName      tmpSQLStr := 'insert into ' + tmpTableName + '(did, dinsetcode, dno, ddate, dtime, dnum)';     DM.ADODealComm.CommandText := tmpSQLStr;     DM.ADODealComm.Prepared := True;     {$IFNDEF BDE}       if SystemSetup.BakData then       begin         tmpSQLStr := 'insert into hs_000ahistory(did, dbarcode, dno, ddate, dtime, dnum)';         TADOQuery(DM.TableAHistory).SQL.Text := tmpSQLStr;         TADOQUERY(DM.TableAHistory).Prepared := True;       end;     {$ENDIF}     DM.TableA.First;     ARecordCount := 0;     while (not DM.TableA.Eof) and (not tmpError) do     begin       //写入服务器。       if ALimit then       begin         ARecordCount := ARecordCount + 1;         if ARecordCount > 100 then           Break;       end;         with DM.ADODealComm.Parameters, DM.TableA do         begin           ParamByName('did').Value := FieldByName('did').AsString;           ParamByName('dbarcode').Value := FieldByName('dbarcode').AsString;           ParamByName('dNo').Value := FieldByName('dNo').AsString;           ParamByName('dDate').Value := FieldByName('DDate').AsDateTime;           ParamByName('dtime').Value := FieldByName('dtime').AsString;           ParamByName('dnum').Value := FieldByName('dnum').AsVariant;         end;             DM.ADODealComm.Execute;         //数据有确实现象。  比如这笔交易10行记录          //实际远程服务器接这笔交易只有7行记录 或者压根没有记录        //尝试过TADOQuery(dm.ADODealComm).RowsAffected <> 1写入日志       //记录发现该笔交易10条记录  日志写入10次   相当于10条记录均未写入数据。         {$IFNDEF BDE}         if SystemSetup.BakData then         begin           with TADOQuery(DM.TableAHistory).Parameters, DM.TableA do           begin             ParamByName('did').Value := FieldByName('did').AsString;             ParamByName('dbarcode').Value := FieldByName('dbarcode').AsString;             ParamByName('dNo').Value := FieldByName('dNo').AsString;             ParamByName('dDate').Value := FieldByName('DDate').AsDateTime;             ParamByName('dtime').Value := FieldByName('dtime').AsString;             ParamByName('dnum').Value := FieldByName('dnum').AsVariant;           end;    // with           TADOQuery(DM.TableAHistory).ExecSQL;           //本地备份的数据无任何问题。无数据丢失。         end;         {$ENDIF}         DM.TableA.Delete;     end; 

------网友观点--------------------
1 首先加个try 看能不能抛出错误 2 不用table, 试试query

------网友观点--------------------
这种业务一般调用服务器上的服务相对要安全一些。 用ADO直连接云数据库还是受限制比较多,如果到5G时代应该就好了。

------网友观点--------------------
直接连外网数据库,存在访问慢和容易掉线问题,你备份也没有开启事务,特别是写入,由于交互次数多,速度非常慢。如果中间一量断线,就只更新了其中的一些数据。

------网友观点--------------------
外网一定不要直连,一个是不安全,还有就是速度太慢。 如果程序代码多不想改老代码,可以下载satrda中间件,修改连接串对外网更新可以加速几十上百倍。 参考这个连接改https://blog.csdn.net/pcwe2002/article/details/52527782

------网友观点--------------------
把数据库暴露在外网就是在找死。多用户环境下直接连接数据库也不可取。
发布此文章仅为传递网友分享,不代表本站观点,若侵权请联系我们删除,本站将不对此承担任何责任。
软件开发 程序错误 异常 ybaby.netCopyright © 2020-2026  ybaby 版权所有  桂ICP备17004385号-2 网站地图