Проблема при отладке TIBConnection

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Проблема при отладке TIBConnection

Сообщение nic1982 » 08.02.2019 12:58:36

При отладке функции останавливается на строке
Код: Выделить всё
IBConnection.Connected:= true;

точно также ведет себя
Код: Выделить всё
IBConnection.Open

и отладка не идет дальше, при этом ошибки не выдает.

Версия ОС: Windows 10 Pro 64-bit (1709)
Версия Lazarus: 2.0.0 (до того была 1.8.4 точно такое же поведение)
Версия FPC: 3.0.4

код функции
Код: Выделить всё
uses Classes, SysUtils, IBConnection, sqldb;

function CreateDB(FileName : string) : boolean;
var
  IBConnection  : TIBConnection  ;
  IBTransaction : TSQLTransaction;
  IBScript      : TSQLScript     ;

begin

  try

    // создаем
    IBConnection := TIBConnection  .Create(nil);
    IBTransaction:= TSQLTransaction.Create(nil);
    IBScript     := TSQLScript     .Create(nil);

    // связываем
    IBConnection.DatabaseName:= FileName;
    IBConnection.CharSet     := 'UTF8';
    IBConnection.UserName    := 'SYSDBA';
    IBConnection.Password    := 'masterkey';
    IBConnection.Transaction := IBTransaction;
    IBScript.DataBase        := IBConnection;
    IBScript.Transaction     := IBTransaction;

    // подключаемся
    IBConnection.CreateDB;
    IBConnection.Open;
    IBTransaction.StartTransaction;

    IBScript.Script.Clear;

    IBScript.Script.Add('CREATE GENERATOR GEN_TABLE1_ID;');

    IBScript.Script.Add('CREATE TABLE TABLE1 (');
    IBScript.Script.Add('ID INTEGER NOT NULL,');   
    IBScript.Script.Add('FIO VARCHAR(100));');   

    IBScript.Script.Add('ALTER TABLE TABLE1 ADD PRIMARY KEY (ID);');
    IBScript.Script.Add('SET TERM ^ ;');

    IBScript.Script.Add('CREATE OR ALTER TRIGGER TABLE1_BI FOR TABLE1');
    IBScript.Script.Add('ACTIVE BEFORE INSERT POSITION 0             ');
    IBScript.Script.Add('as                                          ');
    IBScript.Script.Add('begin                                       ');
    IBScript.Script.Add('  if (new.id is null) then                  ');
    IBScript.Script.Add('    new.id = gen_id(gen_table1_id,1);       ');
    IBScript.Script.Add('end                                         ');
    IBScript.Script.Add('^                                           ');
    IBScript.Script.Add('                                            ');
    IBScript.Script.Add('SET TERM ; ^                                ');

    IBScript.Execute;
    IBTransaction.Commit;

    // отключаемся
    IBConnection.Close;

    // удалить
    IBScript.Free;
    IBTransaction.Free;
    IBConnection.Free;

    CreateDB:= true;
  except
    CreateDB:= false;
  end;

end;
nic1982
новенький
 
Сообщения: 27
Зарегистрирован: 17.05.2011 16:34:05

Re: Проблема при отладке TIBConnection

Сообщение Снег Север » 09.02.2019 06:46:45

чегой-то в TIBConnection не доработали...
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2103
Зарегистрирован: 27.11.2007 16:14:47

Re: Проблема при отладке TIBConnection

Сообщение olegy123 » 09.02.2019 08:34:25

nic1982 писал(а):и отладка не идет дальше, при этом ошибки не выдает.

IBConnection дергает функции из либлы, если из либлы ничего не вернулось и где то там заблокировалось, на уровне транзакций или файловой системы, то верхний уровень тоже будет молчать.
Транзакция не закрыта.
Может при CreateDB база открыта в монопольном режиме? чтение/запись залочена.
Или файловая система сама лочит.
olegy123
энтузиаст
 
Сообщения: 1456
Зарегистрирован: 25.02.2016 12:10:20

Re: Проблема при отладке TIBConnection

Сообщение zoltanleo » 09.02.2019 14:01:32

1. Какая строка подключения?
2. Каковы параметры транзакции?
3. Какие компоненты доступа используешь?

зы. сделай минимальный тестовый проект и выложи сюда. Приведенный тобой код на первые два вопроса ответа не дает.
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 308
Зарегистрирован: 17.10.2013 10:55:01

Re: Проблема при отладке TIBConnection

Сообщение DedFrend » 09.02.2019 16:01:53

Смутно помнится, что было что-то подобное. Если правильно помню, почему-то оказался не подключен к проекту пакет ibexpress (в dpr)
DedFrend
новенький
 
Сообщения: 34
Зарегистрирован: 25.11.2018 12:21:50

Re: Проблема при отладке TIBConnection

Сообщение nic1982 » 11.02.2019 13:12:23

zoltanleo писал(а):минимальный тестовый проект


Создаем новый проект.
На пустую форму бросаем TButton и TIBConnection.
Двойной клик по кнопке и пишем такой код.
Ставим точку прерывания на "IBConnection1.DatabaseName:= 'TEST1234.FDB';"

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin

  IBConnection1.DatabaseName:= 'TEST1234.FDB';
  IBConnection1.UserName:= 'SYSDBA';
  IBConnection1.Password:= 'masterkey';
  IBConnection1.CreateDB;

  ShowMessage('Ky');

end;


