问几个ADO的问题
1.ADOQuery的Prepared什么时候设置比较好?
帮助上说每次Open之前用,那ExecSQL之前行不行?(经过测试,作用一样,加速效果大致相同)我不在每次执行命令之前用,而是在设计期就设成true了,因为反正每次执行之前设成true,又不会在执行后设成false,应该没什么差别(经过测试,效果也是一样的)。我说的这两条,有没有不对的地方?
2.ADO组件的线程安全性,有说安全的也有说不安全的。我在数据模块里放了几个ADO组件,窗体里有感知组件,在线程里操作数据库,唯一感到必须用Synchronize的地方就是DisableControls和EnableControls,其他的不加同步似乎也没有问题,不知道是不是还有隐患?
3.还是多线程。操作本地Access,是不是在数据模块里放一个ADOConnection,不同线程用各自的ADOQuery就行了?有没有更好的形式?一个线程的query需要锁定的时,用临界区行不行?LockType跟这个有关吗?
4.Open和ExecSQL是立即返回,还是等查询、追加等操作完成后返回?
问题有点多,分也不少,欢迎指点!
[解决办法]
1,在执行sql之前设置,这个是核查sql语句的,加速的话可能有些情况非常明显,有些情况不明显。
2,在线程里使用ADO,这个应该是可以的,要是对主线程资源操作,要用Synchronize
3,我在多线程下用过Access,用ADOQuery+连接串,用的时候new ADOQuery,用完delete,没有发现有什么错误,但是用ADOConnection,因为连接一直保持,估计就不行了。
4,Open肯定是执行完了才返回,因为有返回集,ExecSQL,应该也是执行完再返回。
以上个人观点,仅供参考
[解决办法]
1、
Set Prepared before calling the Execute method to specify whether ADO prepares the command. If Prepared is set to true and the command component is connected to a data store, ADO prepares the command before executing it. If Prepared is set to false, ADO does not prepare the command.
The default value of Prepared is false.
Prepared属性值会影响数据源在执行这些组件的Action Query时是否先编译这些SQL命令。如果Prepared属性值为True时,数据源只要编译一次即可重复执行这个存储过程。而不需要在没一次这些组件提出SQL命令时都编译一次SQL命令为存储过程,再执行
2、线程里调用VCL控件 谨记使用Synchronize方式
3、数据模块里用一个ADOConnection,不同的线程里用ADOQuery关联上ADOConnection即可
4、是执行完了才返回,也就是说是同步的阻塞的方法