C ++ Builderを使用してファイル名のアクセスデータベースを作成するより良い方法は何ですか?
-
19-08-2019 - |
質問
夜の最後の質問。そして、これの完全な初心者のための謝罪。
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データベースに追加します。
(私は唯一のユーザーなので、セキュリティについてはあまり気にしません)
多数のファイルがある場合、このコードはひどく遅くなります。誰もがコードがしていることを行うためのより良い方法を説明できますか(できればあなたの答えをあまり複雑にしないでください。
解決
コードのボトルネックは、ほとんどの場合ADO / Accessデータベースレイヤーです。ディレクトリレベルの関数(FindFirst()、FindNext())は比較的高速です。これらの呼び出しをcoutステートメントで置き換えることにより、データベースがボトルネックであるかどうかを確認できます。私の推測では、結果をコンソールに出力するときははるかに高速に実行されます。
私の経験では、Accessは高性能データベースではなく、ADOドライバーはネイティブドライバーほど高速ではありません。データベースをより深刻なデータベースに置き換えた場合、パフォーマンスが向上するはずです。
他のヒント
最初-テーブルをドロップ/作成する必要はありません。一度作成してから、リセットするときに<!> quot; delete from pictures <!> quot;を呼び出します。 2番目-<!> quot; Form1-<!> gt; ADOCommand1-<!> gt; Execute(); <!> quot;をコメントアウトします。どれだけ速くなるかを確認してください。これは、データベースへの保存に問題があるかどうかを示しています。
将来、深刻なものを開発する予定がある場合は、より良いデータベースソリューションを探すことをお勧めします。 (Firebird埋め込み、MySQL埋め込みなど)。
MySQLには CBuilderコンポーネントがあります。 p>