При пошаговой отладке доходим до строки "IBConnection1.CreateDB;",
после ее выполнения ошибка не выдается но и пошаговою отладку продолжить не удается.
nic1982
новенький
 
Сообщения: 27
Зарегистрирован: 17.05.2011 16:34:05

Re: Проблема при отладке TIBConnection

Сообщение mig-31 » 11.02.2019 13:22:37

А где у вас IBConnection1.HostName?

Код: Выделить всё
    FBConnection.DatabaseName := NewDBName;
    FBConnection.HostName := 'xxx';
    FBConnection.UserName := 'xxx';
    FBConnection.Password := 'xxx';
    FBConnection.CreateDB;               


Такой код у меня на CentOS7 Lazarus 1.6.4 работает. Firebird 2.5.4 на удаленном компе Mageia Linux.
mig-31
постоялец
 
Сообщения: 199
Зарегистрирован: 14.07.2011 13:46:48

Re: Проблема при отладке TIBConnection

Сообщение zoltanleo » 11.02.2019 13:40:14

nic1982 писал(а):Создаем новый проект.
На пустую форму бросаем TButton и TIBConnection.

Ясно.

Тогда еще вопросы:
1. Сервер IB/FB запущен?
2. Если запущен, то где находится клиентская библиотека gds32.dll/fbclient.dll?
3. Какой порт слушает сервер?

зы. я бы посоветовал почитать статью Д.Кузьменко по использованию компонентов IBX (для Лазаруса они есть в Online Package Manager в виде IBX2, а также в виде доработанного под FIBplus форка от *Rik*). Тогда будет легче разобраться.
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 308
Зарегистрирован: 17.10.2013 10:55:01

Re: Проблема при отладке TIBConnection

Сообщение nic1982 » 11.02.2019 14:27:03

1. Сервер запущен.
2. В системном каталоге(инсталлятор при установке), рядом с программой тоже клал.
3. Стандартный 3050.

База данных создается, только с дальнейшей отладкой проблемы.

Сейчас смотрю на "ZeosLib 7.0 Lazarus Edition".
За "IBX2" и "FIBplus" спасибо, обязательно посмотрю.
Статью "Д.Кузьменко" сейчас прочту.

Нашел в проекте "TurboBird" https://github.com/motaz/turbobird
строку с "CreateDB" (файл CreateDb.pas строка номер 71), самое интересное что у него все работает.
Только у него настройки компилятора и отладчика другие, делал как у него не помогло.

Я понимаю что можно эту проблему обойти, создав две функции:
CreateDataBase - отвечает за создание БД
CreateStructure - отвечает за структуру БД
Или использовав другую библиотеку.
Если бы не "TurboBird", я бы не парился.
Но ведь "CreateDB" в "TurboBird" работает и мне очень хочется узнать почему у него получилось а у меня нет.
Не могу понять что может произойти такого что не выдает ошибки и отладка не продолжается.
nic1982
новенький
 
Сообщения: 27
Зарегистрирован: 17.05.2011 16:34:05

Re: Проблема при отладке TIBConnection

Сообщение zoltanleo » 11.02.2019 15:32:49

nic1982 писал(а):самое интересное что у него все работает.

у всех работает. Это ты что-то не так делаешь :wink:

nic1982 писал(а):Я понимаю что можно эту проблему обойти, создав две функции:

Лучше воспользоваться готовым функционалом из перечисленных мною компонентов доступа и прочитав упомянутую мною статью

nic1982 писал(а):Не могу понять что может произойти такого что не выдает ошибки и отладка не продолжается.

заключи попытку коннекта в блок try..except
Код: Выделить всё
try
  IBConnection.Connected:= true;
except
  on E:Exception do
  begin
    IBConnection.Connected:= false;
    ShowMessage(E.Message);
  end;
end;


То же можно сделать и для CreateDB
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 308
Зарегистрирован: 17.10.2013 10:55:01

Re: Проблема при отладке TIBConnection

Сообщение nic1982 » 12.02.2019 10:07:27

Подсмотрел решение в "TurboBird".

В "Project1.lpr"
Код: Выделить всё
uses Interfaces, Forms,
  ibase60dyn, // <--- подключаем нужную библиотеку
  Unit1;
 
begin
  RequireDerivedFormResource:=True;
  Application.Scaled:=True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  InitialiseIBase60('fbclient.dll'); // <--- Инициализируем библиотеку, можно не указывать какую тогда он выберет сам
  Application.Run;
  ReleaseIBase60; // <--- Освобождаем библиотеку
end.


В "Unit1.pas" (без изменений, просто в качестве примера)
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var IBConnection1 : TIBConnection;
begin

  if FileExists(FileDB)
  then DeleteFile(FileDB);

  IBConnection1:= TIBConnection.Create(self);

  IBConnection1.DatabaseName:= 'TEST.FDB';
  IBConnection1.CharSet     := 'UTF8';
  IBConnection1.UserName    := 'SYSDBA';
  IBConnection1.Password    := 'masterkey';

  IBConnection1.CreateDB;

  ShowMessage('Yes');

end;


Всем спасибо.
nic1982
новенький
 
Сообщения: 27
Зарегистрирован: 17.05.2011 16:34:05

Re: Проблема при отладке TIBConnection

Сообщение zoltanleo » 12.02.2019 10:51:40

nic1982 писал(а):Всем спасибо.

Не за что. Все равно решил проблему своим, проктостоматологическим путем :D
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 308
Зарегистрирован: 17.10.2013 10:55:01


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 4

Рейтинг@Mail.ru
cron