C/S 架構下,客戶端常需批次輸入後再提交至後台資料庫,本地建立臨時表可減少網路往返。因筆數通常不大(幾百筆),置於記憶體最快。
TQuery,設定連線屬性。CachedUpdates := True; RequestLive := True;WHERE 子句,使查詢結果為空,即得空白可編輯資料集。例:WHERE Category='A' AND Category='B'。優點:零代碼、簡單;缺點:清空需查詢後台、不適用多表字段拼湊臨時表。
function CreateTableInMemory(const AFieldDefs: TFieldDefs): TDataSet;
var TempTable: TClientDataSet;
begin
Result := nil;
if AFieldDefs = nil then Exit;
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 := TDataSet.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;
優點:適用範圍廣、速度快、支援任意字段組合;缺點:需撰寫代碼(TFieldDefs 用法見線上幫助)。
分發資料庫程式需攜帶 BDE/SQL Link 並配置使用者名、密碼等別名參數。InstallShield for Delphi 雖無顯性選項,但產生的 *.iwz 腳本中 [IDAPI Alias] 區段可手工加入:
[IDAPI Alias]
username=SYSDBA
password=masterkey
安裝時即自動完成別名配置,免去逐台手工設定。
InterBase 內建函數極少(僅四個),難寫複雜預存程序。雖無法直接寫 UDF,但可宣告外部函數(呼叫 DLL)。範例宣告 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 為函數名。宣告後即可在 SQL 中使用:SELECT SUBSTR(country) FROM country。範例用 Delphi 附帶 IBLocal 資料庫;開發者亦可自行撰寫 DLL 擴充函數庫。