ADO多线程数据库查询

ADO多线程数据库查询通常会出现3个问题:1、CoInitialize 没有调用 (CoInitialize was not called);所以,在使用任何dbGo对象前,必须手 调用CoInitialize和CoUninitialize。调用CoInitialize失败会产生"CoInitialize was not called"例外。2、画布不允许绘画 (Canvas does not allow drawing);所以,必须通过Synchronize过程来通知主线程访问主窗体上的任何控件。3、不能使用主ADO连接 (Main TADoConnection cannot be used!);所以,线程中不能使用主线程中TADOConnection对象,每个线程必须创建自己的数据库连接。Delphi2007安装后在X:/Program Files/Common Files/CodeGear Shared/Data目录下有一个dbdemos.mdb文件,用来作为测试的例子。dbdemos.mdb中的customer表保存了客户信 息,orders表中保存了订单信息。测试程序流程大致是这样的:在主窗体上放TADOConnection和TQuery控件,启动时这个TQuery从Customer表中查出客户编码 CustNo和公司名称Company,放到三个Combox框中,分别在三个列表框中选定客户公司名称,按照公司名称所对应的客户代码建立三个线程同时 在orders表中查询销售日期SaleDate分别填入ListBox中unitMain;interfaceusesWindows,  Messages,  SysUtils,   Variants, Classes, Graphics,   Controls, Forms,   Dialogs,DB,       ADODB,      StdCtrls;typeTForm2 =class (TForm)ComboBox1:  TComboBox;ComboBox2:  TComboBox;ComboBox3:   TComboBox;ListBox1:    TListBox;ListBox2:   TListBox;ListBox3:    TListBox;Button1:  TButton;ADOConnection1:  TADOConnection;ADOQuery1:  TADOQuery;Label1: TLabel;Label2:  TLabel;Label3: TLabel;procedure  FormCreate(Sender: TObject) ;procedure  Button1Click(Sender: TObject) ;private{ Private declarations }public{ Public declarations }end    ;
varForm2:    TForm2;
implementationusesADOThread;{$R *.dfm}procedure   TForm2.Button1Click(Sender: TObject);
constSQL_CONST= 'Select SaleDate from orders where CustNo = %d' ;
varc1,c2,c3: Integer  ;s1, s2,s3: string ;
begin//取得三个选择框客户的编码
c1:= Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);c2:= Integer(ComboBox2.Items.Objects[ComboBox2.ItemIndex]);c3:= Integer(ComboBox3.Items.Objects[ComboBox3.ItemIndex]);//生成SQL 查询语句s1:=Format(SQL_CONST,[c1]);s2:=Format(SQL_CONST,[c2]);s3:=Format(SQL_CONST,[c3]);//三个线程同时查询
  TADOThread.Create(s1,ListBox1,Label1) ;TADOThread.Create(s2,ListBox2,Label2);TADOThread.Create(s3,ListBox3,Label3);
end ;procedure TForm2.FormCreate(Sender: TObject);
varstrSQL:string ;
beginstrSQL:='SELECT CustNo,Company FROM customer';ADOQuery1.Close;ADOQuery1.SQL.Clear;ADOQuery1.SQL.Add(strSQL);ADOQuery1.Open;ComboBox1.Clear;ComboBox2.Clear;ComboBox3.Clear;//将客户Company和相关CustNo填到ComboBox中while  not  ADOQuery1.Eof  dobeginComboBox1.AddItem(ADOQuery1.Fields[1].asString, TObject(ADOQuery1.Fields[0].AsInteger));ADOQuery1.Next;end ;ComboBox2.Items.Assign(ComboBox1.Items);ComboBox3.Items.Assign(ComboBox1.Items);// 默认选中第一个ComboBox1.ItemIndex := 0;ComboBox2.ItemIndex := 0;ComboBox3.ItemIndex := 0;
end ;end.
{ADO查询多线程单元}unitADOThread;interfaceusesClasses,StdCtrls,ADODB;
typeTADOThread = class(TThread)private{ Private declarations }FListBox:TListBox;FLabel:TLabel;ConnString:WideString;FSQLString:string;procedure  UpdateCount;protectedprocedure  Execute; override;publicconstructor  Create(SQL:string;LB:TListBox;Lab:TLabel);end   ;implementationuses  Main,SysUtils,ActiveX;{ TADOThread }constructor  TADOThread.Create(SQL: string; LB: TListBox;Lab:TLabel);
beginConnString:=Form2.ADOConnection1.ConnectionString;FListBox:=LB;FLabel:=Lab;FSQLString:=SQL;Inherited  Create(False);
end  ;procedure  TADOThread.Execute;
varQry:TADOQuery;i:Integer;
begin{ Place thread code here }FreeOnTerminate:=True;CoInitialize(nil);//必须调用(需Uses ActiveX)Qry:=TADOQuery.Create(nil);tryQry.ConnectionString:=ConnString;   //必须有自己的连接
    Qry.Close;Qry.SQL.Clear;Qry.SQL.Add(FSQLString);Qry.Open;FListBox.Clear;for  i := 0 to 100 do     //为了执行久点重复历遍数据集101次beginwhile  not Qry.Eof And  not Terminated dobeginFListBox.AddItem(Qry.Fields[0].asstring,nil);//如果不调用Synchronize,会出现Canvas Does NOT Allow Drawing
          Synchronize(UpdateCount);Qry.Next;end ;Qry.First;FListBox.AddItem('*******',nil);end ;finallyQry.Free;end ;CoUninitialize;
