2009-01-21 29 views
0

晚上的最後一個問題。併爲此完全noobness道歉。什麼是使用C++ Builder創建文件名訪問數據庫的更好方法?

我有,人與計算器和谷歌的幫助取得了以下...

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數據庫。

(我是唯一的用戶,所以我不那麼在意安全性)

隨着大量文件的這段代碼是可怕的慢。任何人都可以描述一種更好的方式來執行代碼正在做的事情(希望不會讓你的答案太複雜,我記得這是一個小菜鳥)

回答

1

代碼中的瓶頸主要是ADO/Access數據庫層。目錄級函數(FindFirst(),FindNext())相對較快。您可以通過用cout語句替換這些調用來驗證數據庫是否是瓶頸。我的猜測是,將結果輸出到控制檯時,運行速度會更快。

根據我的經驗,Access不是一個高性能的數據庫,並且ADO驅動程序沒有本地驅動程序那麼快。我敢打賭,如果你用更嚴重的數據庫替換了數據庫,你會發現性能有所提高。

+0

MySQL怎麼樣?我應該可以使用它(應用程序將不太便攜,但它不打算便攜式)。我可以使用ADO或我可以使用正確的MySQL訪問(需要學習如何在C++ builder環境中執行該操作) – MrVimes 2009-01-21 11:02:03

1

首先 - 沒有必要刪除/創建表。創建一次,然後調用「從照片中刪除」,當你想重置它。 Second - 註釋掉「Form1-> ADOCommand1-> Execute();」並看看它得到多快。這表明問題是否存儲在數據庫中。

如果您打算在未來開發一些認真的東西,那麼我建議您尋找更好的數據庫解決方案。 (嵌入Firebird,嵌入MySQL等)。

+0

drop/recreate將自動編號字段重置爲1.並且還嘗試停止數據庫每次數據重置時都會變大。不知道它是否工作。無法通過adoconnect或ms訪問驅動程序運行「緊湊型表格圖片」。 – MrVimes 2009-01-21 10:49:59

相關問題