Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Ошибка подключения FireDAC при запуске запроса из FormCreate

Delphi , Базы данных , Ошибки БД

 

Проблема

При попытке выполнения SQL-запроса в методе FormCreate или через кнопку BitBtn возникает ошибка:

EFDEException FireDAC Comp Client -505 Connection [] must be active

Ошибка указывает на то, что соединение с базой данных не активно в момент выполнения запроса.

Анализ кода

В предоставленном коде есть несколько проблем:

  1. Соединение с базой данных не инициализировано перед выполнением запроса
  2. Логика работы с базой данных смешана с UI-логикой
  3. Используется глобальная переменная 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.

Заключение

Основная причина ошибки - попытка выполнения запроса без активного соединения с базой данных. Решение включает:

  1. Инициализацию соединения перед выполнением запросов
  2. Упрощение кода работы с базой данных
  3. Добавление обработки ошибок
  4. Разделение логики данных и интерфейса (рекомендуется)

Эти изменения сделают ваш код более надежным и удобным для поддержки.

Создано по материалам из источника по ссылке.

Ошибка подключения FireDAC возникает из-за неактивного соединения с базой данных при выполнении запроса в методе FormCreate.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Ошибки БД ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 10:21:14/0.003715991973877/0