当晚的最后一个问题。并为此完全无声而道歉。
我有,在stackoverflow和谷歌的帮助下实现了以下目标......
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数据库。
(我是唯一的用户,所以我不太关心安全性)
对于大量文件,此代码非常慢。任何人都可以描述一种更好的方法来做代码正在做的事情,(希望没有让你的答案太复杂。我记得这是一个菜鸟)
答案 0 :(得分:1)
代码中的瓶颈很可能是ADO / Access数据库层。目录级函数(FindFirst(),FindNext())相对较快。您可以通过使用cout语句替换这些调用来验证数据库是否是瓶颈。我的猜测是,将结果输出到控制台时运行速度会快得多。
根据我的经验,Access不是高性能数据库,ADO驱动程序不如本机驱动程序快。我敢打赌,如果用更严肃的数据库替换数据库,你会发现性能有所提高。
答案 1 :(得分:1)
首先 - 不需要删除/创建表。创建一次然后调用“从图片中删除”,如果要重置它。 第二 - 注释掉“Form1-&gt; ADOCommand1-&gt; Execute();”看看它得到多快。这表明问题是否存储在数据库中。
如果您计划将来开发一些严肃的东西,那么我建议您寻找更好的数据库解决方案。 (Firebird嵌入式,MySQL嵌入式等)。
答案 2 :(得分:1)
对于MySQL,有CBuilder components - 非常好用。