过夜最后一个问题。和道歉的这个完整的noobness。

我有,人与计算器和谷歌的帮助取得了以下...

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驱动程序是不一样快本地驱动程序。如果你有一个更严重的数据库取代了数据库我敢打赌,你会发现更好的性能。

其他提示

首先 - 没有必要滴/创建表。创建一次,然后调用“从照片中删除”,当你想将其复位。 二 - 注释掉 “Form1-> ADOCommand1->执行();”看看它是如何更快获得。这表明,如果问题是在保存到数据库中。

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

有关的MySQL有的CBuilder部件 - 。非常好的使用

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top