在此多谢CSDN上一些兄弟的帮助,我才可以实现这个功能....上传文件到数据库:procedure Tw_main.SpeedButton_upClick(Sender: TObject);
const
  BufSize = $F000;
var
  Counter, N: Integer;
  Buffer: PAnsiChar;
  FieldStrm: TStream;
  exeFilestream:Tfilestream;
begin
  if  (edit_filepath.Text='') or (edit_ver_new.Text='') then
    MessageBox(Handle,pchar('文件路径和文件名不能为空,或版本号输入不正确!'),'提示',MB_ICONEXCLAMATION)
  else
    with ADOQuery_zxsj do
      try
        exeFilestream:=TFileStream.Create(edit_filepath.Text,fmopenRead);//打开文件
        if MessageBox(Handle,pchar('确认要将 ['+edit_filepath.Text+'] 的文件版本设置为 ['+edit_ver_new.Text+'] 并上传到服务器?'),'系统提示',MB_YESNO OR MB_ICONQUESTION or MB_DEFBUTTON2)=IDYES then
          try
            edit;
  //            TBlobField(FieldByName('filestream_ZXSJ')).loadfromStream(exeFilestream);///保存到库里
            FieldStrm := adoquery_zxsj.CreateBlobStream(adoquery_zxsj.FieldByName('filestream_ZXSJ'), bmWrite);
            GetMem(Buffer, BufSize);
            try
              Counter := exeFilestream.Size;
              size_tmp := exeFilestream.Size;              ProgressBar_up.Position := 0;
              ProgressBar_up.Max := Counter div BufSize;//每次上传文件流为61440 byte = $F000
              while Counter <> 0 do
                begin
                  if Counter > BufSize then
                    N := BufSize
                  else
                    N := Counter;
                  exeFilestream.ReadBuffer(Buffer^, N);
                  FieldStrm.WriteBuffer(Buffer^, N);
                  Dec(Counter, N);
                  ProgressBar_up.Position := ProgressBar_up.Position + 1;
                  Application.ProcessMessages;
                end;
            finally
              FreeMem(Buffer, BufSize);
              FieldStrm.Free;
            end;
            fieldbyname('appname_ZXSJ').AsString:=file_tmp;
            fieldbyname('version_ZXSJ').AsString:=edit_ver_new.text;
            fieldbyname('size_ZXSJ').AsFloat:=size_tmp;
            fieldbyname('update_ZXSJ').AsDateTime:=now();
            fieldbyname('re_ZXSJ').AsString:=memo_re_new.text;
            post;
            MessageBox(Handle,pchar('文件上传成功!'),'信息',MB_ICONINFORMATION);
          finally
            ProgressBar_up.Position := ProgressBar_up.Max;
            exeFilestream.Free;
          end;
      finally
        begin
    //          exeFilestream.Free;
    //          MessageBox(Handle,pchar('文件打开失败!'),'提示',MB_ICONEXCLAMATION);
        end;
      end;
end;

解决方案 »

  1.   

    从数据库下载保存为文件procedure Tw_main.update_down();
    var
      myfilename:string;//保存文件的路径和文件名
      myfileStream,exeBlobStream: TStream;
      Count,BufSize, N: Integer;
      Buffer: PChar;
    const
      MaxBufSize = $F000;
    begin
      timer_down.Enabled := false;
      with w_main.adoquery_ZXSJ do
        begin
          close;sql.Clear;
          sql.Add('select * from ZXSJ');
          open;
          myfilename := ExtractFilePath(Application.ExeName) + fieldbyname('appname_zxsj').AsString;//获得文件的完整路径
    //              TBlobField(FieldByName('filestream_ZXSJ')).SaveToFile(fieldbyname('appname_zxsj').AsString);
          myfileStream := TFileStream.Create(myfilename, fmCreate);//创建文件
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
          try  //SaveToStream(Stream);
            exeBlobStream := ADOQuery_ZXSJ.CreateBlobStream(FieldByName('filestream_ZXSJ'), bmRead);//从数据库中取得记录
            Count := 0;
            try
              if Count = 0 then
              begin
                exeBlobStream.Position := 0;
                Count := exeBlobStream.Size;//showmessage(inttostr(count));
              end;
              if Count > MaxBufSize then BufSize := MaxBufSize else BufSize := Count;
              GetMem(Buffer, BufSize);          ProgressBar_down.Position := 0;
              ProgressBar_down.Max := count div bufsize;//每次写入文件的数据流大小为bufsize,所以max为count 除以 bufsize
              try
                while Count <> 0 do
                begin
                  if Count > BufSize then N := BufSize else N := Count;
                  exeBlobStream.ReadBuffer(Buffer^, N);//从数据库表中取数据流
                  MyFileStream.WriteBuffer(Buffer^, N);//将数据流写入文件
                  Dec(Count, N);
                  ProgressBar_down.Position := ProgressBar_down.Position + 1;
                end;
              finally
                FreeMem(Buffer, BufSize);
              end;
            finally
              exeBlobStream.Free;
            end;
          finally
            myfileStream.Free;
          end;
      end;
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //  TBlobField(FieldByName('filestream_ZXSJ')).SaveToFile(fieldbyname('appname_zxsj').AsString);
      myini.WriteString('system','version',g_version_sql);//将新版本号写入ini
      MessageBox(Handle,pchar('软件升级完成!'),'信息',MB_ICONINFORMATION);
      winexec(pchar(ExtractFilePath(Application.ExeName)+i_exename),SW_SHOWNORMAL);
      application.ShowMainForm:=false;
      application.Terminate;
    end;
      

  2.   

    上传文件:
    1.将EXE文件上传保存到数据库,字段为IMAGE类型,保存有:文件名,文件大小,文件版本号,上传日期,备注
    2.文件版本号主要用来和ini文件中的旧版本进行比较,如果大于旧版本就下载,不大于就不下载下载文件:
    1.发现数据库中的版本号大于INI文件中的版本号,就开始下载
    2.下载完后将数据库中的版本号写入INI文件中,做为升级后的版本号
    3.下载完后通过winexec(pchar(ExtractFilePath(Application.ExeName)+i_exename),SW_SHOWNORMAL);开始运行主程序
      

  3.   

    非常感谢:blazingfire(烈焰)(对.net极度憎恨中....) 的帮助
      

  4.   

    up,正好用到,thank you all lot