:: Visual Foxpro, Foxpro for DOS
Проблема ODBC (SQLIDLEDISCONNECT)
Sandwich
Автор

Сообщений: 137
Дата регистрации: 08.02.2014
Здравствуйте
Есть VFP-9 приложение, которое через ODBC работает с удаленным MySQL.
Используются курсорадаптеры, подключение происходит так:
mySQLchserv = SQLSTRINGCONNECT('DRIVER=MySQL ODBC 5.3 ANSI Driver;USER=cx14726_piropt;PORT=3306;PASSWORD=******;SERVER= vh386.timeweb.ru;DATABASE=cx14726_piropt;OPTION=3;STMT=SET NAMES utf8;')
cad.datasourcetype = 'ODBC'
cad.datasource = mySQLchserv
Все работает нормально, за исключением случаев потери связи с сервером. Долго терпел, и сегодня решил применить SQLIDLEDISCONNECT.
Сделал функцию для осуществления update:
LPARAMETERS lcCursor1
LOCAL updres, idle
updres = TABLEUPDATE(1,.t.,lcCursor1,cErrArr)
IF !updres
LOCAL attempt_cnt
attempt_cnt = 5
DO WHILE attempt_cnt > 0 AND !updres
idle = SQLIDLEDISCONNECT(mySQLchserv)
updres = TABLEUPDATE(1,.t.,lcCursor1,cErrArr)
attempt_cnt = attempt_cnt - 1
ENDDO
IF updres
=MESSAGEBOX('Изменения сохранены.',64)
RETURN .t.
ELSE
=MESSAGEBOX('Ошибка при сохранении таблицы '+ALLTRIM(lcCursor1),64)
RETURN .f.
ENDIF
ELSE
=MESSAGEBOX('Изменения сохранены.',64)
RETURN .t.
ENDIF
Теперь вроде как работает, но с большим НО: idle = SQLIDLEDISCONNECT(mySQLchserv) "обрезает" часть строки из SQLSTRINGCONNECT!
Получается буд-то выполняется
mySQLchserv = SQLSTRINGCONNECT('DRIVER=MySQL ODBC 5.3 ANSI Driver;USER=cx14726_piropt;PORT=3306;PASSWORD=******;SERVER= vh386.timeweb.ru;DATABASE=cx14726_pir')
и появляется такое окно как во вложении.
Если в SQLSTRINGCONNECT('...') я поменяю местами, например, DATABASE и USER, то будет "обрезан" USER. Аналогично PORT и др.
Что я не так делаю?
Да. чуть не забыл: если я в этом окне руками допишу имя БД до конца (то что красным) - все продолжает нормально выполняться.



Исправлено 1 раз(а). Последнее : Sandwich, 15.09.21 18:24
Ratings: 0 negative/0 positive
Re: Проблема ODBC (SQLIDLEDISCONNECT)
AngelOKES

Сообщений: 828
Дата регистрации: 08.02.2012
Я так понял, что если у вас не выполнился Update, то вы решаете, что дело именно в коннекте?
И если предположить что проблема именно в коннекте, то не проще ли просто проверить коннект и не использовать функцию SQLIDLEDISCONNECT ? По мне так она какая-то мутная)))
Ratings: 0 negative/0 positive
Re: Проблема ODBC (SQLIDLEDISCONNECT)
Sandwich
Автор

Сообщений: 137
Дата регистрации: 08.02.2014
Я немного (для читаемости) упростил приведенный код: перед использованием SQLIDLEDISCONNECT применяю =AERROR(). И уже в случае ошибки 1526 произвожу то, что описано.
AngelOKES
то не проще ли просто проверить коннект
Можно поподробней: как проверить и что сделать по результатам проверки?
Сразу скажу, что создавать новое соединение - не вариант, потому что на сервере установлено MAX_USER_CONNECTIONS = 10 (изменять хостер не дает). При этом используется 20 CAD(ов) на 5-7 клиентских машинах.
Ratings: 0 negative/0 positive
Re: Проблема ODBC (SQLIDLEDISCONNECT)
AngelOKES

Сообщений: 828
Дата регистрации: 08.02.2012
Sandwich
Можно поподробней: как проверить и что сделать по результатам проверки?
Да проверить-то просто, ваша переменная должна иметь числовое значение:
Sandwich
mySQLchserv
если меньше или равно 0, значит отвалился
после этого обычно делаешь новый коннект, но у вас видимо такое не прокатит, раз всего 10 подключений (либо как-то разруливать на самом сервере такие ситуации)
Ratings: 0 negative/0 positive
Re: Проблема ODBC (SQLIDLEDISCONNECT)
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
Что возвращает

SQLGETPROP(mySQLchserv, 'ConnectString')


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Проблема ODBC (SQLIDLEDISCONNECT)
Sandwich
Автор

Сообщений: 137
Дата регистрации: 08.02.2014
PaulWist
Что возвращает
SQLGETPROP(mySQLchserv, 'ConnectString')
Сейчас проверю, это просто: 10 минут бездействия и попытка сохранить - в 90% случаев такое событие
Ratings: 0 negative/0 positive
Re: Проблема ODBC (SQLIDLEDISCONNECT)
Sandwich
Автор

Сообщений: 137
Дата регистрации: 08.02.2014
PaulWist
Что возвращает
SQLGETPROP(mySQLchserv, 'ConnectString')
Потрясающе!
Функция возвращает обрезанную строку ещё до SQLIDLEDISCONNECT!
Спасибо, я не знал как сделать такую проверку, буду разбираться.
Найду - отпишусь.
Ratings: 0 negative/0 positive
Re: Проблема ODBC (SQLIDLEDISCONNECT)
Sandwich
Автор

