Как лучше создать базу данных доступа к именам файлов с помощью C ++ Builder?

StackOverflow https://stackoverflow.com/questions/464108

Вопрос

Последний вопрос на ночь. И извиняюсь за полную нубность этого.

Я с помощью 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 ;, если вы хотите сбросить его. Второе - закомментировать & Quot; Form1 - & Gt; ADOCommand1 - & Gt; Execute (); & Quot; и посмотрим, насколько быстрее это станет. Это показывает, если проблема заключается в сохранении в базу данных.

Если вы планируете в будущем разработать что-то серьезное, я рекомендую поискать лучшие решения для баз данных. (Встроенный Firebird, встроенный MySQL и т. Д.).

Для MySQL есть компоненты CBuilder - их очень удобно использовать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top