針對「編號、姓名、照片、聲音、影像」5 字段的多媒體數據庫,根據媒體數據與數據庫文件是否共同存儲,分為集成法與分離法。
ftStringftGraphic (BMP)ftBlob (WAV/AVI 等二進制)TTable + TDataSource + TDBEdit + TDBImage + TDBNavigatorTMediaPlayer 臨時存檔 SaveToFile → PlayTOleContainer CreateLinkToFile + DoVerb(ovPrimary)(支持 Flash、DOC 等 OLE 文檔)// 增加記錄並導入媒體文件
Table1->AppendRecord(OPENARRAY(TVarRec, ("20010521","劉德友")));
Table1->Edit();
Table1BMPField->LoadFromFile("\\media\\ldy.bmp");
Table1WAVField->LoadFromFile("\\media\\ldy.wav");
Table1AVIField->LoadFromFile("\\media\\ldy.avi");
所有字段改為 ftString,媒體字段存相對路徑文件名(如 ldy.bmp)。
void __fastcall TForm1::Button5Click(TObject *Sender) {
TTable *newTable = new TTable(this);
newTable->DatabaseName = "e:\\mydata";
newTable->TableName = "example2.db";
newTable->TableType = ttParadox;
newTable->FieldDefs->Clear();
newTable->FieldDefs->Add("編號", ftString, 8, false);
newTable->FieldDefs->Add("姓名", ftString, 8, false);
newTable->FieldDefs->Add("像片", ftString, 12, false);
newTable->FieldDefs->Add("聲音", ftString, 12, false);
newTable->FieldDefs->Add("活動影像", ftString, 12, false);
newTable->CreateTable();
delete newTable;
}
// 打開數據庫時加載圖片
Image1->Picture->LoadFromFile(Table1->DatabaseName + "\\media\\" + Table1->FieldByName("像片")->AsString);
// 導航切換時同步更新圖片
void __fastcall TForm1::DBNavigator1Click(TObject *Sender, TNavigateBtn Button) {
Image1->Picture->LoadFromFile(Table1->DatabaseName + "\\media\\" + Table1->FieldByName("像片")->AsString);
}
| 維度 | 集成法 | 分離法 |
|---|---|---|
| 管理便利性 | 單文件,易備份/遷移 | 文件分散,維護稍繁 |
| 數據庫體積 | 極大,讀取效率低 | 輕量,打開/查詢快 |
| 媒體修改 | 需打開數據庫寫入 | 直接替換文件即可 |
| 適用場景 | 小尺寸媒體(照片、RTF),有專用 DB 控件(TDBImage/TDBRichEdit) | 大尺寸媒體(音視頻),需靈活替換、獨立管理 |
原則:小媒體且有專用控件 → 集成法;大媒體或需頻繁外部編輯 → 分離法。