线程化 Delphi ADO 查询

2023-11-21

我有一个查询代码,每次需要从数据库获取数据时都可以调用它,并且我希望它是线程化的。不知道如何在线程中实现此代码,以便我可以重用此代码,基本上,我希望此代码在线程中。我知道如何在线程内创建一个简单的数据库查询,但想要一些可以重用的东西。谁能指出我在哪里可以找到这方面的示例,或者是否可以提供一个示例?

这是我的示例数据库查询:

function TDBConnection.SQLOpen(const SQLStr: String): TDataSet;
var
  i: Integer
begin
  try
    Result := TADOQuery.Create(DBConnect.FDatabaseConection);
    TADOQuery(Result).Connection:=DBConnect.FDatabaseConnection;
    TADOQuery(Result).CommandTimeOut:=30;
    TADOQuery(Result).SQL.Text := SQLStr;
    TADOQuery(Result).Open;
  except

  end;
end;

这是我如何调用上述函数的示例:

function TDBConnection.GetUserInfo: Boolean;
var
  sqlStr: String;
  Database: TDataset;
begin
  sqlStr:= 'SELECT FIELD1, FIELD2, FIELD3 FROM TABLE1';
  try
    Dataset := SQLOpen(sqlStr);
    if not Dataset.IsEmpty then
    begin
      //pass result to StringGrid
    end;
  finally
    FreeAndNil(SQLParams);
    FreeAndNil(Dataset);
  end;
end;

为了可重用性,使用带有参数信息的数组。
每个线程都使用自己的 Connection 创建一个自己的 Adodataset。
Recordset可用于线程终止后的显示和编辑。
对于真正的应用程序,必须添加线程实例的处理。

unit ThreadedAdoDataset;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, ADODB, Grids, DBGrids;

type

  TFieldInfoRecord = Record // as far as sometimes parametertypes can not be detected by
    DataType: TFieldType; // Ado on his own, provide all needed informations
    Name: String;
    Size: Integer;
    Value: Variant;
  End;

  TFieldInfoArray = Array of TFieldInfoRecord;

  TDBThread = Class(TThread)
    Constructor Create(Const ConnectionString, SQL: String;
      FDArray: TFieldInfoArray);
  private
    FConnectionString, FSQL: String;
    FFDArray: TFieldInfoArray;
    FRecordSet: _RecordSet;
  Protected
    Procedure Execute; override;
  public
    Property RecordSet: _RecordSet read FRecordSet;
  End;

  TForm7 = class(TForm)
    ADOConnection1: TADOConnection;
    Button1: TButton;
    ADODataSet1: TADODataSet;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    procedure ThreadTerminate(Sender: TObject);
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form7: TForm7;

implementation

uses ActiveX;
{$R *.dfm}

procedure TForm7.Button1Click(Sender: TObject);
var
  FDArray: TFieldInfoArray;
  I: Integer;
begin
  // prepare parameterinformations
  SetLength(FDArray, 1);
  FDArray[0].Name := 'cn';
  FDArray[0].DataType := ftString;
  FDArray[0].Size := 20;
  FDArray[0].Value := '%ue%';

  for I := 0 to 10 do // testrun with 11 threads

    With TDBThread.Create(ADOConnection1.ConnectionString,
      'select * from Composition where Componame like :cn', FDArray) do
    begin
      FreeOnTerminate := true;
      // assign the wished procedure to ba called on terminate
      OnTerminate := ThreadTerminate;
    end;

end;

procedure TForm7.ThreadTerminate(Sender: TObject);
begin
  // example of assigning the recordset of the thread for displaying and editing
  // NOTE for editing the connection of ADODataSet1 has to be fitting to the threadcall
  ADODataSet1.RecordSet := TDBThread(Sender).RecordSet;
end;

procedure TForm7.FormCreate(Sender: TObject);
begin
  ReportMemoryLeaksOnShutDown := true;
end;


{ TDBThread }

constructor TDBThread.Create(const ConnectionString, SQL: String;
  FDArray: TFieldInfoArray);
var
  I: Integer;
begin
  inherited Create(false);
  FConnectionString := ConnectionString;
  FSQL := SQL;
  SetLength(FFDArray, Length(FDArray));
  for I := 0 to High(FDArray) do
  begin
    FFDArray[I].DataType := FDArray[I].DataType;
    FFDArray[I].Size := FDArray[I].Size;
    FFDArray[I].Name := FDArray[I].Name;
    FFDArray[I].Value := FDArray[I].Value;
  end;
