Delphi多线程学习:多线程数据库查询(ADO)

Delphi多线程下的ADO编程  Delphi多线程下的ADO编程  前言:几个月前接到一个任务:将一后台程序访问数据库的方式从BDE改为ADO,原因是由于业务量的增加,通过BDE不论是向数据库写入数据还是从数据库中读出数据的速度都变得无法忍受,大家都知道ADO在数据库访问速度方面比BDE要快的多了(我写了一个测试程序使用ADO比使用BDE快了近100倍!)。这个任务还不简单嘛,只要将BDE的控件更换成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中

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.

【delphi11】delphi进阶【六、数据库编程】 设计数据库:首先,你需要一个数据库。可以是本地的 SQLite 数据库或远程的 SQL Server 数据库。设置数据库连接:使用 ADO 或 FireDAC 组件来建立连接。设计用户界面:创建表格、按钮等控件来显示和操作数据。编写事件处理代码:为按钮点击等事件编写代码,如添加、删除、更新数据库记录。 阅读详情

相关推荐

Delphi数据库处理组件BDE、ADO、InterBase和dbExpress详细说明

虽然ADOTable和ADOQuery组件可以非常简单的连接数据库,但是当需要更加精细的控制数据库的时候,往往需要应用ADO 更多的方法,我们知道,支撑ADO 的主要由Connection,Command,Recordsrt三个对象组成, 对应的就有ADOConnection和ADOCommand控件,而Recordsrt对象属性和方法,封装在ADODataSet中,同时ADODataSet本身,也具备和ADOtable组件相同的对数据绑定控件控值的属性和方法。在特殊的设计中,这个表格可能会有用。

男神的专栏 3197

Delphi中实现多线程同步查询

当然,只要将查询或数据操纵构造成线程对象,情况会好一些,至少可以接受窗口消息,也可以随时终止查询或数据操纵,而不会在屏幕上显示出太难看的白色。即使是这样,也不可避免地会在查询时闪现一个带有 SQL符号的沙漏,即鼠标变成了查询等待。需要特别注意的是,因为Delphi中的 VCL组件大多都 不是线程安全的,所以应当在线程查询结束后再将DataSource组件与查询组件关联,从而显示 在DBGrid组件中。下面的例子只实现了静态的线程同步查询,即线程对象是固定的,并随窗体的创建和销毁 而创建和销毁。

s13596191285的博客 810

Delphi中通过ADO连接MySQL数据库的驱动安装与应用

本文还有配套的精品资源,点击获取 简介:本压缩包提供了Delphi 7.0开发的示例程序,用于展示如何使用ADO技术连接MySQL数据库。内容涵盖了ADO核心组件如Connection、Command、Recordset和Parameters的使用方法,以及Delphi环境下安装ADO驱动的步骤。同时,提供了必要的项目文件,包括配置文件、单元文件、项目文件、可执行文件、源代...

weixin_32687875的博客 1859

delphi ComboBox AddObject 组合框下拉取值正确使用方法

大家都知道 TComboBox  AddObject 是个好东西。最近由于数据库结构设计设计上的原因(有很多诸如字典表) 如 国家代码表 语种表 而需要TComboBox  存储两列数据 一个 代码 一个值  如  中国  chi   而这些值是数据库读取填入的 AddObjec

文图软件 9141

Delphi中的ADOquery 用法

Delphi中的ADOquery 用法Delphi中的ADOquery 用法Delphi中的ADOquery 用法

多线程文件查询(delphi)

利用delphi实现的多线程的文件查询系统,支持word内部查询。速度快。易使用。

组合框控件ComboBox

概述: ComboBox的功能是从一个列表中一次只能选取或输入一个选项,其主要特点是具有带向下箭头的方框。在程序执行时,按下此按钮就会下拉出一个列表框供用户选择项目。另外用户还可以在组合框上方的框中输入数据。 1、组合框的属性 组合框的属性 说明 DropDownStyle 获取或设置指定组合框样式的值,可取以下值之一。①DropDown (默认值):文本部分可编辑,用户必须单击箭头按钮来显示列表部分。②DropDownList:用户不能直接编辑文本部分,用户必须单击箭头按钮来显示列表部

橘猫吃不胖的博客 3万+

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...

qq_62898618的博客 784

安卓端目标检测模型部署血泪史:从NCNN/TFLite/MNN全军覆没到Torchscipts终见光明

公司需在Android设备部署目标检测模型,要求: ✅ 实时检测速度≥15FPS ✅ 模型精度损失<5% ✅ 兼容中低端安卓设备👉 GitHub项目地址:pytorch/android-demo-app/ObjectDetection我已上传这份源码到csdn下载准备模型(必须走这步才能跑通安卓端源码)如果您没有设置PyTorch环境来运行该脚本,可以下载模型文件此处转到“android演示app/ObjectDetection/app/src/main/assets”文件夹,然后跳过此步骤的其余部分,直

机器学习、深度学习、强化学习、迁移学习 1567

3DMax马克杯制作教程

01 在前视图创建一个【圆柱体】,设置参数,长度为32,高度为82;高度分段12、边数为16;如图所示。 02 点击鼠标右键,把圆柱体转换为可编辑多边形,如图所示。 03 在修改面板中,选择【多边形】层级,在视图中选择所示的面,使用缩放工具稍微缩小一点,如图所示。 04 点击【插入设置】,如图所示。 设置插入数量为2.5mm。 05 点击【挤出设置】,如图所示。 ...

