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 часа


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

Зарегистрированные пользователи: Bing [Bot], Google [Bot]


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

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