【问题标题】:Issue with TFDQuery on a form connecting to a datamodule连接到数据模块的表单上的 TFDQuery 问题
【发布时间】:2017-10-06 08:22:56
【问题描述】:

我有一个带有连接到 SQLLite 数据库的 TFDConnection 的数据模块。

对数据模块的查询工作正常。但是,如果我在将 Active 设置为 true 时对连接到数据模块上的连接的表单进行查询,则会收到错误消息:

异常消息:[FireDAC][Comp][Clnt]-512。连接不 为 [FDQuery1] 定义。可能的原因:Connection 和 ConnectionName 属性值

这发生在设计时。

这是 Delphi Tokyo 的 Firemonkey 移动应用程序。

【问题讨论】:

  • 我知道你说这个错误发生在设计时,但是如果你在运行时打开查询之前在代码中将 dm 的 FDConnection 分配给 FDQuery 会发生什么?
  • 按 MartynA 所说的做应该行得通。无论如何,如果这也发生在运行时,是因为数据模块尚未实例化,您应该在创建表单之前在 dpr 中创建它。如果只是设计时,请检查使用列表中是否有 DM 单元,并尝试打开数据模块的 dfm。还要检查连接是否处于活动状态..

标签: delphi firemonkey firedac


【解决方案1】:

我认为这可能是在 Delphi Seattle 和 Tokyo (10.2) 之间引入的 FireDAC(或 IDE)错误。我发现我可以按如下方式重现它:

  1. Seattle 中创建一个新的多设备 (FMX) 项目。

  2. 向项目中添加一个数据模块,并向其添加一个 FDConnection。我将 FDConnection 配置为使用 MSSQL 驱动程序,将连接设置为使用操作系统身份验证、我的本地 Sql Server 和其上的现有数据库。我将 LoginPrompt 设置为 false。

  3. 我将 FDQuery1 添加到表单中,使表单使用数据模块的单元,然后将 FDQuery1 的连接设置为数据模块上的连接,并添加“select * from mytable”作为其 Sql。然后我在 OI 中将 FDQuery1.Active 设置为 true。 FDQuery1 毫无怨言地打开了。我将 FDQuery1.Active 重置为 false,保存项目并关闭它。

  4. 我关闭了西雅图,启动了东京并打开了项目。当我将 FDQuery1.Active 设置为 true 时,我得到了与您报告的完全相同的异常消息。有趣的是,OI 随后更新 FDQuery1.Active 以显示 True

  5. 然后我将 FDQuery1.Active 设置为 false,然后设置为 true,异常没有发生。

  6. 我关闭并重新启动了 Tokyo,重新打开了项目,并且第一次(但只是第一次)我将 FDQuery1.Active 设置为 true,异常再次发生。

    李>

欢迎您将上述步骤包含在给 Emba 的问题报告中。顺便说一句,我没有花任何时间调查项目的运行时行为。

猜测 - 这只是一个猜测 - IDE 中的某个地方出现了问题,当它必须创建数据模块的实例以便它的 FDConnection 可以建立打开 FDQuery1 所需的连接时,就会出现问题。如果这是正确的,它不应该影响运行时行为,但就像我说的那样,我没有对此进行调查。如果我是对的,我认为这更像是一个烦恼而不是一个大问题。

更新:这个问题似乎是 FMX 特有的。我在一个新的 Tokyo VCL 项目中重复了步骤 1-3,即使第一次将 FDQuery1.Active 设置为 true,也不会出现异常 + 错误消息。

更新#2:这个问题在运行时很容易重现。您需要做的就是从项目的表单中删除数据模块 | AutoCreate 列表,然后在运行时尝试在创建数据模块之前打开 FDQuery。显然,解决方法只是在打开 FDQuery 之前检查数据模块是否存在,如果不存在,则在代码中创建它。

顺便说一句,在实际应用程序中,我个人不会依赖 IDE 中的 TDataSet 的 Active 属性设置来打开数据集,而是始终在代码中打开它。这是我在 Delphi 早期养成的一个习惯,当时似乎经常出现数据集和数据源的设计时设置问题,这些设置引用位于另一个模块中的数据库连接或类似的东西在运行时“丢失”。

【讨论】:

    【解决方案2】:

    我在 Windows VCL 应用程序中使用 Delphi 10.3 社区版时遇到了同样的错误。即使我的 FDQuery 有一个有效的连接。

    我在 Embarcadero Delphi CE Bootcamp 2018 course Week 4 of Databases 发现问题是因为您的 DataModule 是在 您的 Form 之后创建的。

    要解决这个问题,你应该去:

    项目 --> 选项 --> 应用程序 --> 表单

    在 Autho-create 表单中,您应该注意以下顺序:

    1. Form1
    2. 数据模块1

    您应该更改顺序,以便 DataModule 排在第一位:

    1. 数据模块1
    2. Form1

    如果您的连接放置在 DataModule 中,您必须先连接您的连接,然后再激活您的查询。在连接之前无法激活您的查询。

    1. 在您的连接中连接(这可以在 DataModule 中完成);
    2. 激活查询(假设它在您的 MainForm 中)。

    如果在 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 分配名称的一种方式(当您访问应用程序 --> 表单时,您将看到此名称)。

    此名称SharedDM必须与文件名UnitDataModule不同,否则会导致冲突,您将无法运行您的项目。

    为了更好地解释,请检查以下代码:

    正确

      UnitDataModule in '..\SharedFiles\UnitDataModule.pas' {SharedDM: T};
    

    不正确

      UnitDataModule in '..\SharedFiles\UnitDataModule.pas' {UnitDataModule: T};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 2021-12-08
      • 2021-09-22
      • 1970-01-01
      相关资源
      最近更新 更多