end;

procedure TDBThread.Execute;
var
  I: Integer;
begin
  inherited;
  CoInitialize(nil);
  try
    With TADODataSet.Create(nil) do
      try
        CommandTimeOut := 600;
        ConnectionString := FConnectionString;
        // use own connection for the dataset
        // will requite a conncetionsstring including all
        // information for loggon
        Commandtext := FSQL;
        Parameters.ParseSQL(FSQL, true); // extract parameters
        for I := Low(FFDArray) to High(FFDArray) do // set parametervalues
        begin
          Parameters.ParamByName(FFDArray[I].Name).DataType := FFDArray[I]
            .DataType;
          Parameters.ParamByName(FFDArray[I].Name).Size := FFDArray[I].Size;
          Parameters.ParamByName(FFDArray[I].Name).Value := FFDArray[I].Value;
        end;
        Open;
        FRecordSet := RecordSet; // keep recordset
      finally
        Free;
      end;
  finally
    CoUnInitialize;
  end;
end;

end.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程化 Delphi ADO 查询 的相关文章

  • 多线程读取xml文件

    我进行了很多搜索 但找不到适合我的问题的解决方案 我编写了一个 xml 文件 其中包含电视节目的所有剧集信息 它大小 38 kb 包含大约 680 个变量的属性和字符串 起初 我只是在 XMLTextReader 的帮助下阅读它 它在我的四
  • 有什么理由不在Python中混合使用多处理和线程模块

    我正在考虑使用Python来实现一个需要大量多线程的程序 另一个要求是它将在桌面上运行 因此拥有许多进程将使应用程序显得混乱且难以杀死 在任务管理器中 因此 我正在考虑使用线程和多处理模块来减少进程数量 据我了解 GIL 仅适用于单个进程
  • 通过“修改日期”确定文件夹中的哪个文件是最新的?

    我需要扫描特定文件夹中的最新文件 基本上检查修改日期以查看哪个是最新的 但请记住这些文件具有随机名称 这是我到目前为止得到的 procedure TForm1 Button1Click Sender TObject begin ftp Ho
  • Objective C 中最好的多线程方法?

    我正在开发一个 iPad 应用程序 目前正在努力寻找多线程的最佳方法 让我用一个简化的例子来说明这一点 我有一个包含 2 个子视图的视图 一个目录选择器和一个包含所选目录中所有图像缩略图的图库 由于 下载 和生成这些缩略图可能需要相当长的时
  • VirtualStringTree 正确/推荐使用

    我已经使用 virtualstringtree 一段时间了 我将它用于两个不同的用途 第一个是用于选择 显示数据的普通树 第二个是作为网格来显示 SQL 语句的输出 我加载到树中的所有数据都来自数据库 对于树示例 我有一个 ParentId
  • 从 ProcessThreadCollection 中按名称获取正在运行的线程

    在搜索了 Stack Overflow 问题并进行了一些谷歌搜索后 我仍然没有得到它 我知道您可以使用 Thread isAlive 方法检查单个线程是否正在运行 但我想检查特定的 FooThread 是否仍在当前进程的所有正在运行的线程之
  • 如何从窗体单元外部访问delphi控件?

    我试图从如下定义的过程中调用计时器的 Enabled 属性 procedure Slide Form TForm Show Boolean 并且没有固定的形式名称 例如 Form2 Timer 将表单的单位放入使用列表后 这可以工作 For
  • 如何将可变参数传递给 std::thread?

    我想通过包装 C 11 中的 std thread 类来使用我自己的 Thread 实现 这样我就能够像我想要的那样处理异常 这是我的包装类 include
  • Soap Delphi 客户端因 1MB 调用超时而结束

    我们正在开发 SOAP Web 服务 Apache PHP 所有小规模调用都运行良好 但对于 1Mb 的 Soap 调用 HTTPS 调用大小为 1MB 我们的 Delphi Soap 客户端在除一台 PC 之外的所有 PC 上都因超时而停
  • 异步回调到BackgroundWorker

    我想使用 NET FTP 库 http netftp codeplex com http netftp codeplex com 该库提供 BeginOpenRead string AsyncCallback object 使用异步编程模型
  • Android 上的多处理

    我一直在 Android 上执行一些测试 以验证并行化算法 如 FFT 的性能可以提高多少 我通过使用带有 JNI FFTW 的 pthread 和 Java 线程 来自 JTransforms 来实现这些算法 我没有像预期那样通过使用线程
  • 从 Android 函数更新 Textview

    有人可以告诉我如何从函数更新 Android Textview 控件吗 我在互联网上进行了深入搜索 看到很多人都问同样的问题 我测试了线程但无法工作 有人有一个简单的工作示例吗 例如 调用一个函数 在循环中运行多次 并且该函数在 TextV
  • 如何使用 IdTCPClient 等待来自服务器的字符串?

    我的 IdTelnet indy 10 1 有问题 我无法以 Unicode 模式从服务器读取数据 现在我想用 IdTCPClient 编写 telnet 终端 服务器有时发送一行 有时发送越来越多的行 但发送之间没有固定的时间 现在我的问
  • 线程数组?

    所以我在理解如何避免线程的顺序执行时遇到了问题 我试图创建一个线程数组并在单独的循环中执行 start 和 join 函数 这是我现在拥有的代码示例 private static int w static class wThreads im
  • Delphi XE5 FireDAC 错误:无法加载供应商库 [libmysql.dll 或 libmysqld.dll]

    我在 Windows 7 64 位上使用 Delphi XE5 只是尝试 FireDAC 组件 我正在使用一个 TFDConnection 组件连接到本地 MySQL 数据库 v5 6 15 我已经将 libmysql dll 32位 v5
  • DBX 错误:驱动程序无法正确初始化

    我在跑步德尔福XE3 终极版 MySQL 数据库 这是我点击时收到的错误Test Connection 作为回应 我在 xampp 目录中找到了 libmysql 库 并将其复制到我的 System32 目录中 但这是行不通的 此消息指的是
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS
  • 在该对象调用的事件期间销毁该对象

    我有一个按钮 它的 OnClick 事件调用一个销毁按钮的过程 但随后 线程 想要返回到 OnClick 事件 并且我遇到了访问冲突 我完全被难住了 您需要在按钮的所有代码执行完毕后销毁该按钮 执行此操作的标准方法是将用户定义的消息发布到表
  • C# 为所有对象订阅相同的事件处理程序是线程安全的吗

    我的项目中有一种情况 我连接到多个服务器并监听事件 每当从服务器接收到事件时 Handler 就应该将该事件添加到公共队列中进行处理 所有连接都应将接收到的事件添加到队列中 foreach var item in collection Co
  • C++11 非阻塞生产者/消费者

    我有一个 C 11 应用程序 其中有一个生成数据的高优先级线程和一个消耗数据的低优先级线程 在我的例子中 将其写入磁盘 我想确保高优先级生产者线程永远不会被阻塞 即它仅使用无锁算法 使用无锁队列 我可以从生产者线程将数据推送到队列 并从消费

