起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 232|回复: 6

【结帖】在线等!执行ApplyUpdates,提示异常:正在提交**

[复制链接]
发表于 2008-6-20 14:47:51 | 显示全部楼层 |阅读模式
现在我编写一个大文件上传到数据库的功能。现在我把文件按10M分解好以后用内存流传到非结构化设计的表里面。因为是循环把多个小文件传到表里,每次执行,第一个文件上传成功,第二个就报错,异常:正在提交。改成1M分解也是一样报错。
代码如下
procedure TDivThread.Execute;
var
  Mem : TMemoryStream;    //原始文件
  DivMem : TMemoryStream; //分割文件
  DivPageSize : integer;  //分割文件大小
  WriteSize : integer;    //写入分割文件大小
  H:TTransactionHandle;   //事务处理标志
  XZZXDs : TSQLDataSet;
  FJMC : string;
  KZM  : string;
  PXH  : Integer;
  FileSize: string;
  FGUID : string;
begin
  //FileNm := 'C:\cxy200803.pdf';
  DivPageSize := 1024*1024*1; //10M
  FJMC := SysUtils.ExtractFileName(FileNm);
  KZM := SysUtils.ExtractFileExt(FileNm);
  KZM := SysUtils.LowerCase(KZM);
  FJMC := FJMC.SubString(0, FJMC.Length - KZM.Length);
  Mem := TMemoryStream.Create;
  DivMem := TMemoryStream.Create;
  Mem.LoadFromFile(FileNm);
  WriteSize := 0;
  Mem.Position := 0;
  //得到文件大小
  if Mem.Size mod DivPageSize = 0 then
     PageCount := Trunc(Mem.Size / DivPageSize)
  else
     PageCount := Trunc(Mem.Size / DivPageSize) + 1 ;
  CurrentPage := 0;
  if Mem.Size < 1024 then
     FileSize := SysUtils.IntToStr(Mem.Size) + ' 字节'
  else if Mem.Size < 1048576 then
     FileSize := SysUtils.FloatToStr(
       Trunc(System.Math.Abs(Mem.Size/1024) * 100+ 0.5) /100) + ' KB'
  else if Mem.Size < 1073741824 then
     FileSize := SysUtils.FloatToStr(
       Trunc(System.Math.Abs(Mem.Size/1048576) * 100+ 0.5) /100) + ' MB'
  else if Mem.Size < 1099511627776 then
     FileSize := SysUtils.FloatToStr(
       Trunc(System.Math.Abs(Mem.Size/1073741824) * 100+ 0.5) /100) + ' GB';
  //事务处理
  H := MyForm.InfoBroker1.info.Transaction.Start(False);
  try
     begin
     //1。把文件名等写入父表,并取得父表GUID
     XZZXDs := TSqlDataSet(MyForm.InfoBroker1.Info.DataSetByID('XZZX'));
     if not XZZXDs.Active then
        XZZXDs.Open;
     if IsExist then
        XZZXDs.Edit
     else
        XZZXDs.Append;
     XZZXDs.FindField('FJMC').AsString := FJMC;
     XZZXDs.FindField('KZM').AsString := KZM;
     XZZXDs.FindField('PXH').AsInteger := PXH;
     XZZXDs.FindField('FJDX').AsString := FileSize;
     XZZXDs.FindField('FGGS').AsInteger := PageCount;
     XZZXDs.ApplyUpdates;
     FGUID := XZZXDs.FindField('GUID').AsString;
     //2。把分割好的文件写入子表
     XZZXDs := TSqlDataSet(MyForm.InfoBroker1.Info.DataSetByID('XZZXXXWJ'));
     if not XZZXDs.Active then
        XZZXDs.Open;
     try
        while Mem.Position < Mem.Size do
        begin
          if Mem.Position + DivPageSize <= Mem.Size then
             WriteSize := DivPageSize
          else
             WriteSize := Mem.Size - Mem.Position;
          CurrentPage := CurrentPage + 1;
          DivMem.Clear;
          DivMem.Position := 0;
          if Terminated then Exit;
          DivMem.CopyFrom(Mem,WriteSize);
          if Terminated then Exit;
          XZZXDs.Append;
          XZZXDs.FindField('FGUID').AsString := FGUID;
          TBlobField(XZZXDs.FindField('FJNR')).LoadFromStream(DivMem);
          XZZXDs.FindField('PXH').AsInteger := CurrentPage;
          XZZXDs.ApplyUpdates;//执行第2次时,报错!
          Synchronize(ShowChanges);
        end;
     finally
        Mem.free;
        DivMem.free;
     end;
     MyForm.InfoBroker1.info.Transaction.Commit(H);
     end;
  except
     MyForm.InfoBroker1.info.Transaction.Rollback(H);
  end;
end;
回复

使用道具 举报

发表于 2008-6-20 14:53:42 | 显示全部楼层
非立即事务,每个事务中只能提交一次。只能执行一次ApplyUpdates、
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-20 14:59:31 | 显示全部楼层
我在论坛里看到zfang说:
使用立即事务,需要在启动事务和提交事务直接用时非常的短,一般不要超过2秒
我这个文件上传过程时间较长
因为是父子表,一个父记录,多个子记录,并且子记录中的字段有父记录字段值,有什么办法实现这个功能并且带上事务功能?
回复 支持 反对

使用道具 举报

发表于 2008-6-20 15:17:05 | 显示全部楼层
只在最后提交一次,其他都只用post保存
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-20 15:24:38 | 显示全部楼层
我去掉事务再执行就成功了。
看来只能手工做事务回滚得事情了
结贴!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-20 15:28:06 | 显示全部楼层
怎么结贴?
回复 支持 反对

使用道具 举报

发表于 2008-6-20 15:44:33 | 显示全部楼层
在主题上加【结帖】就可以了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-19 23:25 , Processed in 0.040326 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表