При попытке выполнения SQL-запроса в методе FormCreate или через кнопку BitBtn возникает ошибка:
EFDEException FireDAC Comp Client -505 Connection [] must be active
Ошибка указывает на то, что соединение с базой данных не активно в момент выполнения запроса.
Анализ кода
В предоставленном коде есть несколько проблем:
Соединение с базой данных не инициализировано перед выполнением запроса
Логика работы с базой данных смешана с UI-логикой
Используется глобальная переменная VarBtnGeral для управления выполнением запроса
Решение
1. Инициализация соединения
Перед выполнением любого запроса необходимо убедиться, что соединение с базой данных активно:
procedure TTESTE.FormCreate(Sender: TObject);
begin
// Инициализация соединения
FDConnection1.Connected := True;
// Теперь можно выполнять запросы
BitBtnGeral.Click;
end;
2. Упрощение кода запроса
Для выполнения простого запроса можно использовать более компактный синтаксис FireDAC:
procedure TTESTE.Button1Click(Sender: TObject);
begin
if VarBtnGeral then
begin
FDQ1.Open('SELECT * FROM BOBINAPESADA');
end;
end;
3. Полное решение
Вот исправленная версия кода:
unit MainUnit;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, 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.IB, FireDAC.Phys.IBDef, FireDAC.VCLUI.Wait, FireDAC.Stan.Param,
FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, FireDAC.Comp.Client, Data.DB,
FireDAC.Comp.DataSet;
type
TTESTE = class(TForm)
BitBtnGeral: TBitBtn;
Button1: TButton;
FDConnection1: TFDConnection;
FDQ1: TFDQuery;
procedure BitBtnGeralClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
VarBtnGeral: Boolean;
public
{ Public declarations }
end;
var
TESTE: TTESTE;
implementation
{$R *.dfm}
procedure TTESTE.BitBtnGeralClick(Sender: TObject);
begin
BitBtnGeral.Enabled := False;
VarBtnGeral := True;
Button1.Click;
VarBtnGeral := False;
BitBtnGeral.Enabled := True;
end;
procedure TTESTE.Button1Click(Sender: TObject);
begin
if VarBtnGeral then
begin
// Убедимся, что соединение активно
if not FDConnection1.Connected then
FDConnection1.Connected := True;
// Выполним запрос
FDQ1.Open('SELECT * FROM BOBINAPESADA');
end;
end;
procedure TTESTE.FormCreate(Sender: TObject);
begin
// Инициализация соединения при создании формы
FDConnection1.Connected := True;
BitBtnGeral.Click;
end;
end.
Альтернативные решения
1. Использование параметров соединения
Лучше хранить параметры соединения в конфигурационном файле:
procedure TTESTE.FormCreate(Sender: TObject);
begin
FDConnection1.Params.LoadFromFile('dbconfig.ini');
FDConnection1.Connected := True;
end;
2. Обработка ошибок соединения
Добавьте обработку ошибок:
procedure TTESTE.FormCreate(Sender: TObject);
begin
try
FDConnection1.Connected := True;
BitBtnGeral.Click;
except
on E: Exception do
ShowMessage('Ошибка подключения к базе данных: ' + E.Message);
end;
end;
3. Разделение логики данных и интерфейса
Создайте отдельный модуль для работы с данными:
unit DataModule;
interface
uses
System.SysUtils, System.Classes, 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.IB,
FireDAC.Phys.IBDef, FireDAC.VCLUI.Wait, FireDAC.Stan.Param, FireDAC.DatS,
FireDAC.DApt.Intf, FireDAC.DApt, FireDAC.Comp.Client, FireDAC.Comp.DataSet,
Data.DB;
type
TDataModule1 = class(TDataModule)
FDConnection1: TFDConnection;
FDQ1: TFDQuery;
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure LoadBobinaData;
end;
var
DataModule1: TDataModule1;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
FDConnection1.Connected := True;
end;
procedure TDataModule1.LoadBobinaData;
begin
FDQ1.Open('SELECT * FROM BOBINAPESADA');
end;
end.
Заключение
Основная причина ошибки - попытка выполнения запроса без активного соединения с базой данных. Решение включает:
Инициализацию соединения перед выполнением запросов
Упрощение кода работы с базой данных
Добавление обработки ошибок
Разделение логики данных и интерфейса (рекомендуется)
Эти изменения сделают ваш код более надежным и удобным для поддержки.
Ошибка подключения FireDAC возникает из-за неактивного соединения с базой данных при выполнении запроса в методе FormCreate.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.