随机推荐

  • 如何将我的 C# 程序作为计划任务运行

    我对 C 还很陌生 所以你必须忍受我 我开发了一个 Windows 窗体程序 它更新一些 SQL 记录 作为我们一个客户的日终处理过程 下一步是我需要将程序安装在服务器上 并在程序中模拟一个按钮点击 成为计划任务 我知道如何在服务器端设置任
  • Adb 安装/上传 apk 需要很长时间

    我在我的设备 Galaxy SPlus 和 Nexus 10 上上传应用程序从来没有遇到过任何问题 但由于未知的原因 现在在我的 Nexus 10 上上传 APK 需要很长时间 我尝试了 20 次 只完成了一次 有谁知道我如何调试 详细 A
  • 带有自定义 IEqualityComparer 的 Big O of Distinct() 方法

    任何人都知道 Big O 中使用的算法Distinct 方法 用自定义的IEqualityComparer 这里有一个同样的问题关于 对 LINQ 方法的运行时复杂性 Big O 有哪些保证 请参阅有关不同的答案中的此部分 不同 Group
  • mod_php是什么?

    在经历一个Zend教程 我遇到了以下声明 请注意 htaccess 中的 php flag 设置仅在您使用 mod php 时才有效 有人能解释一下这是什么意思吗 mod php表示 PHP 作为阿帕奇模块 基本上 加载时mod php作为
  • 使用 2d 数组索引 3d numpy 数组

    我想根据 numpy 3d 数组中的值创建一个 numpy 2d 数组 使用另一个 numpy 2d 数组来确定在轴 3 中使用哪个元素 import numpy as np arr 3d np arange 2 3 4 reshape 2
  • 在 IntelliJ 中调试时是否可以观看 BufferedImage 对象?

    在 IntelliJ 中调试时是否可以观看 BufferedImage 对象 我的意思是查看图像的视觉内容 而不是记忆身份 是否也可以直观地查看自定义对象 即编写一些自定义可视化工具 IntelliJ IDEA 2016 1 1 能够显示B
  • 管理 Firebase 聊天中的未读消息

    我正在构建实时聊天 与 Skype 非常相似 我使用 firebase 作为后端 在客户端使用 Angularfire 基本上 所有事情看起来都很清楚 但我坚持一件事 显示未读消息数 应用程序使用非常简单的 Firebase 设计 2 个或
  • 使用 pdfsharp 添加 acroform

    我如何将带有 pdfsharp lib 的 Acroforms 或任何输入字段 添加到 pdf 中 例如文本框 PdfSharp Pdf AcroForms PdfTextField 我找不到任何示例 只能读取 修改 我找到了 page g
  • 为什么Ajax.BeginForm提交后重定向到新的空页面?

    为什么 Ajax BeginForm 在提交后将我的页面重定向到新的空页面 我的控制器代码是 HttpPost public void ProductCommentAdd int productId string text Do somet
  • 在 Rails 6 中使用 activestorage 时,如何在重新显示表单时保留文件?

    在 Rails 6 中 我有一个带有文件字段的表单 我使用 activestorage 来存储文件 如果提交表单后验证失败 则会重新显示表单并显示验证错误 重新显示表单时如何保留添加到文件字段的文件 以便用户不必再次将文件添加到表单 Rai
  • 在另一个类中处理 JButton 单击事件

    我是来自 C 的 java 新手 所以我不熟悉 java 最佳实践 我有一个主类 它打开 JFrame 以从用户那里获取多个输入字符串 当用户单击 提交 时 GUI 应关闭 主类将继续使用输入进行处理 This is the main cl
  • 如何在 Polymer 2.0 中启用 Shady DOM?

    聚合物 1 x 用途阴暗的 DOM默认情况下 但可以在初始化时通过设置来更改window Polymer导入前的对象polymer html如下 然而 Polymer 2 0 似乎使用影子 DOM不管window Polymer dom s
  • Twitter bootstrap:模式淡入淡出

    我的 twitter bootstrap 模式有问题 当我没有的时候它工作得很好 fade我的元素上的类 一旦我添加它 模式就不会显示 我将问题追查到这一行 我认为 doAnimate this backdrop one transitio
  • 如何使用 cmake 设置嵌套子目录的 Visual Studio 过滤器

    我有以下结构 Main dir CMakeLists txt File cpp File hpp Dir dir CMakeLists txt File1 cpp File1 hpp File2 cpp File2 hpp 主要 CMake
  • 如何对对象数组进行字符串化?

    我创建了一个需要存储并保留到另一个页面的对象数组 对象数组与此类似 var cheese array name Chedder age 34 smelly true name Brie age 4 smelly false name Blu
  • IE 中的 HTML 实体和字符集

    我正在显示 html 实体 10003 复选标记 在使用 iso 8859 1 作为字符集的 html 文档中 在 Firefox 中 它显示为复选标记 在 IE 中 它显示为一个方框 切换到 UTF 8 似乎没有什么区别 有没有一种可靠的
  • Javascript正则表达式字符串中的货币符号

    所以我有一个格式化字符串可以是 00 or 00我想获取货币符号 这里是我正在使用的代码 currencySymbol format match p Sc 我希望currencySymbol 等于 或 但它不起作用 currencySymb
  • MS SQL Server - 通过网络批量插入

    我有一个使用 MS SQL Server 的应用程序 我需要从文件中进行批量插入 症结在于数据库和我的应用程序将托管在不同的服务器上 通过网络进行批量插入的最佳方法是什么 到目前为止我想到的两个想法 从应用程序服务器共享数据库服务器可以找到
  • 无法使用bundle exec找到rake

    当我尝试执行 捆绑执行耙任何东西 我收到错误 Could not find rake 10 1 0 in any of the sources Run bundle install to install missing gems 但是当我执
  • 线程化 Delphi ADO 查询

    我有一个查询代码 每次需要从数据库获取数据时都可以调用它 并且我希望它是线程化的 不知道如何在线程中实现此代码 以便我可以重用此代码 基本上 我希望此代码在线程中 我知道如何在线程内创建一个简单的数据库查询 但想要一些可以重用的东西 谁能指