- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试异步执行 SQL 查询。我已经检查了 http://docwiki.embarcadero.com/RADStudio/XE5/en/Asynchronous_Execution_(FireDAC) 中的示例代码
以及目录中的示例项目
..Samples\Object Pascal\Database\FireDAC\Samples\Comp Layer\TFDQuery\ExecSQL\Async
我想我已经明白了其中的逻辑。但有一个问题 - 事件 QueryAfterOpen
永远不会执行,而我的 TDataSource
始终保持 Nil
(因为它得到 Nil
在 QueryBeforeOpen
内 - 此事件始终执行)。这是我单位的所有代码:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, FireDAC.Stan.Intf,
FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf,
FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys,
FireDAC.VCLUI.Wait, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt,
Vcl.StdCtrls, Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client,
FireDAC.Phys.MySQLDef, FireDAC.Phys.MySQL;
type
TForm1 = class(TForm)
Button1: TButton;
FDPhysMySQLDriverLink1: TFDPhysMySQLDriverLink;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Query1BeforeOpen(DataSet: TDataSet);
procedure Query1AfterOpen(DataSet: TDataSet);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
Connection1: TFDConnection;
Query1: TFDQuery;
DataSource1: TDataSource;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
QueryFinished: Boolean;
begin
with Query1 do begin
SQL.Text := 'SELECT field1 FROM test_table WHERE idpk=1';
AfterOpen := Query1AfterOpen;
BeforeOpen := Query1BeforeOpen;
ResourceOptions.CmdExecMode := amAsync;
QueryFinished := False;
Open;
repeat
Sleep(100);
if Command.State = csPrepared then begin
// A command is prepared. A result set is not accessible.
// TmpInteger := Query1.FieldByName('field1').AsInteger;
end
else if Command.State = csOpen then begin // A command execution
// is finished. A result set is accessible and not yet fully fetched.
if DataSource1.DataSet <> Nil then begin
// this code never executes because Query1AfterOpen never executes and
// DataSource1.DataSet remains always Nil !!!
QueryFinished := True;
end;
end;
until ((QueryFinished) OR (DataSource1.DataSet <> Nil));
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
SQLConnParams: string;
begin
SQLConnParams := ''; // sql connection parameters removed from here from security
// issues, assume they are correct
Connection1 := TFDConnection.Create(Nil);
Connection1.Params.Text := SQLConnParams;
Query1 := TFDQuery.Create(Nil);
Query1.Connection := Connection1;
DataSource1 := TDataSource.Create(Nil);
DataSource1.DataSet := Query1;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DataSource1.Free;
Query1.Free;
Connection1.Free;
end;
procedure TForm1.Query1AfterOpen(DataSet: TDataSet);
begin
DataSource1.DataSet := Query1;
Query1.AfterOpen := Nil;
//Query1.ResourceOptions.CmdExecMode := amBlocking;
end;
procedure TForm1.Query1BeforeOpen(DataSet: TDataSet);
begin
DataSource1.DataSet := Nil;
end;
end.
显然,repeat..until..
循环内的代码是无限的,除非有人终止程序。为了执行 Query1AfterOpen
中的代码(或使用另一个事件)以便我可以在 TFDQuery
完成工作后访问结果集,我缺少什么?
最佳答案
这些异步事件通过消息循环与主线程同步。只要您停留在 Button1Click
事件中,就无法处理新消息。因此 AfterOpen 事件被困在消息循环内。
我不知道您想要实现什么目的,但您应该考虑将相关代码放在 AfterOpen 事件中。 Repeat-until 子句以某种方式伪造了异步执行的目的。
关于Delphi FireDAC TFDQuery 事件 'AfterOpen' 从未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35558511/
我想使用组件编辑器设计我的 TFDQuery,即在设计时设置 SQL 字符串、选项等,然后在线程中使用查询。 我的问题是线程的每个运行实例都需要自己的查询实例 - 否则它将不是线程安全的。 我是否应该
问题 我想知道是否有任何方法可以通过只知道表的主键来移动到数据集中的特定记录(FDQuery)。 我所知道的 我知道我可以使用 FDQuery.Next; FDQuery.Prior; 移至下一条/上
简而言之,我如何知道哪些(主要和唯一)键唯一标识 FireDAC 查询记录? 我正在使用 Delphi 10.1 & FireDAC & Firebird。 我正在使用代码生成来生成一个包含我的应用程
我想从 TFDQuery.Delta 中删除一个特定的 usModified 记录,但不恢复它。与 TFDQuery.CommitUpdates 相同,但不是针对所有数据集,仅针对一个选择的记录。有人
我正在尝试异步执行 SQL 查询。我已经检查了 http://docwiki.embarcadero.com/RADStudio/XE5/en/Asynchronous_Execution_(Fire
任何人都可以帮助我在运行时克隆 TFDQuery 吗?我在 Delphi Tokyo 中编码,我有一个带有 TFDQuery 的数据模块,其中我在设计时使用字段编辑器定义了所有字段属性,这样我的 DB
我在 Delphi XE5 中使用 TFDQuery 组件从 PostgreSQL 数据库的表中插入和更新记录。我在添加字段(在 DFM 中持续存在)时遇到的一个缺点是它没有检测到某些表字段为 NOT
我使用的是 Delphi 10 Seattle,下面是示例代码。 unit Unit1; interface uses Winapi.Windows, Winapi.Messages, Syste
我正在寻找 TFDQuery 中的跳过并选择。我找到的属性是 .FetchOptions.RecsSkip 和 .FetchOptions.RecsMax。我使用 Tokyo 10.2.3 和数据库
使用 Delphi 10.2、SQLite 和 Teecharts。我的 SQLite 数据库有两个字段,创建方式为: CREATE TABLE HistoryRuntime ('DayTime' D
使用 Delphi 10.2、SQLite 和 Teecharts。我的 SQLite 数据库有两个字段,创建方式为: CREATE TABLE HistoryRuntime ('DayTime' D
我是一名优秀的程序员,十分优秀!