Сообщений: 137
Дата регистрации: 08.02.2014
Теперь вообще ничего не понимаю. Выполнение кода
mySQLchserv = SQLSTRINGCONNECT('DRIVER=MySQL ODBC 5.3 ANSI Driver;USER=cx14726_piropt;PORT=3306;PASSWORD=******;SERVER= vh386.timeweb.ru;DATABASE=cx14726_piropt;OPTION=3;STMT=SET NAMES utf8;')
=MESSAGEBOX(SQLGETPROP(mySQLchserv, 'ConnectString'))
выводит
'DRIVER=MySQL ODBC 5.3 ANSI Driver;USER=cx14726_piropt;PORT=3306;PASSWORD=******;SERVER= vh386.timeweb.ru;DATABASE=cx14726_pir'
Но ведь CAD создаётся и курсор заполняется.
Ratings: 0 negative/0 positive
Re: Проблема ODBC (SQLIDLEDISCONNECT)
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
Похоже, что SQLGETPROP "криво" извлекает ConnectionString, считая двухбайтовые символы, длина возвращаемой строки 125 символов, а строка подключения 158 символов, надо резать строку подключения: юзера "резать", имя БД резать, хост IP адрес.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Проблема ODBC (SQLIDLEDISCONNECT)
Sandwich
Автор

Сообщений: 137
Дата регистрации: 08.02.2014
PaulWist
Похоже, что SQLGETPROP "криво" извлекает ConnectionString, считая двухбайтовые символы, длина возвращаемой строки 125 символов, а строка подключения 158 символов, надо резать строку подключения: юзера "резать", имя БД резать, хост IP адрес.
"Порезал" так:
PASSWORD -> PWD
USER -> UID
PORT - убрал вообще
хост -> IP адрес

Теперь "не влезает" только STMT=SET NAMES utf8;
Но все работает!
Всем спасибо!
Ratings: 0 negative/0 positive
Re: Проблема ODBC (SQLIDLEDISCONNECT)
Sawradym

Сообщений: 2244
Откуда: Винница
Дата регистрации: 15.05.2007
Sandwich
Я немного (для читаемости) упростил приведенный код: перед использованием SQLIDLEDISCONNECT применяю =AERROR(). И уже в случае ошибки 1526 произвожу то, что описано.
AngelOKES
то не проще ли просто проверить коннект
Можно поподробней: как проверить и что сделать по результатам проверки?
Сразу скажу, что создавать новое соединение - не вариант, потому что на сервере установлено MAX_USER_CONNECTIONS = 10 (изменять хостер не дает). При этом используется 20 CAD(ов) на 5-7 клиентских машинах.

Тогда сам бог велел использовать шаред соединения. У SQLSTRINGCONNECT есть еще параметры. Почитайте и будет у вас одно внешнее соединение на все кады.
Ratings: 0 negative/0 positive
Re: Проблема ODBC (SQLIDLEDISCONNECT)
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Похоже на проблему с драйвером - какая версия используется? Если крайняя в линейке (5.3.14) и проблема всё ещё имеется, то можно попробовать перейти на линейку 8.0.*

Вообще при использовании курсорадаптеров и подобном "ручном" вызове сохранения можно вместо "автоматического" SQLIDLEDISCONNECT() вручную пересоздавать коннекцию и прописывать её в курсорадаптер (тогда и строка подключения будет использоваться полная, та что нужна). Для проверки того что коннекция живая можно послать какую-нить примитивную команду типа 'SELECT 123'.

Sawradym
Тогда сам бог велел использовать шаред соединения.
Это да, но к описываемой проблеме это не имеет отношения. И управлять переподключением в случае shared соединения будет несколько сложнее - впрочем в любом случае стоит это (управление соединениями) не распихивать по прикладным формам/классам/отчётам/процедурам, а выделить в специальный класс-менеджер, и далее уже пользоваться им.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Проблема ODBC (SQLIDLEDISCONNECT)
Sandwich
Автор

Сообщений: 137
Дата регистрации: 08.02.2014
Igor Korolyov
Если крайняя в линейке (5.3.14) и проблема всё ещё имеется, то можно попробовать перейти на линейку 8.0.*
Сейчас 5.3.04, попробую обновить
Igor Korolyov
вручную пересоздавать коннекцию и прописывать её в курсорадаптер
я думал об этом, но как быть с остальными CAD-ми? При обработке ошибки у всех переписать ?

Да, кстати, а как обновить отдельный драйвер? Через обновление самого ODBC?



Исправлено 1 раз(а). Последнее : Sandwich, 19.09.21 13:27
Ratings: 0 negative/0 positive
Re: Проблема ODBC (SQLIDLEDISCONNECT)
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Если не используются разделяемые соединения, то все CAD независимы друг от друга, значит просто ловить ошибки и переподключаться при работе с каждым из них в отдельности. Если использовать общее разделяемое соединение - то запилить какой-то класс-менеджер держащий это самое соединение, вероятно, он же может проверять живое оно или нет и восстанавливать, если необходимо. CAD же перед любым использованием будет просто брать хэндл из этого менеджера. Да, пока CAD не используется, он может иметь невалидный хэндл у себя в настройках, но это не важно, т.к. он не используется. Как только нужно поработать - получаем корректный (проверенный) хэндл и работаем.

Sandwich
а как обновить отдельный драйвер?
Просто переустановить, полагаю. Если там инсталлятор "не очень", то сначала деинсталлировать старый, зачистить реестр от остатков и накатить новый.


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 11 (Гостей: 11)

© 2000-2024 Fox Club 
Яндекс.Метрика