2009-01-21 6 views
0

Dernière question pour la nuit. Et des excuses pour le noobness complet de ceci.Quelle est la meilleure façon de créer une base de données d'accès de noms de fichiers en utilisant C++ Builder?

J'ai, avec l'aide de Google et stackoverflow réalisé ce qui suit ...

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

Il parcourt essentiellement un répertoire donné et ses sous-répertoires, et en ajoutant chaque fichier (avec le chemin) à une base de données MS Access .

(je suis le seul utilisateur, donc je ne me soucie pas beaucoup sur la sécurité)

Avec un grand nombre de fichiers de ce code est horriblement lent. Quelqu'un peut-il décrire une meilleure façon de faire ce que le code fait, (je l'espère, sans rendre votre réponse trop compliquée.)

Répondre

1

Le goulot d'étranglement dans votre code est probablement la couche de base de données ADO/Access . Les fonctions au niveau du répertoire (FindFirst(), FindNext()) sont relativement rapides. Vous pouvez vérifier si la base de données est le goulot d'étranglement en remplaçant ces appels par des instructions cout. Ma conjecture est que cela fonctionnera beaucoup plus vite lors de la sortie des résultats à la console. Dans mon expérience, Access n'est pas une base de données haute performance, et les pilotes ADO ne sont pas aussi rapides que les pilotes natifs. Je parie que si vous remplaciez la base de données par une base de données plus sérieuse, vous obtiendriez de meilleures performances.

+0

Qu'en est-il de MySQL? Je devrais être en mesure d'utiliser cela (App serait moins portable mais il n'est pas destiné à être portable de toute façon). Je pourrais utiliser avec ADO ou je pourrais utiliser l'accès MySQL approprié (cela nécessiterait d'apprendre comment faire cela dans un environnement de construction C++) – MrVimes

1

Premièrement, il n'est pas nécessaire de supprimer/créer la table. Créez-le une fois puis appelez "Supprimer des images" lorsque vous souhaitez le réinitialiser. Deuxième - commentez "Form1-> ADOCommand1-> Execute();" et voyez combien cela devient plus rapide. Cela montre si le problème est dans l'enregistrement dans la base de données.

Si vous envisagez de développer des choses sérieuses à l'avenir, alors je recommande de chercher un tour pour de meilleures solutions de base de données. (Firebird incorporé, MySQL incorporé, etc.).

+0

le drop/recréer est de réinitialiser le champ autonumber à 1. Et aussi une tentative d'arrêter la base de données croissant chaque fois que les données sont réinitialisées. Je ne sais pas si cela fonctionne bien. il n'est pas possible d'exécuter des "images de table compactes" via l'adoconnect ou le pilote d'accès ms. – MrVimes

+0

Aussi. Je peux peut-être utiliser MySQL à la place (j'ai installé wamp sur le même PC) – MrVimes

Questions connexes