Простейшая консольная программа, работающая с firebird'ом

Форум для изучающих FPC и их учителей.

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

Простейшая консольная программа, работающая с firebird'ом

Сообщение dmitrydmitrydmitry » 02.03.2016 13:59:06

Немного delphi знаю, потребовалось разобраться с лазарусом. Установлены debian 8.3 и lazarus (1.2.4+dfsg2-1) из его пакетов, Free Pascal Compiler version 2.6.4+dfsg-4 [2014/10/14] for x86_64.

Погуглил пример. Нашел - http://wiki.freepascal.org/Database_bug_reporting , изменил sql запрос. Работает. Проходит несколько дней, работать перестал, пишет "Ошибка сегментирования"

текст вот:
Код: Выделить всё
program test;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}
  {$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, sysutils,
  sqldb,
  ibconnection;

var
  Conn: TibConnection; {*REPLACE WITH RELEVANT CONNECTION *}
  Tran: TSQLTransaction;
  Q: TSQLQuery;
//  t: tDatetime;

begin
//  t := time;
  Conn:=TIBConnection.create(nil); {*REPLACE WITH RELEVANT CONNECTION *}
  Tran:=TSQLTransaction.create(nil);
  Q:=TSQLQuery.Create(nil);
  try
    // *REMOVE IDENTIFYING INFO AND EDIT AS NEEDED*
    Conn.HostName:='127.0.0.1';
    Conn.UserName:='SYSDBA';
    Conn.Password:='masterkey';
    Conn.DatabaseName:='employee';
    // *END IDENTIFIYING INFO*
    Conn.Transaction:=Tran;
    Q.DataBase:=Conn;
    Conn.Open;
    // *EXAMPLE BUG TESTING CODE, REPLACE WITH YOUR OWN*
    Q.SQL.Text:='select current_timestamp as t1 from rdb$database ';
    Q.Open;
    Q.Last; //force recordcount update
    writeln(q.FieldByName('t1').AsString);
    Q.Close;
    // *END EXAMPLE BUG TESTING CODE*
  finally
    Q.Free;
    Tran.Free;
    Conn.Free;
  end;
  writeln('Program complete. Press a key to continue.');
  readln;
end.
\0


Валится на Conn.Free и до поcледнего writeln/readln не доходит. Я уже начал сомневаться в своей адекватности.
Думаю, может и раньше валилось? :shock:
dmitrydmitrydmitry
новенький
 
Сообщения: 26
Зарегистрирован: 02.03.2016 13:31:02

Re: Простейшая консольная программа, работающая с firebird'о

Сообщение vitaly_l » 02.03.2016 16:50:17

Попробуйте try Exception end; вставить в try finally и посмотрите будет ли там ошибка ?
А если закомментировать: Conn.Free - работает ?


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Простейшая консольная программа, работающая с firebird'о

Сообщение Снег Север » 02.03.2016 17:33:07

Перед Conn.Free попробуйте вызвать Conn.Close или как оно там - в общем, закрыть соединение.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Простейшая консольная программа, работающая с firebird'о

Сообщение Vadim » 05.03.2016 16:32:05

Ошибка сегментирования - это обращение программы к объекту, которого уже нет. Проверяйте, объект Conn у Вас существует на момент вызова Conn.Free...
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Простейшая консольная программа, работающая с firebird'о

Сообщение dmitrydmitrydmitry » 10.03.2016 11:22:31

Снег Север писал(а):Перед Conn.Free попробуйте вызвать Conn.Close или как оно там - в общем, закрыть соединение.


Обижаешь начальник, я компот пролил (с) Анек.
Это первое, что я сделал. Не помогло.

Но! Какая-то странная ситуация. Я сначала понять не мог, почему то работает, а то нет. Потом закономерность понял. Из под root'а работает, из под обычного пользователя - нет. Хотя я компилил ее именно из под пользователя.
dmitrydmitrydmitry
новенький
 
Сообщения: 26
Зарегистрирован: 02.03.2016 13:31:02


Вернуться в Обучение Free Pascal

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru