多线程下使用使用 UniDAC+MSSQL 需要注意的问题(使用CoInitialize)
ADO线程不安全,UniDAC 在使用MSSQL也是如此。其实这是微软COM问题,不怪Devart公司。
一般解决方法是在线程开始启用 CoInitialize(nil),线程结束调用 CoUninitialize 。如果你使用多种数据库连接,比如三层中经常切换到MSSQL和Oracle,我们只需在判断 TUniConnection 的连接前事件 OnBeforeConnect 写下如下代码:
procedure TServDBFunc.ServConnBeforeConnect(Sender: TObject);
begin
if (ServConn <> nil) and SameText(ServConn.ProviderName,'SQL Server');then
CoInitialize(nil);
end;
在TUniConnection 的关闭连接后事件 OnAfterDisconnect 写下如下代码:
procedure TServDBFunc.ServConnAfterDisconnect(Sender: TObject);
begin
if (ServConn <> nil) and SameText(ServConn.ProviderName,'SQL Server');then
CoUninitialize;
end;
需要注意的是,必须先判断连接控件 (ServConn <> nil) 是否为空,否则,你会陷入指针释放的问题。
转自:http://hi.baidu.com/tintinsoft/item/361a8255237b0dc49f266761
http://blog.csdn.net/rznice/article/details/8252775
最新文章
- vue-resource请求超时timeout设置
- lua协程一则报错解决“attempt to yield across metamethod/C-call boundary”
- 转:windows命令行下如何查看磁盘空间大小
- 消灭Bug!18款最佳的问题跟踪管理应用程序
- spring获取ApplicationContext对象的方法——ApplicationContextAware
- ios页面间传递参数四种方式
- 下拉列表autocomplete各种实现方式比较
- 删除ArrayList中的元素
- Oracle连接配置以及实例的备份和恢复
- Web开发人员不要错过的60款用户界面设计工具(上)
- ARM的启动代码(1):介绍(转)
- SEO,搜索引擎优化原理方法等整体把握
- js小笔记
- Flutter - 本地化启动列表中App名字
- AngularJS实现三级Table列表
- laravel 连接mongodb
- Scheme 4 Javaer-3.高阶函数
- chafen
- JEECG datagrid 列表检索条件 添加下拉级联功能
- jmeter正则表达式提取 引用
热门文章
- 最短路算法详解(Dijkstra/SPFA/Floyd)
- MySql基本的语法(学习笔记)
- Hadoop读书笔记(一)Hadoop介绍
- iOS:实现图片的无限轮播---之使用第三方库SDCycleScrollView
- 【Codeforces Round #440 (Div. 2) A】 Search for Pretty Integers
- 使用SystemC进行硬件仿真
- UIButton UIBarButtonItem用法
- [CSS] Target empty elements using the :empty pseudo-class
- linux 查看 *.a *.so 符号表(zt)
- FeatureLayer,FeatureDataset,FeatureClass,Feature的区别与联系总结