Как лучше создать базу данных доступа к именам файлов с помощью C ++ Builder? - PullRequest
0 голосов
/ 21 января 2009

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

Я с помощью 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.

(я единственный пользователь, поэтому меня не очень заботит безопасность)

При большом количестве файлов этот код ужасно медленный. Может кто-нибудь описать лучший способ сделать то, что делает код (надеюсь, не делая ваш ответ слишком сложным. Я новичок в этом помнить)

Ответы [ 3 ]

1 голос
/ 21 января 2009

Во-первых - нет необходимости удалять / создавать таблицы. Создайте его один раз, а затем назовите «удалить из картинок», когда вы хотите сбросить его. Второе - закомментируйте "Form1-> ADOCommand1-> Execute ();" и посмотрим, насколько быстрее это станет. Это показывает, если проблема заключается в сохранении в базу данных.

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

1 голос
/ 21 января 2009

Для MySQL есть Компоненты CBuilder - очень хорошо использовать.

1 голос
/ 21 января 2009

Узким местом в вашем коде, скорее всего, является уровень базы данных ADO / Access. Функции уровня каталогов (FindFirst (), FindNext ()) работают относительно быстро. Вы можете проверить, является ли база данных узким местом, заменив эти вызовы операторами cout. Я предполагаю, что он будет работать намного быстрее при выводе результатов на консоль.

По моему опыту, Access не является высокопроизводительной базой данных, и драйверы ADO не так быстры, как собственные драйверы. Бьюсь об заклад, если вы замените базу данных на более серьезную, вы обнаружите улучшенную производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...