youximoxingEDO的博客 3478

多线程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. 按照设...

cumao2792的博客 1167

从数据手册到代码:一步步解读SC7A20寄存器配置与加速度值换算原理

本文详细解析了SC7A20三轴加速度传感器的寄存器配置与加速度值换算原理。从数据手册出发,逐步拆解关键寄存器设置,并推导原始ADC值到物理加速度的完整换算过程,帮助开发者深入理解传感器底层工作原理,提升嵌入式开发效率。

weixin_29179311的博客 368

【转】Delphi多线程学习(9):多线程数据库查询(ADO)

原文:http://www.cnblogs.com/djcsch2001/articles/2382559.html ADO多线程数据库查询通常会出现3个问题: 1、CoInitialize 没有调用(CoInitialize was not called);所以,在使用任何dbGo对象前,必须手 调用CoInitialize和CoUninitialize。调用CoInitializ...

weixin_30765475的博客 124

自动驾驶——最优控制算法(LQR)工程化总结

到近段时间,真正在我们的控制器上运行最优控制算法(LQR),一步一个脚印,从开始只是知道其“控制理论”的阶段、再到对着一堆网上的资料和公式一筹莫展不知何着手、再到初步实现了LQR算法的开发(但是使用的扭矩环控制,控制的不好,而且由于各种原因被delay,迟迟无法落地),直到大上个星期,泊车平台有此LQR开发需求,又重新了开始了算法的研发,用时一个周时间完成了算法开发,然后再用一个周时间进行实车最优控制算法验证与调试,取得了很大的进展,由于执行器是转角控制的,这无疑少了很多的工作量。

qq_40464599的博客 2787

Zotero插件安装保姆级教程:从Jasminum到Sci-Hub,一站式搞定文献管理

本文提供Zotero插件安装的保姆级教程,从Jasminum到Sci-Hub,一站式搞定文献管理。通过详细配置和实战案例,帮助用户高效构建文献工作流,提升研究效率。重点介绍了元数据抓取、PDF管理、文献分析和知识产出等关键插件的使用方法。

weixin_42531516的博客 171

Delphi多线程学习(9):多线程数据库查询(ADO)

ADO多线程数据库查询通常会出现3个问题:1、CoInitialize 没有调用(CoInitialize was not called);所以,在使用任何dbGo对象前,必须手 调用CoInitialize和CoUninitialize。调用CoInitialize失败会产生"CoInitialize was not called"例外。2、画布不允许绘画(Canvas does not

1056

OpenClaw赚钱实录:从“养龙虾“到可持续变现的实践指南——原生“龙虾”OpenClaw快速部署、问题速查与避坑指南

至此,你已经完成了从选购服务器到配置AI大脑的全过程。无论是想在云上养一只7x24小时的“龙虾”,还是在本地体验AI Agent的魅力,上述指南都提供了明确的路径。下一步,就是接入飞书、钉钉或QQ,让你的OpenClaw真正开始“干活”赚钱了 [citation:6]。

冯·诺依曼 990

Delphi多线程数据库查询(ADO)

测试程序流程大致是这样的:在主窗体上放TADOConnection和TQuery控件,启动时这个TQuery从Customer表中查出客户编码CustNo和公司名称Company,放到三个Combox框中,分别在三个列表框中选定客户公司名称,按照公司名称所对应的客户代码建立三个线程同时在orders表中查询销售日期SaleDate分别填入ListBox中。所以,线程中不能使用主线程中TADOConnection对象,每个线程必须创建自己的数据库连接。第一第三两个线程条件一样,查询的结果也一样。

疯流人物 835

告别 Python!C# 直接跑 YOLO 目标检测:工控机边缘推理终极方案

set;set;set;set;set;stringget;set;get;set;get;set;get;set;get;set;告别 Python 依赖,不是排斥 Python 的训练能力,而是为了工程化的极致。在工控机这个资源受限、稳定性要求极高的战场上,是目前最优雅、最高效的解决方案。更少的依赖= 更少的故障点。更快的速度= 更高的产线节拍。更简单的部署= 更低的人力成本。现在,拿起你的 C# 项目,导入那个.onnx。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 422

Python自动化脚本:模拟鼠标键盘保持电脑在线状态

在计算机自动化领域,模拟用户输入是一项基础且实用的技术,其核心原理是通过程序生成鼠标或键盘事件来与操作系统交互。这项技术的价值在于能够自动化重复性操作,提升工作效率,并解决特定场景下的系统交互问题。PyAutoGUI作为Python生态中广泛使用的自动化库,封装了跨平台的底层API调用,为开发者提供了简洁统一的接口来实现输入模拟。在实际工程实践中,这类技术常应用于自动化测试、远程办公辅助、数据抓取等场景,帮助用户保持系统活跃状态,防止因无操作导致的锁屏或休眠中断任务。通过合理配置移动间隔和随机化模式,可以更

weixin_28713299的博客 578

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选择

qq_43443578的博客 536

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.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属性,可以直接连接到数据库。但是如果多个数据集使用相同的

云中雁012345之成长 3599

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 解决“RichEdit line insertion error”错误
下一篇: 使用DBCC CHECKTABLE 修复表错误!
easyboot
博客等级 码龄25年 533粉丝 723原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值