for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Лисоводы   всех   стран,  объединяйтесь !!!  

Список Форумов  :: Visual Foxpro, Foxpro for DOS
  

Проблема ODBC (SQLIDLEDISCONNECT)
Sandwich
Автор

Сообщений: 122
Дата: 15.09.21 18:23:52
Здравствуйте
Есть 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 и др.
Что я не так делаю?
Да. чуть не забыл: если я в этом окне руками допишу имя БД до конца (то что красным) - все продолжает нормально выполняться.



Исправлено: Sandwich, 15.09.21 18:24
Ratings: 0 negative/0 positive

Re: Проблема ODBC (SQLIDLEDISCONNECT)
AngelOKES

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

Re: Проблема ODBC (SQLIDLEDISCONNECT)
Sandwich
Автор

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

Re: Проблема ODBC (SQLIDLEDISCONNECT)
AngelOKES

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

Re: Проблема ODBC (SQLIDLEDISCONNECT)
PaulWist

Сообщений: 13795
Дата: 16.09.21 10:22:15
Что возвращает

SQLGETPROP(mySQLchserv, 'ConnectString')


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

Re: Проблема ODBC (SQLIDLEDISCONNECT)
Sandwich
Автор

Сообщений: 122
Дата: 16.09.21 10:25:20
PaulWist
Что возвращает
SQLGETPROP(mySQLchserv, 'ConnectString')
Сейчас проверю, это просто: 10 минут бездействия и попытка сохранить - в 90% случаев такое событие
Ratings: 0 negative/0 positive

Re: Проблема ODBC (SQLIDLEDISCONNECT)
Sandwich
Автор

Сообщений: 122
Дата: 16.09.21 10:38:12
PaulWist
Что возвращает
SQLGETPROP(mySQLchserv, 'ConnectString')
Потрясающе!
Функция возвращает обрезанную строку ещё до SQLIDLEDISCONNECT!
Спасибо, я не знал как сделать такую проверку, буду разбираться.
Найду - отпишусь.
Ratings: 0 negative/0 positive

Re: Проблема ODBC (SQLIDLEDISCONNECT)
Sandwich
Автор

Сообщений: 122
Дата: 16.09.21 10:58:17
Теперь вообще ничего не понимаю. Выполнение кода
  
  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

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


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

Re: Проблема ODBC (SQLIDLEDISCONNECT)
Sandwich
Автор

Сообщений: 122
Дата: 16.09.21 13:09:28
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

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

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

Re: Проблема ODBC (SQLIDLEDISCONNECT)
Igor Korolyov

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

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

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


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

Re: Проблема ODBC (SQLIDLEDISCONNECT)
Sandwich
Автор

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

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



Исправлено: Sandwich, 19.09.21 13:27
Ratings: 0 negative/0 positive

Re: Проблема ODBC (SQLIDLEDISCONNECT)
Igor Korolyov

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

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


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



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

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

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