end  ;procedure   TADOThread.UpdateCount;
beginFLabel.Caption:=IntToStr(FListBox.Items.Count);
end     ;end.

 

转载于:https://www.cnblogs.com/moonwind/p/4492129.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375055.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHPExcel

excel文档处理对象主要用来管理我们的excel文档,怎么来管理(通过属性和方法来管理)?大家知道,类主要是由属性和方法来组成,通过php程序的手段来管理excel文档,其实就是通过本对象的属性和方法来…

靶场练习第十天~vulnhub靶场之dc-2

一、准备工作 靶机下载地址链接: 百度网盘 请输入提取码 提取码: ib86 二、信息收集 1.nmap的信息收集 (1)使用nmap 192.168.101.0/24,发现靶机地址为192.168.101.115 (2)对靶机做进一步探测,发现靶机开…

Ubuntu 14.10 创建虚拟网卡实现桥接网络

目标需求:在Ubuntu主机创建一张虚拟网卡,使得搭建在VirtualBox中的其他主机能借助虚拟网卡构建的局域网进行相互间的通讯 步骤一:准备工具包 安装 uml-utilities 以及 bridge-utils sudo apt-get install uml-utilities bridge-utils 步骤二&…

iOS定时器-- NSTimer 和CADisplaylink

iOS定时器-- NSTimer 和CADisplaylink 一、iOS中有两种不同的定时器: 1. NSTimer(时间间隔可以任意设定,最小0.1ms)// If seconds is less than or equal to 0.0, this method chooses the nonnegative value of 0.1 millisecond…

靶场练习第十一天~vulnhub靶场之dc-3

一、准备工作 1.靶场链接: 百度网盘 请输入提取码 提取码: 48d3 2.启动靶场后会遇到如下情况: 2-1具体解决办法如下: 启动成功 3.查看kali的ip:ifconfig 二、信息收集 1.nmap的信息收集 (1)寻找靶机的ip&#xf…

UNIX环境高级编程一书中apue.h找不到

apue.h是作者为了方便自己写的一个库,在http://www.apuebook.com选择你对应书中的source code,然后解压压缩包中在/include/apue.h以及/lib/error.c复制到你文件系统中/usr/include中即可。另外在apue.h中#include "error.c"即可。这样gcc编译…

大龄程序员怎样渡过中年危机?(转)

大龄程序员怎样渡过中年危机? 作者前言: 话说再有十几天就进入2016年了,想到这,我不由得五味杂陈。2016年对我来说是一个特殊的年份,因为我即将40岁了,人生正式告别青年期,进入中年了。 在娱乐圈…

靶场练习第十二天~vulnhub靶场之dc-4

一、准备工作 1.靶机下载链接 链接: 百度网盘 请输入提取码 提取码: 3hq4 2.用ifconfig查看kali的ip 二、信息收集 1.nmap的信息收集 (1)主机发现 命令:nmap 192.168.101.0/24 (2)扫描靶机详细信息 发现主机 192…

网络命令-nc(二)

继续Netcat 这个命令吧 1&#xff1a;远程拷贝文件 在本地输出 文件debian.img 到 192.168.5.40 主机12345端口监听 nc -v 192.168.5.40 12345 < debian.img 在192.168.5.40 主机12345端口监听&#xff0c;将文件指定为debian-copy.img nc -l -v 12345 > debian-copy.im…

靶场练习第十三天~vulnhub靶场之dc-5

