BSDPORTAL.RU

На этом сайте обсуждаются вопросы использования ОС FreeBSD
 Портал  •  Статьи  •  Форум  •  Wiki  •  Поиск  •  FAQ  •  Обои  •   Официальная документация  •  Новые темы 

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Perl->DBD::ODBC->unixODBC->FreeTDS->MSSQL.
СообщениеДобавлено: Ср 28 июл, 2010 6:23 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Ср 23 июл, 2008 7:38 pm
Сообщения: 199
Откуда: Москва
Всем доброго времени суток.

Что имеем:
FreeBSD 7.3 STABLE i386
perl-threaded-5.10.1_2
p5-DBI-1.61.1
freetds-msdblib-0.64_5,1
p5-DBD-mysql50-4.014
p5-DBD-Sybase-1.10_1
p5-DBD-ODBC-1.23
unixODBC-2.3.0

/usr/local/etc/freetds.conf
[testdb]
host = name.host.ru
port = 1433
client charset = UTF-8

/usr/local/etc/odbcinst.ini
[FreeTDS]
Description=FreeTDS unixODBC Driver
Driver=/usr/local/lib/libtdsodbc.so
UsageCount=1

/usr/local/etc/odbc.ini
[testdb]
Driver=FreeTDS
Description=MSSQL Server
Trace=No
Servername=testsrv
Database=Test_DB

Есть перловый скрипт, который посредством DBD::ODBC общается с базой в MSSQL и это общение происходит очень плохо, т.е. скрипт может вывалится в произвольном месте вот с подобной диагностикой:
Код:
DBD::ODBC::st DESTROY failed: [FreeTDS][SQL Server]Write to SQL Server failed. (SQL-08S01) at ./goods_cache_maker.pl line 76.
Can't call method "execute" on an undefined value at ./goods_cache_maker.pl line 76.

Вот код в этом месте скрипта:
Код:
   $mssql_sth = $mssql_dbh->prepare(qq{ select goods_id from IDX_Goods where IdxStatus = '2' });
$mssql_sth->execute;
while (my $mssql_rows = $mssql_sth->fetchrow_arrayref)
   {
   $mysql_dbh->do(qq{ delete from `IDX_Goods` where `goods_id` = '$mssql_rows->[0]' });
   }
$mssql_sth->finish;

76 строка - $mssql_sth->execute; - т.е. вывалилась на простом селекте. Ещё раз повторюсь, что валится на разных строках, но строки похожи запросами, т.е. везде селекты. В MSSQL ничего не пишу, а только из него читаю. MSSQL сервак за пределами локальной сети. Есть версия этого скрипта, где испольуется DBD::Sybase - работает прекрасно безо всяких нареканий, но к моему великому сожалению необходимо использовать DBD::ODBC.

Вот и закралась у меня мысль, что косяк с timeout-ами в unixODBC. Проштудировал документацию на unixODBC и не нашёл там того, как правильно прописать значение timeout-a dsn-у.

Господа, может кто-то сталкивался с подобной проблемой и смог её победить - подскажите как?

Заранее благодарем за помощь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Perl->DBD::ODBC->unixODBC->FreeTDS->MSSQL.
СообщениеДобавлено: Чт 29 июл, 2010 1:03 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Ср 23 июл, 2008 7:38 pm
Сообщения: 199
Откуда: Москва
Нашёл выход, но он мне не нравится, хотя всё работает. Пришлось делать так:
Код:
$mssql_dbh = DBI->connect($mssql_connect, $mssql_user, $mssql_password) or die "Cannot connect to a MSSQL-server";
$mssql_sth = $mssql_dbh->do("use Test_DB");
$mssql_sth = $mssql_dbh->prepare(qq{ select goods_id from IDX_Goods where IdxStatus = '2' });
$mssql_sth->execute;
while (my $mssql_rows = $mssql_sth->fetchrow_arrayref)
   {
   $mysql_dbh->do(qq{ delete from `IDX_Goods` where `goods_id` = '$mssql_rows->[0]' });
   }
$mssql_sth->finish;
$mssql_dbh->disconnect if ($mssql_dbh);
undef $mssql_dbh;
И так с каждым селектом из MSSQL. :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Perl->DBD::ODBC->unixODBC->FreeTDS->MSSQL.
СообщениеДобавлено: Чт 29 июл, 2010 4:24 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Ср 23 июл, 2008 7:38 pm
Сообщения: 199
Откуда: Москва
OldMan писал(а):
Нашёл выход, но он мне не нравится, хотя всё работает. Пришлось делать так:
Код:
$mssql_dbh = DBI->connect($mssql_connect, $mssql_user, $mssql_password) or die "Cannot connect to a MSSQL-server";
$mssql_sth = $mssql_dbh->do("use Test_DB");
$mssql_sth = $mssql_dbh->prepare(qq{ select goods_id from IDX_Goods where IdxStatus = '2' });
$mssql_sth->execute;
while (my $mssql_rows = $mssql_sth->fetchrow_arrayref)
   {
   $mysql_dbh->do(qq{ delete from `IDX_Goods` where `goods_id` = '$mssql_rows->[0]' });
   }
$mssql_sth->finish;
$mssql_dbh->disconnect if ($mssql_dbh);
undef $mssql_dbh;
И так с каждым селектом из MSSQL. :(


Посидел, потестировал - всё-равно вываливается:
Код:
DBD::ODBC::st execute failed: [FreeTDS][SQL Server]Read from SQL server failed. (SQL-08S01) at ./goods_cache_maker.pl line 113.
DBD::ODBC::db do failed: [FreeTDS][SQL Server]Communication link failure (SQL-08S01) at ./goods_cache_maker.pl line 150.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Perl->DBD::ODBC->unixODBC->FreeTDS->MSSQL.
СообщениеДобавлено: Чт 29 июл, 2010 6:26 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Ср 23 июл, 2008 7:38 pm
Сообщения: 199
Откуда: Москва
А оказывается вон оно как: https://rt.cpan.org/Public/Bug/Display.html?id=49061


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 4 часа


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

Зарегистрированные пользователи: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB
Яндекс.Метрика