資料庫應用開發中常遇到三類棘手問題:客戶端批量輸入需暫存、部署時 BDE 設定繁瑣、InterBase 內建函數不足。本文提供三個經驗驗證的解決方案,助你事半功倍。
用戶輸入批量資料後再統一提交至伺服器,可減少網路往返、提高響應速度。臨時表通常不超過幾百筆,放在記憶體最快。
CachedUpdates = True; RequestLive = TrueWHERE 1=0 或互斥條件(如 Category='A' AND Category='B'),查詢結果為空卻保留結構。優點:設定簡單;缺點:清空需查詢伺服器、不支援多表合併欄位。
function CreateTableInMemory(const AFieldDefs: TFieldDefs): TDataSet;
var TempTable: TClientDataSet;
begin
Result := nil;
TempTable := TClientDataSet.Create(Application);
try
TempTable.FieldDefs.Assign(AFieldDefs);
TempTable.CreateDataSet;
Result := TempTable as TDataSet;
except
TempTable.Free;
raise;
end;
end;
// 使用範例
procedure TForm1.Button1Click(Sender: TObject);
var ADataSet: TDataSet;
begin
ADataSet := TClientDataSet.Create(Self);
with ADataSet.FieldDefs do begin
Add('Name', ftString, 30, False);
Add('Age', ftInteger, 0, False);
end;
DataSource1.DataSet := CreateTableInMemory(ADataSet.FieldDefs);
DataSource1.DataSet.Open;
ADataSet.Free;
end;
優點:純記憶體、結構任意定義、速度極快;缺點:需撰寫少量代碼。
手工在每台客戶機設 BDE 別名、用戶名、密碼極其繁瑣。InstallShield for Delphi 專案目錄下的 *.iwz 文本檔,在 [IDAPI Alias] 區段加入:
[IDAPI Alias]
USERNAME=SYSDBA
PASSWORD=masterkey
編譯安裝程式後,執行安裝即自動寫入註冊表完成 BDE 設定,零手工操作。
InterBase 僅內建 4 個函數,寫複雜 Stored Procedure 很受限。但它支援呼叫 DLL 外部函數(UDF)。範例宣告 SUBSTR:
DECLARE EXTERNAL FUNCTION SUBSTR
CSTRING(80), SMALLINT, SMALLINT
RETURNS CSTRING(80)
ENTRY_POINT 'IB_UDF_substr' MODULE_NAME 'ib_udf';
MODULE_NAME:DLL 檔名(不含副檔名)ENTRY_POINT:DLL 內函數名稱宣告後即可在 SQL 直接使用:SELECT SUBSTR(Country) FROM Country。Delphi 安裝目錄自帶 ib_udf.dll,也可自行用 Delphi 寫 DLL 擴充更多函數(字串處理、日期運算、加密等),極大增強 InterBase 表達能力。