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中
unit
Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,
DB, ADODB, StdCtrls;
type
TForm2 =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 ;
var
Form2: TForm2;
implementation
uses
ADOThread;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
const
SQL_CONST= 'Select SaleDate from orders where CustNo = %d' ;
var
c1,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);
var
strSQL:string ;
begin
strSQL:='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 do
begin
ComboBox1.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查询多线程单元}
unit
ADOThread;
interface
uses
Classes,StdCtrls,ADODB;
type
TADOThread = class(TThread)
private
{ Private declarations }
FListBox:TListBox;
FLabel:TLabel;
ConnString:WideString;
FSQLString:string;
procedure UpdateCount;
protected
procedure Execute; override;
public
constructor Create(SQL:string;LB:TListBox;Lab:TLabel);
end ;
implementation
uses Main,SysUtils,ActiveX;
{ TADOThread }
constructor TADOThread.Create(SQL: string; LB: TListBox;Lab:TLabel);
begin
ConnString:=Form2.ADOConnection1.ConnectionString;
FListBox:=LB;
FLabel:=Lab;
FSQLString:=SQL;
Inherited Create(False);
end ;
procedure TADOThread.Execute;
var
Qry:TADOQuery;
i:Integer;
begin
{ Place thread code here }
FreeOnTerminate:=True;
CoInitialize(nil);
//必须调用(需Uses ActiveX)
Qry:=TADOQuery.Create(nil);
try
Qry.ConnectionString:=ConnString; //必须有自己的连接
Qry.Close;
Qry.SQL.Clear;
Qry.SQL.Add(FSQLString);
Qry.Open;
FListBox.Clear;
for i := 0 to 100 do //为了执行久点重复历遍数据集101次
begin
while not Qry.Eof And not Terminated do
begin
FListBox.AddItem(Qry.Fields[0].asstring,nil);
//如果不调用Synchronize,会出现Canvas Does NOT Allow Drawing
Synchronize(UpdateCount);
Qry.Next;
end ;
Qry.First;
FListBox.AddItem('*******',nil);
end ;
finally
Qry.Free;
end ;
CoUninitialize;
end ;
procedure TADOThread.UpdateCount;
begin
FLabel.Caption:=IntToStr(FListBox.Items.Count);
end ;
end.相关推荐
Delphi数据库处理组件BDE、ADO、InterBase和dbExpress详细说明
虽然ADOTable和ADOQuery组件可以非常简单的连接数据库,但是当需要更加精细的控制数据库的时候,往往需要应用ADO 更多的方法,我们知道,支撑ADO 的主要由Connection,Command,Recordsrt三个对象组成, 对应的就有ADOConnection和ADOCommand控件,而Recordsrt对象属性和方法,封装在ADODataSet中,同时ADODataSet本身,也具备和ADOtable组件相同的对数据绑定控件控值的属性和方法。在特殊的设计中,这个表格可能会有用。
Delphi中实现多线程同步查询
当然,只要将查询或数据操纵构造成线程对象,情况会好一些,至少可以接受窗口消息,也可以随时终止查询或数据操纵,而不会在屏幕上显示出太难看的白色。即使是这样,也不可避免地会在查询时闪现一个带有 SQL符号的沙漏,即鼠标变成了查询等待。需要特别注意的是,因为Delphi中的 VCL组件大多都 不是线程安全的,所以应当在线程查询结束后再将DataSource组件与查询组件关联,从而显示 在DBGrid组件中。下面的例子只实现了静态的线程同步查询,即线程对象是固定的,并随窗体的创建和销毁 而创建和销毁。
Delphi中通过ADO连接MySQL数据库的驱动安装与应用
本文还有配套的精品资源,点击获取 简介:本压缩包提供了Delphi 7.0开发的示例程序,用于展示如何使用ADO技术连接MySQL数据库。内容涵盖了ADO核心组件如Connection、Command、Recordset和Parameters的使用方法,以及Delphi环境下安装ADO驱动的步骤。同时,提供了必要的项目文件,包括配置文件、单元文件、项目文件、可执行文件、源代...
delphi ComboBox AddObject 组合框下拉取值正确使用方法
大家都知道 TComboBox AddObject 是个好东西。最近由于数据库结构设计设计上的原因(有很多诸如字典表) 如 国家代码表 语种表 而需要TComboBox 存储两列数据 一个 代码 一个值 如 中国 chi 而这些值是数据库读取填入的 AddObjec
Delphi中的ADOquery 用法
Delphi中的ADOquery 用法Delphi中的ADOquery 用法Delphi中的ADOquery 用法
多线程文件查询(delphi)
利用delphi实现的多线程的文件查询系统,支持word内部查询。速度快。易使用。
组合框控件ComboBox
概述: ComboBox的功能是从一个列表中一次只能选取或输入一个选项,其主要特点是具有带向下箭头的方框。在程序执行时,按下此按钮就会下拉出一个列表框供用户选择项目。另外用户还可以在组合框上方的框中输入数据。 1、组合框的属性 组合框的属性 说明 DropDownStyle 获取或设置指定组合框样式的值,可取以下值之一。①DropDown (默认值):文本部分可编辑,用户必须单击箭头按钮来显示列表部分。②DropDownList:用户不能直接编辑文本部分,用户必须单击箭头按钮来显示列表部
RichView14.5d7-xe7
有源码RichView14.5d7-xe7 包含我做了个实例 RichViewedit保存图片
表格绑定数据、模糊查询(下拉框)与动态时间:
1.概述 JTable,表格。JTable 是用来显示和编辑常规二维单元表。 2.JTable常用构造方法 4.1 创建空表格,后续再添加相应数据 JTable() 4.2 创建指定行列数的空表格,表头名称默认使用大写字母(A, B, C ...)依次表示 JTable(int numRows, int numColumns) 4.3 创建表格,指定 表格行数据 和 表头名称 JTable(Object[][] rowData, Object...
安卓端目标检测模型部署血泪史:从NCNN/TFLite/MNN全军覆没到Torchscipts终见光明
公司需在Android设备部署目标检测模型,要求: ✅ 实时检测速度≥15FPS ✅ 模型精度损失<5% ✅ 兼容中低端安卓设备👉 GitHub项目地址:pytorch/android-demo-app/ObjectDetection我已上传这份源码到csdn下载准备模型(必须走这步才能跑通安卓端源码)如果您没有设置PyTorch环境来运行该脚本,可以下载模型文件此处转到“android演示app/ObjectDetection/app/src/main/assets”文件夹,然后跳过此步骤的其余部分,直
3DMax马克杯制作教程
01 在前视图创建一个【圆柱体】,设置参数,长度为32,高度为82;高度分段12、边数为16;如图所示。 02 点击鼠标右键,把圆柱体转换为可编辑多边形,如图所示。 03 在修改面板中,选择【多边形】层级,在视图中选择所示的面,使用缩放工具稍微缩小一点,如图所示。 04 点击【插入设置】,如图所示。 设置插入数量为2.5mm。 05 点击【挤出设置】,如图所示。 ...
多线程Delphi数据库查询
By design, a Delphi application runs in one thread. To speed up some parts of the application you might want to decide to add several simultaneous paths of execution in your Delphi application. 按照设...
从数据手册到代码:一步步解读SC7A20寄存器配置与加速度值换算原理
本文详细解析了SC7A20三轴加速度传感器的寄存器配置与加速度值换算原理。从数据手册出发,逐步拆解关键寄存器设置,并推导原始ADC值到物理加速度的完整换算过程,帮助开发者深入理解传感器底层工作原理,提升嵌入式开发效率。
【转】Delphi多线程学习(9):多线程数据库查询(ADO)
原文:http://www.cnblogs.com/djcsch2001/articles/2382559.html ADO多线程数据库查询通常会出现3个问题: 1、CoInitialize 没有调用(CoInitialize was not called);所以,在使用任何dbGo对象前,必须手 调用CoInitialize和CoUninitialize。调用CoInitializ...
自动驾驶——最优控制算法(LQR)工程化总结
到近段时间,真正在我们的控制器上运行最优控制算法(LQR),一步一个脚印,从开始只是知道其“控制理论”的阶段、再到对着一堆网上的资料和公式一筹莫展不知何着手、再到初步实现了LQR算法的开发(但是使用的扭矩环控制,控制的不好,而且由于各种原因被delay,迟迟无法落地),直到大上个星期,泊车平台有此LQR开发需求,又重新了开始了算法的研发,用时一个周时间完成了算法开发,然后再用一个周时间进行实车最优控制算法验证与调试,取得了很大的进展,由于执行器是转角控制的,这无疑少了很多的工作量。
Zotero插件安装保姆级教程:从Jasminum到Sci-Hub,一站式搞定文献管理
本文提供Zotero插件安装的保姆级教程,从Jasminum到Sci-Hub,一站式搞定文献管理。通过详细配置和实战案例,帮助用户高效构建文献工作流,提升研究效率。重点介绍了元数据抓取、PDF管理、文献分析和知识产出等关键插件的使用方法。
Delphi多线程学习(9):多线程数据库查询(ADO)
ADO多线程数据库查询通常会出现3个问题:1、CoInitialize 没有调用(CoInitialize was not called);所以,在使用任何dbGo对象前,必须手 调用CoInitialize和CoUninitialize。调用CoInitialize失败会产生"CoInitialize was not called"例外。2、画布不允许绘画(Canvas does not
OpenClaw赚钱实录:从“养龙虾“到可持续变现的实践指南——原生“龙虾”OpenClaw快速部署、问题速查与避坑指南
至此,你已经完成了从选购服务器到配置AI大脑的全过程。无论是想在云上养一只7x24小时的“龙虾”,还是在本地体验AI Agent的魅力,上述指南都提供了明确的路径。下一步,就是接入飞书、钉钉或QQ,让你的OpenClaw真正开始“干活”赚钱了 [citation:6]。
Delphi多线程数据库查询(ADO)
测试程序流程大致是这样的:在主窗体上放TADOConnection和TQuery控件,启动时这个TQuery从Customer表中查出客户编码CustNo和公司名称Company,放到三个Combox框中,分别在三个列表框中选定客户公司名称,按照公司名称所对应的客户代码建立三个线程同时在orders表中查询销售日期SaleDate分别填入ListBox中。所以,线程中不能使用主线程中TADOConnection对象,每个线程必须创建自己的数据库连接。第一第三两个线程条件一样,查询的结果也一样。
告别 Python!C# 直接跑 YOLO 目标检测:工控机边缘推理终极方案
set;set;set;set;set;stringget;set;get;set;get;set;get;set;get;set;告别 Python 依赖,不是排斥 Python 的训练能力,而是为了工程化的极致。在工控机这个资源受限、稳定性要求极高的战场上,是目前最优雅、最高效的解决方案。更少的依赖= 更少的故障点。更快的速度= 更高的产线节拍。更简单的部署= 更低的人力成本。现在,拿起你的 C# 项目,导入那个.onnx。
Python自动化脚本:模拟鼠标键盘保持电脑在线状态
在计算机自动化领域,模拟用户输入是一项基础且实用的技术,其核心原理是通过程序生成鼠标或键盘事件来与操作系统交互。这项技术的价值在于能够自动化重复性操作,提升工作效率,并解决特定场景下的系统交互问题。PyAutoGUI作为Python生态中广泛使用的自动化库,封装了跨平台的底层API调用,为开发者提供了简洁统一的接口来实现输入模拟。在实际工程实践中,这类技术常应用于自动化测试、远程办公辅助、数据抓取等场景,帮助用户保持系统活跃状态,防止因无操作导致的锁屏或休眠中断任务。通过合理配置移动间隔和随机化模式,可以更
delphi调用ADO组件对ACCESS的添加查询
delphi调用ADO组件对ACCESS的添加查询# 在工程下面建立与ACCESS的连接查询数据添加数据 # 在工程下面建立与ACCESS的连接 选择ADOConnection 1、修改ConnectionString,在里面点击build并选择已经建立好的数据库点击测试连接,若成功就可以了。 2、连接Connection输入用户名和密码,用户名默认Admin。 使用ACCESS的话选择Microsoft jet 4.0 OLE DB Prvider 3、创建ADOQuery Connection选择
大中型超市收银系统(可直接运行)
光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开
Delphi 7 ADO使用
Delphi7 ADO面板上的控件简介 一、 TADO Connection组件 该组件用于建立数据库的连接。ADO的数据源组件和命令组件可以通过该组件运行命令及数据库中提取数据等。 该组件用于建立数据库的连接,该连接可被多个数据集所共享,但是并不是应用程序中必须的,因为ADO数据集及命令组件通过设置其Connection String属性,可以直接连接到数据库。但是如果多个数据集使用相同的
汉书HE8,好用的汇编代码编写工具
汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大
NTscan扫描工具
ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。
3197



被折叠的 条评论
为什么被折叠?



