You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi开发Rad Server遇TFDConnection未找到错误求助

问题:Delphi Rad Server 运行时抛出“TFDConnection not found”错误

在创建简易Rad Server时,我实现了一个带单例模式的数据库连接数据模块,编译正常,但调用连接时出现“TFDConnection not found”错误。

数据库连接模块代码:

unit databaseConnection;

interface

uses
  System.SysUtils, System.Classes, System.JSON,
  EMS.Services, EMS.ResourceAPI, EMS.ResourceTypes, 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.Phys.MySQL, FireDAC.Phys.MySQLDef, FireDAC.ConsoleUI.Wait,
  FireDAC.Phys.MSSQLDef, FireDAC.Phys.ODBCBase, FireDAC.Phys.MSSQL, Data.DB,
  FireDAC.Comp.Client;

type
  [ResourceName('DatabaseConnection')]
  TDatabaseConnectionResource1 = class(TDataModule)
  private
    class var FInstance: TDatabaseConnectionResource1; // Singleton instance
  public
    FDConnection1: TFDConnection;
    FDPhysMSSQLDriverLink1: TFDPhysMSSQLDriverLink;
    class function Instance: TDatabaseConnectionResource1;
    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;

  published
  end;

implementation

{%CLASSGROUP 'System.Classes.TPersistent'}

{$R *.dfm}

{ TDatabaseConnectionResource1 }

class function TDatabaseConnectionResource1.Instance: TDatabaseConnectionResource1;
begin
  if FInstance = nil then
    FInstance := TDatabaseConnectionResource1.Create(nil);
  Result := FInstance;
end;

procedure TDatabaseConnectionResource1.AfterConstruction;
begin
  inherited;
  // Initialization code if needed
end;

procedure TDatabaseConnectionResource1.BeforeDestruction;
begin
  // Clean-up code if needed
  inherited;
end;

procedure Register;
begin
  RegisterResource(TypeInfo(TDatabaseConnectionResource1));
end;

initialization
  Register;

后续模块已引用该单元:

uses ... databaseConnection;

关联查询的代码:

// Initialize query
LQuery := TFDQuery.Create(nil);
try
  LQuery.Connection := TDatabaseConnectionResource1.Instance.FDConnection1;

  // Insert new user
  LSQL := 'INSERT INTO Teams (Company, Status, admin_rank, phone) VALUES (:Company, :Status, :Admin_Rank, :Phone)';
  LQuery.SQL.Text := LSQL;
  LQuery.ParamByName('Company').AsString := LCompany;
  LQuery.ParamByName('Status').AsString := LStatus;
  LQuery.ParamByName('Admin_Rank').AsInteger := Ladminrank;
  LQuery.ParamByName('Phone').AsString := LPhone;
  LQuery.ExecSQL;

  AResponse.StatusCode := 200; // OK
  AResponse.Body.SetValue(TJSONString.Create('Team created successfully'), True);
finally
  LQuery.Free;
end;
finally
  LJSON.Free;
end
else
begin
  AResponse.RaiseBadRequest('Invalid JSON');
end;

解决方案

核心原因

你仅在数据模块的public段声明了FDConnection1和FDPhysMSSQLDriverLink1字段,但未实际创建这两个组件的实例。无论是设计时拖放还是代码手动创建,都需要确保组件对象被初始化,否则运行时它们的值为nil,导致“TFDConnection not found”错误。

具体修复步骤

方法1:设计时可视化创建组件

  1. 打开databaseConnection.dfm设计界面
  2. 从组件面板拖入TFDPhysMSSQLDriverLink和TFDConnection组件
  3. 配置FDConnection1的连接参数(DriverName、数据库名、服务器地址、账号密码等),可勾选Connected属性实现启动时自动连接
  4. 配置FDPhysMSSQLDriverLink1的VendorLib属性,指向对应版本的MSSQL驱动库(如sqlncli11.dll)

此时dfm文件会自动生成组件的创建代码,无需手动编写实例化逻辑。

方法2:代码手动实例化组件

如果需要通过代码动态创建,修改AfterConstruction方法:

procedure TDatabaseConnectionResource1.AfterConstruction;
begin
  inherited;
  // 先创建驱动链接
  FDPhysMSSQLDriverLink1 := TFDPhysMSSQLDriverLink.Create(Self);
  FDPhysMSSQLDriverLink1.VendorLib := 'sqlncli11.dll'; // 根据你的驱动版本调整

  // 创建并配置连接
  FDConnection1 := TFDConnection.Create(Self);
  FDConnection1.DriverName := 'MSSQL';
  FDConnection1.Params.Add('Database=YourDatabaseName');
  FDConnection1.Params.Add('Server=YourServerAddress');
  FDConnection1.Params.Add('User_Name=YourUsername');
  FDConnection1.Params.Add('Password=YourPassword');
  // 启用连接池(FireDAC默认启用,可根据需求调整)
  FDConnection1.Pooled := True;
  // 自动连接
  FDConnection1.Connected := True;
end;

额外注意事项

  1. 驱动库存在性:确保MSSQL驱动库(如sqlncli11.dll)位于程序运行目录或系统PATH路径中
  2. 线程安全:Rad Server是多线程处理请求的,FireDAC默认启用连接池,可安全复用连接,但避免在单例数据模块中直接操作连接的状态(如手动断开/连接),交给连接池管理
  3. dfm文件检查:如果使用设计时组件,确保dfm文件未被损坏,包含组件的定义信息

内容的提问来源于stack exchange,提问作者Glen Morse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 20:03:20