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:设计时可视化创建组件
- 打开
databaseConnection.dfm设计界面 - 从组件面板拖入
TFDPhysMSSQLDriverLink和TFDConnection组件 - 配置
FDConnection1的连接参数(DriverName、数据库名、服务器地址、账号密码等),可勾选Connected属性实现启动时自动连接 - 配置
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;
额外注意事项
- 驱动库存在性:确保MSSQL驱动库(如
sqlncli11.dll)位于程序运行目录或系统PATH路径中 - 线程安全:Rad Server是多线程处理请求的,FireDAC默认启用连接池,可安全复用连接,但避免在单例数据模块中直接操作连接的状态(如手动断开/连接),交给连接池管理
- dfm文件检查:如果使用设计时组件,确保dfm文件未被损坏,包含组件的定义信息
内容的提问来源于stack exchange,提问作者Glen Morse
相关产品推荐
相关产品推荐

