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 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.