Delphi中多线程下使用使用 UniDAC+MSSQL 需要注意的问题(连接前调用CoInitialize)

一般解决方法是在线程开始启用 CoInitialize(nil),线程结束调用 CoUninitialize 。如果你使用多种数据库连接,比如三层中经常切换到MSSQL和Oracle,我们只需在判断 TUniConnection 的连接前事件 OnBeforeConnect 写下如下代码:

[delphi] view plain copy

print?

  1. procedure TServDBFunc.ServConnBeforeConnect(Sender: TObject);
  2. begin
  3. if (ServConn <> nil) and SameText(ServConn.ProviderName,‘SQL Server‘);then
  4. CoInitialize(nil);
  5. end;
  6. 在TUniConnection 的关闭连接后事件 OnAfterDisconnect 写下如下代码:
  7. procedure TServDBFunc.ServConnAfterDisconnect(Sender: TObject);
  8. begin
  9. if (ServConn <> nil) and SameText(ServConn.ProviderName,‘SQL Server‘);then
  10. CoUninitialize;
  11. end;

需要注意的是,必须先判断连接控件 (ServConn <> nil) 是否为空,否则,你会陷入指针释放的问题。

http://blog.csdn.net/aroc_lo/article/details/4878224

时间: 2024-10-13 00:29:05

Delphi中多线程下使用使用 UniDAC+MSSQL 需要注意的问题(连接前调用CoInitialize)的相关文章

多线程下使用使用 UniDAC+MSSQL 需要注意的问题(使用CoInitialize)

ADO线程不安全,UniDAC 在使用MSSQL也是如此.其实这是微软COM问题,不怪Devart公司. 一般解决方法是在线程开始启用 CoInitialize(nil),线程结束调用 CoUninitialize .如果你使用多种数据库连接,比如三层中经常切换到MSSQL和Oracle,我们只需在判断 TUniConnection 的连接前事件 OnBeforeConnect 写下如下代码: procedure TServDBFunc.ServConnBeforeConnect(Sender:

Delphi中多线程用消息实现VCL数据同步显示

Delphi中多线程用消息实现VCL数据同步显示 Lanno Ckeeke 2006-5-12 概述: delphi中严格区分主线程和子主线程,主线程负责GUI的更新,子线程负责数据运算,当数据运行完毕后,子线程可以向主线程式发送消息,以便通知其将VCL中的数据更新. 实现: 关键在于消息的发送及接收.在消息结构Tmessage中wParam和lParam类型为Longint,而指针类型也定义为Longint,可以通过此指针来传递自己所感兴趣的数据.如传递字符数组: 数组定义: const MA

关于Delphi中多线程传递参数的简单问题

http://bbs.csdn.net/topics/390513469/ unit uThread; interface uses Classes; type Th = class(TThread) private { Private declarations } protected procedure Execute; override; end; 以上是创建的一个多线程 我在另外一个单元里Unit1有一个函数 function Myfun(username,password:string)

Delphi中多线程的技巧

创建线程 MsgThread := TMsgThread.Create(False) ; //创建并执行线程 MsgThread := TMsgThread.Create(True) ; //创建线程后挂起 constructor Create(CreateSuspended: Boolean); 中的参数CreateSuspended表示创建后是否挂起线程. 2)设置线程里没有设置循环执行的话,且设置FreeOnTerminate为True,则线程执行完后就会自己释放. 3)在一个线程结束后,

delphi中多线程排序

unit ThSort; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TThreadSortForm = class(TForm) StartBtn: TButton; BubbleSortBox: TPaintBox; SelectionSortBox: TPaintBox; QuickSortBox: TPai

Delphi中主窗体的formshow事件在程序自动创建窗体对象前就调用的错误。

这个,实际我也不知道这个标题该怎么写.因为用一句话描述错误有点困难. 下面用代码来说明吧. 最近做了一个delphi的程序,按照我的习惯一般是先创建一个窗体作为主窗体,其他的窗体都在这个基础上显示.另外,由于使用了数据库,所以添加了一个TDataModule控件,便于一些不能防止控件的单元进行数据库操作.把其他所有的窗体都设置为非自动创建.然后通过application.createform方法进行动态创建和调用. 好了,问题出现了. 在工程文件中有如下代码: Application.Creat

DELPHI中的多线程【深入VCL源码】

线程的基础知识 线程的组成.线程有两部分组成. 1.一个是线程的内核对象,操作系统用它来对线程实施管理.内核对象也是系统用来存放线程统计信息的地方. 2.另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量. 进程从来不执行任何东西,它只是线程的容器.线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中.这意味着线程在它的进程地址空间中执行代码,并且在进程的地址空间中对数据进行操作.因此,如果在单进程环境中,你有两个或多个线程正在运行,那么这两个线程将共享单个地址空

Delphi多线程下的ADO编程

前言: 几个月前接到一个任务:将一后台程序访问数据库的方式从BDE改为ADO,原因是由于业务量的增加,通过BDE不论是向数据库写入数据还是从数据库中读出数据的速度都变得无法忍受,大家都知道ADO在数据库访问速度方面比BDE要快的多了(我写了一个测试程序使用ADO比使用BDE快了近100倍!).这个任务还不简单嘛,只要将BDE的控件更换成ADO的再修改一些代码不就搞定了!我当时确实是这么想的,而且用了不到一个小时就搞定,测试运行一段没问题,大功告成了,我想.谁知道一个恶梦就此开始,我的愚昧无知使我

Delphi中线程类TThread 实现多线程编程

作者:Rogee出处:Http://Rogee.cnblogs.com/心得:BLOG是什么,它是一个记录学习过程的东西 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchronize的用法就完了.然而这并不是多线程编程的全部,我写此文的目的在于对此作一个补充. 线程本质上是进程中一段并发运行的代码.一个进程至少有一个线程,即所谓的主线程.同时还可以