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

bengerpi8050 2020-04-07 10:16:59
最近接手一个项目 代码使用环境是本地 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;
...全文
435 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanqth 2020-05-01
  • 打赏
  • 举报
回复
把数据库暴露在外网就是在找死。多用户环境下直接连接数据库也不可取。
pcwe2002 2020-04-28
  • 打赏
  • 举报
回复
外网一定不要直连,一个是不安全,还有就是速度太慢。 如果程序代码多不想改老代码,可以下载satrda中间件,修改连接串对外网更新可以加速几十上百倍。 参考这个连接改 https://blog.csdn.net/pcwe2002/article/details/52527782
pcwe2002 2020-04-28
  • 打赏
  • 举报
回复
直接连外网数据库,存在访问慢和容易掉线问题,你备份也没有开启事务,特别是写入,由于交互次数多,速度非常慢。如果中间一量断线,就只更新了其中的一些数据。
tgbd 2020-04-08
  • 打赏
  • 举报
回复
这种业务一般调用服务器上的服务相对要安全一些。 用ADO直连接云数据库还是受限制比较多,如果到5G时代应该就好了。
dgtxqb 2020-04-08
  • 打赏
  • 举报
回复
1 首先加个try 看能不能抛出错误
2 不用table, 试试query

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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