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

代码中的瓶颈很可能是 ADO/Access 数据库层。目录级函数(FindFirst()、FindNext())相对较快。您可以通过用 cout 语句替换这些调用来验证数据库是否是瓶颈。我的猜测是,将结果输出到控制台时它会运行得更快。

以我的经验,Access 不是高性能数据库,ADO 驱动程序不如本机驱动程序快。我敢打赌,如果您用更严重的数据库替换数据库,您会发现性能有所提高。

于 2009-01-21T05:17:53.423 回答
1

首先 - 不需要删除/创建表。创建一次,然后在要重置它时调用“从图片中删除”。第二 - 注释掉“Form1->ADOCommand1->Execute();” 看看它有多快。这表明问题是否在保存到数据库中。

如果您打算在未来开发一些严肃的东西,那么我建议您寻找更好的数据库解决方案。(Firebird 嵌入式、MySQL 嵌入式等)。

于 2009-01-21T07:27:48.420 回答
1

对于 MySQL,有CBuilder 组件 ——非常好用。

于 2009-01-21T15:00:46.553 回答