用Delphi做過數據庫編程的朋友肯定熟悉Query控件
這個控件實現的功能是執行一條SQL語句或一個SQL腳本
在我們進行數據庫開發中使用的頻率非常高
筆者在多年的使用過程中發現用好這個控件有兩點要非常注意
第一點是
區分好Query控件的Open方法和ExecSQL方法
這兩個方法都可以實現執行SQL語句
但要根據不同情況分別使用
如果這條SQL語句將返回一個結果集
必須使用Open方法
如果不返回一個結果集
則要使用ExecSQL方法
例如
……
Query
:Tquery
Query
:Tquery
……
Query
Close;
Query
SQL
Clear;
Query
SQL
Add(
select * from AA
);
Query
Open;
……
Query
Close;
Query
SQL
Clear;
Query
SQL
Add(
delete AA
);
Query
ExecSQL;
……
上述的例子中
Query
所執行的SQL語句將返回一個結果集
因此必須用Open方法
而Query
所執行的是一條刪除表記錄語句
不返回結果集
因此用ExecSQL方法
第二點是
如果Query控件用Open方法執行SQL語句
並且所用的SQL語句訪問的是一張或幾張頻繁使用的表
在執行完SQL語句後
一定要調用SQL的FetchAll方法
能大大地減少死鎖發生的概率
例如
……
Query
:Tquery
……
Query
Close;
Query
SQL
Clear;
Query
SQL
Add(
select * from AA
);
Query
Open;
Query
FetchAll;
……
在上述的例子中
如果AA是一張被頻繁訪問的表
在對這個表執行這一條select語句的同時
如果恰好有其他人對這張表執行刪除或更新操作
便有可能發生死鎖
Query
FetchAll這條語句實現的功能是釋放加在表AA上的鎖
這樣死鎖的發生概率可以大大減少
避免死鎖
對我們將來進行大型數據庫開發尤為重要
From:http://tw.wingwit.com/Article/program/Delphi/201311/24666.html