Was ist eine bessere Möglichkeit, um eine Access-Datenbank von Dateinamen unter Verwendung von C ++ Builder zu erstellen?

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

Frage

Letzte Frage für die Nacht. Und Entschuldigungen für die komplette noobness dafür.

Ich habe, mit Hilfe von Stackoverflow und Google erreicht der folgenden ...

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;
}

Es ist im Grunde durchlaufen ein bestimmtes Verzeichnis und dessen Unterverzeichnisse und das Hinzufügen von jeder Datei (mit Pfad) zu einer MS Access-Datenbank.

(Ich bin der einzige Benutzer so ist es mir nicht viel über Sicherheit)

Mit einer großen Anzahl von Dateien dieser Code ist schrecklich langsam. Kann sich jemand einen besseren Weg beschreiben zu tun, was der Code tut, (hoffentlich ohne Ihre Antwort zu kompliziert zu machen. Ich bin ein noob daran erinnern)

War es hilfreich?

Lösung

Der Engpass in Ihrem Code ist meistens wahrscheinlich die ADO / Access-Datenbankschicht. Die Verzeichnis-Level-Funktionen (Findfirst (), Findnext ()) ist relativ schnell. Sie könnten überprüfen, ob die Datenbank die Engpass durch diese Anrufe mit cout-Anweisungen zu ersetzen. Meine Vermutung ist, dass es viel schneller ausgeführt werden, wenn die Ergebnisse an die Konsole ausgegeben werden.

Nach meiner Erfahrung Zugang ist keine Hochleistungsdatenbank, und die ADO-Treiber sind nicht so schnell wie native Treiber. Ich wette, wenn Sie die Datenbank mit einer ernsteren Datenbank ersetzt, dann würden Sie eine verbesserte Leistung finden.

Andere Tipps

First - es gibt keine Notwendigkeit Drop / Erstellen der Tabelle. Erstellen Sie, sobald es und rufen Sie dann „Löschen von Bildern“, wenn Sie es zurücksetzen möchten. Zweitens - Kommentar aus "Form1-> ADOCommand1-> Ausführen ();" und sehen, wie viel schneller es geht. Dies zeigt, ob das Problem bei der Rettung in der Datenbank ist.

Wenn Sie einige wirklich wichtige Dinge in der Zukunft zu entwickeln, planen, dann empfehle ich eine Runde für eine bessere Datenbanklösungen zu suchen. (Firebird Embedded, MySQL Embedded, etc.).

Für MySQL gibt es CBuilder Komponenten -. Sehr gut zu bedienen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top