0

助けてください、私は何が間違っているのかわかりません。

クライアント マシンを自動更新するために、サーバー マシンからファイルを取得するアプリケーションを開発しています。これは私が思いついたものです:

void TAutoUpdate::CarregarDados()
{
   try{
      TQuery* Q = new TQuery(NULL);
      Q->DatabaseName = "Base";
      Q->SQL->Add("SELECT * FROM UPDATE_MODULES WHERE DT_UPDATE > " + QuotedStr(ReadIni("ICDNetXP", "AutoUpdate", "DataUpdate", "12/30/1899")));
      Q->Prepare();
      Q->Active = true;
      Q->First();

      MemoryStream = new TMemoryStream;
      MemoryStream->Seek(0, soFromBeginning);

      SQLConnectionServer->Connected = true;
      TSMClient* Servidor = new TSMClient(SQLConnectionServer->DBXConnection);
      TDateTime maiorDataUpdate;
      String caminho;
      while(!Q->Eof){
         MemoryStream->Clear();

         if(maiorDataUpdate < Q->FieldByName("DT_UPDATE")->AsDateTime)
            maiorDataUpdate = Q->FieldByName("DT_UPDATE")->AsDateTime;

         caminho = "";
         caminho += Q->FieldByName("PATH")->AsString + Q->FieldByName("NOME")->AsString;
         MemoryStream->LoadFromStream(CopyStream(Servidor->GetAtualizacaoSistema(Q->FieldByName("ID")->AsString))); //here the error occours on 2nd execution of the while block
         MemoryStream->Seek(0, soFromBeginning);
         MemoryStream->SaveToFile(caminho);
         Q->Next();
      }
   }catch(Exception & e){
      MessageDlg(e.Message, mtError, TMsgDlgButtons() << mbOK, 0);
   }
}

TStream* TAutoUpdate::CopyStream(TStream* StreamIn)
{
      int BytesRead;
      System::PByte Buffer;
      const MaxBufSize = 1;
      TMemoryStream* StreamOut = new TMemoryStream;

      StreamIn->Seek(0, soFromBeginning);
      StreamOut->Seek(0, soFromBeginning);

      do{
         BytesRead = StreamIn->Read(Buffer, MaxBufSize);
         if(BytesRead > 0)
            StreamOut->Write(Buffer, MaxBufSize);

      }while(BytesRead > 0);

      StreamOut->Seek(0, soFromBeginning);
      StreamOut->SaveToFile("teste");
      return StreamOut;
}

したがって、このコードが機能する理由を知りたいのですが、while を使用した最初の反復でのみです。クエリの結果は正しく、コードは正常にロードおよび保存されますが、que クエリの最初の結果に対してのみです。そして、これが機能するための回避策があればいいでしょう。

4

0 に答える 0