我有一个数据模块,其TFDConnection连接到SQLLite数据库。
对数据模块的查询工作正常。但是如果我在将Active设置为true时对连接到数据模块上的连接的表单进行查询,则会收到错误:
异常消息:[FireDAC] [Comp] [Clnt] -512。连接不是 为[FDQuery1]定义。可能的原因:Connection和ConnectionName 财产价值
这在设计时发生。
这是在Firemonkey移动应用程序中使用Delphi Tokyo。
答案 0 :(得分:3)
我认为这可能是在Delphi Seattle和Tokyo(10.2)之间引入的FireDAC(或IDE)错误。我发现我可以按如下方式重现它:
在西雅图中创建新的多设备(FMX)项目。
将数据模块添加到项目中并向其添加FDConnection。我将FDConnection配置为使用MSSQL驱动程序,将连接设置为使用OS身份验证,本地Sql Server和现有数据库。我将LoginPrompt设置为false。
我将FDQuery1添加到表单中,使表单使用数据模块的单元,然后将FDQuery1的连接设置为数据模块上的连接并添加" select * from mytable&# 34;作为它的Sql。然后我在OI中将FDQuery1.Active设置为true。 FDQuery1无怨无悔地开放。我将FDQuery1.Active重置为false,保存项目并关闭它。
我关闭西雅图,启动东京并开启了该项目。当我将FDQuery1.Active设置为true时,我得到了与您报告的完全相同的异常消息。有趣的是,OI然后更新FDQuery1.Active以显示True
。
然后我将FDQuery1.Active设置为false然后设置为true,并且不的例外情况发生。
我关闭并重新启动东京,重新打开项目,再次,第一次(但只是第一次)我将FDQuery1.Active设置为true,再次发生异常。
欢迎您在Emba的问题报告中包含上述步骤。顺便说一下,我没有花时间调查项目的运行时行为。
猜测 - 这只是一个猜测 - IDE中的某个地方存在一个问题,即当它必须创建数据模块的一个实例以便它的FDConnection可以建立打开FDQuery1所需的连接时就会出现问题。如果这是正确的,它不应该影响运行时行为,但就像我说的那样,我没有调查过。如果我是对的,我认为这比一个重大问题更令人烦恼。
更新:此问题似乎是针对FMX的。我在新的东京VCL项目中重复了步骤1-3,并且即使第一次将FDQuery1.Active设置为true,也不会发生异常+错误消息。
更新#2:此问题在运行时很容易重现。您需要做的就是从Project的表格中删除数据模块自动创建列表,然后在运行时尝试在创建数据模块之前打开FDQuery。显然,解决方法只是在打开FDQuery之前检查数据模块是否存在,如果没有,则在代码中创建它。
顺便说一下,在实际应用程序中,我个人不会依赖IDE中的TDataSet的Active属性设置来打开数据集,而是始终在代码中打开它。这是我在Delphi早期遇到的习惯,当时数据集和数据源的设计时设置经常出现问题,这些数据集和数据源指的是位于另一个模块中的数据库连接或类似设备正在丢失"丢失& #34;在运行时。
答案 1 :(得分:1)
我在Windows VCL应用程序中使用Delphi 10.3 Community Edition时遇到了相同的错误。即使我的FDQuery具有有效的连接。
我在Embarcadero Delphi CE Bootcamp 2018 course Week 4 of Databases中发现问题是因为您的 DataModule 是在表格之后创建的。 >
要解决此问题,请转到:
项目->选项->应用程序->表单
在Autho创建表单中,您应注意以下顺序:
您应该更改顺序,以便首先使用DataModule:
如果您的连接位于DataModule中,则必须首先连接您的连接,然后再激活查询。连接之前无法激活查询。
如果在DataModule之前创建表单,则查询将指出没有连接,因为尚未创建数据模块连接。
您还可以在Project-> View Source中以编程方式更改创建表单的顺序。
检查以下代码。
program FDSearchInst;
uses
Vcl.Forms,
UnitMain in 'UnitMain.pas' {FormMain},
UnitDataPaths in '..\SharedFiles\UnitDataPaths.pas',
UnitDataModule in '..\SharedFiles\UnitDataModule.pas' {SharedDM: T};
{$R *.res}
begin
ReportMemoryLeaksOnShutdown := True;
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TSharedDM, SharedDM); // Will be created first
Application.CreateForm(TFormMain, FormMain); // Will be created after
Application.Run;
end.
在此代码中,您可能还会注意到我遇到的问题。 DataModule路径前面有一个注释{SharedDM: T}
,这是为DataModule分配名称的一种方式(当您访问Application-> Forms时,您将看到此名称)。
此名称SharedDM
必须与文件名UnitDataModule
不同,否则将导致冲突,并且您将无法运行项目。
为更好地解释,请检查以下代码:
正确
UnitDataModule in '..\SharedFiles\UnitDataModule.pas' {SharedDM: T};
不正确
UnitDataModule in '..\SharedFiles\UnitDataModule.pas' {UnitDataModule: T};