一、准备工作 1.靶机环境搭建 下载链接: https://pan.baidu.com/s/1csvuJ_NVCBvVr75KhxyM3Q?pwdxie7 提取码: xie7 2.kali的ip 命令&#xff1a;ifconfig 3.kali和靶机的都设置为NAT模式 二、信息收集 1.nmap的信息收集 &#xff08;1&#xff09;寻找靶机的ip 命令&…

Ubuntu中输入输出重定向及管道技术简述

输出 1、标准输出 定义&#xff1a;程序在默认情况下输出结果的地方&#xff08;stdout&#xff09;。 2、输出重定向 定义&#xff1a;用于把数据的输出转移到另一个地方去。 3、Ubuntu中例子 $ls > ~/ls_out ##不显示在显示器上而是输入到文件ls_out中 uname -r > ls_…

activex打包

http://www.cnblogs.com/weiwin/p/4493835.html activeX 打包 原文 http://www.docin.com/p-409284488.html CAB打包文档说明 文档目的本文档的目的在于说明将ocx和dll以及相关的文件打包成一个CAB包&#xff0c;以便在网页下调用ocx控件时免去手工将dll和其他一下文件拷贝到客…

靶场练习第十四天~vulnhub靶场之dc-6

一、准备工作 kali和靶机都选择NAT模式&#xff08;kali与靶机同网段&#xff09; 1.靶场环境 下载链接: 百度网盘 请输入提取码 提取码: bazx 2.kali的ip 命令:ifconfig 3.靶机的ip 扫描靶机ip 命令&#xff1a;sudo arp-scan -l 二、信息收集 1.nmap的信息收集 &#…

最短路径Dijkstra算法和Floyd算法整理、

转载自&#xff1a;http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径—Dijkstra算法和Floyd算法 Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法&#xff0c;用于计算一个节点到其他所有节点的最短路径。主要特点是以…

Java Script 中 ==(Equal) 和 === (Identity Equal) 的区别和比较算法逻辑

判断两个变量是否相等在任何编程语言中都是非常重要的功能。 JavaScript 提供了 和 两种判断两个变量是否相等的运算符&#xff0c;但我们开始学习的时候 JavaScript 的时候&#xff0c;就被一遍又一遍的告知&#xff1a; 要求变量的类型和值均相等&#xff0c;才能返回true…

靶场练习第十五天~vulnhub靶场之dc-7

一、准备工作 kali和靶机都选择NAT模式&#xff08;kali与靶机同网段&#xff09; 1.靶场环境 下载链接:https://download.vulnhub.com/dc/DC-7.zip 2.kali的ip 命令:ifconfig 3.靶机的ip 扫描靶机ip sudo arp-scan -l 二、信息收集 1.nmap的信息收集 &#xff08;1&…

ubuntu系统下如何修改host

Ubuntu系统的Hosts只需修改/etc/hosts文件&#xff0c;在目录中还有一个hosts.conf文件&#xff0c;刚开始还以为只需要修改这个就可以了&#xff0c;结果发现是需要修改hosts。修改完之后要重启网络。具体过程如下&#xff1a;1、修改hostssudo gedit /etc/hosts2、添加解析记…

Matplotlib不显示图形

安装好了Matplotlib&#xff0c;使用官方一个例子测试运行时&#xff0c;发现使用画图功能时&#xff0c;运行脚本老是显示不出图像&#xff0c;Google了一下&#xff0c;后来发现是matplotlibrc文件没配置好。 参考了官方文档&#xff0c;修改步骤如下 1.查找matplotlibrc文件…

靶场练习第十六天~vulnhub靶场之dc-8

一、准备工作 kali和靶机都选择NAT模式&#xff08;kali与靶机同网段&#xff09; 1.靶场环境 下载链接:https://download.vulnhub.com/dc/DC-8.zip 2.kali的ip 命令:ifconfig 3.靶机的ip 扫描靶机ip sudo arp-scan -l 二、信息收集 1.nmap的信息收集 &#xff08;1&…

【SpringMVC】SpringMVC系列4之@RequestParam 映射请求参数值

4、RequestParam 映射请求参数值 4.1、概述 Spring MVC 通过分析处理方法的签名&#xff0c;将 HTTP 请求信息绑定到处理方法的相应人参中。Spring MVC 对控制器处理方法签名的限制是很宽松的&#xff0c;几乎可以按喜欢的任何方式对方法进行签名。必要时可以对方法及方法入…