0

夜の最終問題。そして、これの完全な愚かさをお詫びします。

私は、stackoverflowとgoogleの助けを借りて、次のことを達成しました...

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 ADOCommand1->CommandText = "drop table pictures purge";
 ADOCommand1->Execute();
 ADOCommand1->CommandText = "create table pictures(id autoincrement, filename TEXT(255), notes text(255), category text(20), rank int, filedate datetime,constraint table1_PK primary key(id));";
 ADOCommand1->Execute();
 AddFiles(Edit1->Text);
}
//---------------------------------------------------------------------------

int AddFiles(AnsiString path, int count)
{
 TSearchRec sr;
 int f,count2=0;
 f = FindFirst(path+"\\*.*", faAnyFile, sr);
 while( !f )
 {
  if(sr.Attr & faDirectory)
  {
   if(sr.Name != "."   &&   sr.Name != "..")
   {
    AnsiString subpath;
    subpath.sprintf("%s%s%s", path, "\\", sr.Name);
    count = AddFiles(subpath,count);
   }
  }
  else
  {
   Form1->ADOCommand1->CommandText = "Insert into pictures (filename) values ('" + StringReplace(path + "\\" + sr.Name, "'", "''", TReplaceFlags()<<rfReplaceAll) + "')";
   Form1->ADOCommand1->Execute();
   ++count;
   ++count2;
   if (count2 > 100)
   {
    count2 = 0;
    Form1->Caption = "Added " + IntToStr(count)+ " Files.";
    Application->ProcessMessages();
   }

  }
  f = FindNext(sr);

 }
 FindClose(sr);
return count;
}

基本的に、特定のディレクトリとそのサブディレクトリを走査し、各ファイルを (パスと共に) MS Access データベースに追加します。

(私は唯一のユーザーなので、セキュリティについてはあまり気にしません)

多数のファイルを使用すると、このコードは恐ろしく遅くなります。コードが行っていることを行うためのより良い方法を誰かが説明できますか?

4

3 に答える 3

1

MySQL にはCBuilder コンポーネントがあり、 非常に使いやすいです。

于 2009-01-21T15:00:46.553 に答える
1

コードのボトルネックは、ほとんどの場合、ADO/Access データベース レイヤーです。ディレクトリ レベルの関数 (FindFirst()、FindNext()) は比較的高速です。これらの呼び出しを cout ステートメントに置き換えることで、データベースがボトルネックになっているかどうかを確認できます。結果をコンソールに出力すると、はるかに高速に実行されると思います。

私の経験では、Access は高性能データベースではなく、ADO ドライバーはネイティブ ドライバーほど高速ではありません。データベースをより本格的なデータベースに置き換えれば、パフォーマンスが向上するに違いありません。

于 2009-01-21T05:17:53.423 に答える