傳統 Delphi 資料庫開發仰賴 TTable、DBEdit 等視覺元件綁定欄位,雖然快速但一旦資料表結構變更,所有關聯元件屬性皆需手工修改,維護負擔極重。改用 動態 SQL (TQuery) 或預存程序 (TStoredProc),將資料操作邏輯集中在代碼層,不僅支援 SQL Server、Oracle 等異構後端,更能靈活應對結構變更、實現事務控制與效能優化。
通用新增程序,支援字串/非字串欄位自動加引號,參數化設計可復用於任何資料表。
procedure DataInsert(const Q: TQuery; const TableName: String;
FieldCount: Integer; const IsString: array of Integer;
const Edits: array of TEdit);
var
I: Integer;
SQL: String;
begin
// 事務控制
if DataModule1.Database1.InTransaction then
DataModule1.Database1.Rollback;
DataModule1.Database1.StartTransaction;
// 組裝 INSERT 陳述式
SQL := 'INSERT INTO ' + TableName + ' VALUES(';
for I := 0 to FieldCount - 1 do begin
if IsString[I] = 0 then
SQL := SQL + Edits[I].Text
else
SQL := SQL + '''' + Edits[I].Text + ''''; // 字串加單引號
if I = FieldCount - 1 then
SQL := SQL + ')'
else
SQL := SQL + ',';
end;
// 執行並回傳結果集
Q.Close;
Q.SQL.Clear;
Q.SQL.Add(SQL);
Q.SQL.Add('SELECT * FROM ' + TableName); // 可選:回傳最新資料
Q.Open;
DataModule1.Database1.Commit;
end;
DataModule1.Database1.Connected := True;
try
DataInsert(Query1, 'Employees', 5,
[1, 0, 1, 1, 0], // 欄位型別:1=字串, 0=數值/日期
[EditName, EditAge, EditDept, EditTitle, EditSalary]);
finally
DataModule1.Database1.Connected := False;
end;
將 SQL 預編譯存放於伺服器,減少網路傳輸、提升執行速度、集中維護邏輯。
CREATE PROC Proc_InsertEmployee
@EmpID SMALLINT,
@EmpName CHAR(4) OUTPUT
AS
INSERT INTO TEST_User.TRANS_TEST VALUES (@EmpID, @EmpName);
SELECT @EmpName, * FROM TEST_User.TRANS_TEST;
StoredProc1.Close;
StoredProc1.Params[0].ParamType := ptInput; // @EmpID
StoredProc1.Params[0].AsInteger := 1;
StoredProc1.Params[1].ParamType := ptOutput; // @EmpName
StoredProc1.Params[1].AsString := 'ABCD';
StoredProc1.ExecProc; // 或 Open 視是否回傳結果集
// 取得 OUTPUT 參數
ShowMessage('回傳名稱: ' + StoredProc1.Params[1].AsString);
UPDATE Table SET Col=Val WHERE Key=... 或預存程序 UPDATE ...DELETE FROM Table WHERE Key=...SELECT ... WHERE ... 綁定 TQuery,配合 Params 參數化防注入。| 維度 | 視覺綁定 | 動態 SQL / SP |
|---|---|---|
| 結構變更影響 | 全域元件屬性需改 | 僅修改 SQL/SP 代碼 |
| 異資料庫移植 | 困難 | 標準 SQL 極易移植 |
| 事務控制 | 分散在各事件 | 集中在邏輯層 |
| 效能調優 | 受限 | 可調索引、執行計畫、SP 預編譯 |
| 安全性 | 易暴露結構 | SP 封裝邏輯、參數化防注入 |
採用 SQL 直寫或預存程序架構,是 Delphi 從「快速原型」邁向「企業級可維護系統」的關鍵一步。