用Delphi做过数据库编程的朋友肯定熟悉Query控件
这个控件实现的功能是执行一条SQL语句或一个SQL脚本
在我们进行数据库开发中使用的频率非常高
笔者在多年的使用过程中发现用好这个控件有两点要非常注意
第一点是区分好Query控件的Open方法和ExecSQL方法这两个方法都可以实现执行SQL语句但要根据不同情况分别使用如果这条SQL语句将返回一个结果集必须使用Open方法如果不返回一个结果集则要使用ExecSQL方法例如
……
Query:Tquery
Query:Tquery
……
QueryClose;
QuerySQLClear;
QuerySQLAdd(select * fromAA);
QueryOpen;
……
QueryClose;
QuerySQLClear;
QuerySQLAdd(deleteAA);
QueryExecSQL;
……
上述的例子中Query所执行的SQL语句将返回一个结果集因此必须用Open方法而Query所执行的是一条删除表记录语句不返回结果集因此用ExecSQL方法
第二点是如果Query控件用Open方法执行SQL语句并且所用的SQL语句访问的是一张或几张频繁使用的表在执行完SQL语句后一定要调用SQL的FetchAll方法能大大地减少死锁发生的概率例如
……
Query:Tquery
……
QueryClose;
QuerySQLClear;
QuerySQLAdd(select * fromAA);
QueryOpen;
QueryFetchAll;
……
在上述的例子中如果AA是一张被频繁访问的表在对这个表执行这一条select语句的同时如果恰好有其他人对这张表执行删除或更新操作便有可能发生死锁QueryFetchAll这条语句实现的功能是释放加在表AA上的锁这样死锁的发生概率可以大大减少避免死锁对我们将来进行大型数据库开发尤为重要