LINUX.ORG.RU

Не могу подружить perl и FireBird

 , ,


0

1

Что за напасть?!

Драйвер поставил, DBD::Firebird поставил.

К базе подключаюсь, запрос INSERT отрабатывает, а записи в БД нет!

Взял FlameRobin, в нем делаю тот же запрос, а записи нет в БД!

Я что-то не понимаю? Никогда до этого с FB не работал...

Помогите идеями, советами, практикой, ибо горит уже.


Ответ на: комментарий от bk_

Не вариант, ибо надо делать записи в уже работающую БД. :(

bvn13
() автор топика
Ответ на: комментарий от ukr_unix_user

если делаю

$dbh->{AutoCommit} =0;
...
$dbh->commit;
, то получаю ошибку при работе с плавающей точкой.

если автокоммит = 1 с ручным коммитом, то без ошибок и без результата.

а вот в робине сделал коммит - в селекте вылезло много записей...

bvn13
() автор топика

Эту птицу не юзал. Далека от мейнстрима. Есть несколько общих соображений.

1) Смотреть Defaults драйвера.

2) http://search.cpan.org/~timb/DBI-1.623/DBI.pm#TRACING

Всегда юзаю трассировку если что-то странно работает.

3) Уверены что на стороне базы все ОК? Может стоит через консоль/GUI програть запросы отправляемые через dbi?

outtaspace
()
Ответ на: комментарий от bk_

проверяющий запрос:

SELECT ID FROM REF_PATIENTS WHERE (TITLE = 'Каблукова Клавдия Ивановна') OR ( FAM = 'Каблукова' AND IM = 'Клавдия' AND OT = 'Ивановна');

создающий запрос:

QUERY: INSERT INTO REF_PATIENTS(ID, CODE, TITLE, FAM, IM, OT, SEX, BIRTHDAY, SNILS)  VALUES(gen_id(GEN_REF_PATIENTS_CODE, 1),'108','Каблукова Клавдия Ивановна','Каблукова','Клавдия','Ивановна','Жен.','17.03.1958','') RETURNING ID;
ID: 21909

Вот таблица: http://www.zimagez.com/zimage/-13052013-171300.php

bvn13
() автор топика
Ответ на: комментарий от outtaspace

1) да вроде из репозиториев суси ставил 2) посмотрю, спасибо 3) на мой взгляд, все ок. Эти же запросы во FlameRobin ошибок не дают.

bvn13
() автор топика
Ответ на: комментарий от bvn13

если автокоммит = 1 с ручным коммитом, то без ошибок и без результата.

масло-маслянное.

покажи

$dbh->commit or die $dbh->errstr; или весь код работы с DB.

ukr_unix_user
()
Ответ на: комментарий от no-such-file

кодировка в строке подключения:

my $dbh = DBI->connect('dbi:Firebird:db=/srv/firebird/MAINBASE.FDB;ib_charset=WIN1251', 'sysdba', 'masterkey');

перед инсертом делаю перекодировку в cp1251:

sub cnv($) {
    my $string = shift;
    return encode('cp1251', $string);
}

my $ins_q_1 = "INSERT INTO REF_PATIENTS(ID, CODE, TITLE, FAM, IM, OT, SEX, BIRTHDAY, SNILS) "
        . " VALUES("
        . "gen_id(GEN_REF_PATIENTS_CODE, 1),"
        . "'" . trim($str->[0]). "'," 
        . "'" . "$str->[2] $str->[3] $str->[4]". "'," 
        . "'" . $str->[2]. "',"
        . "'" . $str->[3]. "'," 
        . "'" . $str->[4]. "'," 
        . "'" . $sex. "',"
        . "'" . $str->[6]. "',"
        . "'" . $str->[8]. "'"
        . ")"
        . " RETURNING ID;"
;
print "QUERY: $ins_q_1\n";
my $sth_i = $dbh->prepare(cnv($ins_q_1));
$sth_i->execute or die 'ERROR!';

bvn13
() автор топика
Ответ на: комментарий от ukr_unix_user

весь скрипт: http://pastebin.com/zK3a67Zu

работа с БД идет со 120й строки

UPD.

если автокоммит = 1 с ручным коммитом, то без ошибок и без результата.


масло-маслянное.

покажи

Я имел в виду

$dbh->{AutoCommit} = 1;
#...
$dbh->commit;

в данном случае.

bvn13
() автор топика
Последнее исправление: bvn13 (всего исправлений: 1)
Ответ на: комментарий от ukr_unix_user

сделал

$dbh->{AutoCommit}=0;
#...
$sth_i->execute or die "ERROR!";
$dbh->commit or die $dbh->errstr;

Получаю ошибку:

Исключение в операции с плавающей точкой

bvn13
() автор топика
Ответ на: комментарий от OldManClone

насчет этой ошибки. Выяснил. Дату надо передавать в формате (ГГГГ-ММ-ДД, где ММ - месяц строкой, все через CAST). Все равно лезет эта ошибка с точкой.

Дальше. Запрос на добавление записи у меня с возвращаемым значением ID: INSERT ... RETURNING ID;

Если я пытаюсь в конце выполнить какой-нибудь fetch, то у меня лезет ошибка точки. Если не делаю, то не лезет. В любом из этих случаев транзакция завершается успешно!

Кто-нибудь сталкивался?

bvn13
() автор топика
Ответ на: комментарий от OldManClone

Короче эта ошибка была из-за того, что я fetch делал внутри транзакции сразу после execute. Если делать ЗА транзакцией (после коммита, то все ок).

Вроде разобрался. Всем спасибо.

bvn13
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.