ODBC Mysql проверка на соединение с БД

ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

ODBC Mysql проверка на соединение с БД

Сообщение gopstop2007 »

Проверяю соединение с сервером, если соединения нет - отключаемся по "тихому"

Код: Выделить всё

SETCURSOR(CURSOR:Wait)
SQLQuery{PROP:LogonScreen}=False     ! Any SQL based table
OPEN(SQLQuery,0)
IF ERRORCODE() OR FILEERRORCODE() THEN
    Loc:ServerStatus=Level:Fatal
    ASSERT(~ERRORCODE())
    !HALT     ! If you want to stop program execution
ELSE
    CLOSE(SQLQuery)
    Loc:ServerStatus=Level:Benign
END
SETCURSOR()

RETURN(Loc:ServerStatus)
взято https://clarionhub.com/t/sql-table-open-error/1346/13
Все работает, но если нет соединения, выскакивает стандартное окно соединения ODBC драйвера. Как его не показывать, убрать?

File{PROP:LogonScreen} = false и /LOGONSCREEN=FALSE в .dct не помогает :(
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ODBC Mysql проверка на соединение с БД

Сообщение Игорь Столяров »

Привет !

ClarionHUB это конечно авторитетное издание ... но мы уже как-то обсуждали, что для проверки
соединения, лучше не делать тупо фиктивный запрос, а воспользоваться встроенными функциями ODBC.

Что бы не искать в недрах форума, вот пример (рассчитываю на Вашу эрудицию):

Код: Выделить всё


   ! --- GlobalMap

   Module('ODBC32')

     SQLDriverConnect(LONG        hdbc,             |
                      UNSIGNED    hwnd,             |
                      *CSTRING    szConnStrIn,      |
                      SHORT       cbConnStrIn,      |
                      *CSTRING    szConnStrOut,     |
                      SHORT       cbConnStrOutMax,  |
                      *SHORT      pcbConnStrOut,    |
                      USHORT      fDriverCompletion),SHORT,RAW,PASCAL,NAME('SQLDRIVERCONNECT'),PROC!,DLL(1)

     SQLDisconnect(LONG hdbc),SHORT,RAW,PASCAL,NAME('SQLDISCONNECT'),PROC!,DLL(1)

     SQLConnect(LONG        hdbc,                   |
                *CSTRING    ServerName_,            |
                SHORT       LenServerName_,         |
                *CSTRING    UserName_,              |
                SHORT       LenUserName_,           |
                *CSTRING    Authentication_,        |
                SHORT       LenAuthentication_),SHORT,RAW,PASCAL,NAME('SQLCONNECT'),PROC!,DLL(1)

     SQLAllocHandle(SHORT HandleType,LONG InputHandle,*LONG OutputHandle),SHORT,RAW,PASCAL,NAME('SQLAllocHandle'),PROC!,DLL(1)

     SQLSetEnvAttr(LONG EnvironmentHandle,          |
           LONG Attribute, LONG Value,              |
           LONG StringLength),SHORT,RAW,PASCAL,NAME('SQLSetEnvAttr'),PROC!,DLL(1)

     SQLFreeHandle(SHORT HandleType, LONG Handle),SHORT,RAW,PASCAL,NAME('SQLFreeHandle'),PROC!,DLL(1)
   end
   
   ! --- GLOBAL DATA (ODBC)
   
SQL_HANDLE_ENV            EQUATE(1) 
SQL_HANDLE_DBC            EQUATE(2) 
SQL_NULL_HANDLE           EQUATE(0)        
SQL_DRIVER_COMPLETE_REQUIRED    EQUATE(3) 
SQL_ERROR               EQUATE(-1) 
SQL_SUCCESS             EQUATE(0) 
SQL_SUCCESS_WITH_INFO   EQUATE(1)

SQL_ATTR_ODBC_VERSION   EQUATE(200)
SQL_OV_ODBC3            EQUATE(3)
SQL_IS_INTEGER          EQUATE(-6)
   
   ! --- Проверка подключения
   
CheckSQLConnect      PROCEDURE
Loc:RetValue         BYTE                                  !
Loc:RetCode          LONG                                  !
Loc:S1               CSTRING(255)                          !
Loc:S2               CSTRING(1025)                         !
Loc:Short            SHORT                                 !
Loc:Henv             LONG                                  !
Loc:Hdbc             LONG                                  !
Loc:Window           &WINDOW                               !

  CODE
  Loc:RetValue = False   ! Предполагаем худшее

  Loc:Henv = 0
  Loc:Hdbc = 0

  ! === Allocate environment handle
  Loc:RetCode = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,Loc:Henv)

  ! === Set the ODBC version environment attribute
  Loc:RetCode = SQLSetEnvAttr(Loc:Henv,SQL_ATTR_ODBC_VERSION,SQL_OV_ODBC3,SQL_IS_INTEGER)

  ! === Allocate connection handle
  Loc:RetCode = SQLAllocHandle(SQL_HANDLE_DBC,Loc:Henv,Loc:Hdbc)

  !Loc:S1 = 'Driver={{SQL Server};Server=90.0.0.2;Database=K_B;UID=sa;PWD=1;'

  Loc:S1 = 'Driver={{SQL Server};Server=' & Clip(Left(Setup.DBServer))   & |
           ';Database='                   & Clip(Left(Setup.DBName))     & |
           ';UID='                        & Clip(Left(Setup.DBUser))     & |
           ';PWD='                        & Clip(Left(Setup.DBPassword)) & |
           ';'

  Loc:RetCode = SQLDriverConnect(Loc:Hdbc,              |
                              Loc:Window{PROP:Handle},  |
                              Loc:S1,                   |
                              Len(Loc:S1),              |
                              Loc:S2,                   |
                              1024,                     |
                              Loc:Short,                |
                              SQL_DRIVER_COMPLETE_REQUIRED)

  ! SQL сервер жив !
  If ((Loc:RetCode = SQL_SUCCESS) Or (Loc:RetCode = SQL_SUCCESS_WITH_INFO)) then Loc:RetValue = True.

  RetCode# = SQLDisconnect(Loc:Hdbc)

  If Loc:Hdbc then Loc:RetCode = SQLFreeHandle(SQL_HANDLE_DBC,Loc:Hdbc); Loc:Hdbc = 0.
  If Loc:Henv then Loc:RetCode = SQLFreeHandle(SQL_HANDLE_ENV,Loc:Henv); Loc:Henv = 0.

  Return(Loc:RetValue)
   
За теми кто отстал - не возвращаться. (С) Кодекс
Ал
✯ Ветеран ✯
Сообщения: 1011
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия

ODBC Mysql проверка на соединение с БД

Сообщение Ал »

...посмотреть в коде где создается и как вызывается это стандартное окно...
PavelNK
Старожил
Сообщения: 262
Зарегистрирован: 15 Март 2011, 8:02

ODBC Mysql проверка на соединение с БД

Сообщение PavelNK »

Ал писал(а): 09 Апрель 2018, 9:07...посмотреть в коде где создается и как вызывается это стандартное окно...
оно вызывается в недрах ODBC
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

ODBC Mysql проверка на соединение с БД

Сообщение gopstop2007 »

Игорь Столяров писал(а): 09 Апрель 2018, 7:39ClarionHUB это конечно авторитетное издание ... но мы уже как-то обсуждали, что для проверки
соединения, лучше не делать тупо фиктивный запрос, а воспользоваться встроенными функциями ODBC.
Спасибо Игорь, проверил, действительно работает )
Но вопрос с ODBC окном остался открытым.
До этого использовал MAV, там было так реализовано viewtopic.php?f=16&t=1530&p=7013&hilit=mavconnect#p5532
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ODBC Mysql проверка на соединение с БД

Сообщение Игорь Столяров »

gopstop2007 писал(а): 09 Апрель 2018, 11:06Спасибо Игорь, проверил, действительно работает
Ага, причём уже лет 15 точно (пример кода скопировал из проекта 2004 г.) :idied:
Пожалуйста ! Обращайтесь ... :)
За теми кто отстал - не возвращаться. (С) Кодекс
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

ODBC Mysql проверка на соединение с БД

Сообщение gopstop2007 »

Игорь Столяров писал(а): 09 Апрель 2018, 11:11 Пожалуйста ! Обращайтесь ... :)
Сами напросились :D ), немного по наглею, а если дисконнект произошел в процессе работы, как не вываливаясь с программы и законнектиться повторно?
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ODBC Mysql проверка на соединение с БД

Сообщение Игорь Столяров »

gopstop2007 писал(а): 09 Апрель 2018, 11:25 как не вываливаясь с программы и законнектиться повторно?
Здесь на самом деле 2 разные задачи ...

1. При разрыве соединения получим ошибку на операции, далее нужно её обработать.
Можно проверять наличие соединения перед каждой операцией (что кстати не гарантирует успешность её выполнения)
Если ошибка вызвана именно потерей соединения, что -то делаем (ожидаем подключение, выводим сообщение и т.д.)

2. Проверяем наличие подключения (см. ниже), и заново реиницилизируем коннект с БД.

Я сразу уточню, что написанное выше относится именно к процедуре взаимодействия с БД.
Если Вы юзаете какие-либо самопальные шаблоны, то скорее всего это как-то там уже и так реализовано ... ;)
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

ODBC Mysql проверка на соединение с БД

Сообщение kreator »

Вот здесь тоже об этом - https://clarionhub.com/t/handling-disco ... halts/1591. Может совсем хорошо будет? И ещё я где-то читал, что народ давно уже просил SV сделать такую фишку. Вай-фай развивается, а он склонен терять коннект.
We are hard at work… for you. :)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

ODBC Mysql проверка на соединение с БД

Сообщение Yufil »

Я перехватывал текстовое сообщение, благо Кларион позволяет переопределять Message. Если из текста сообщения следует, что дело дрянь - спрашивал пользователя и, при необходимости, заново перезапускал текущее приложение. В противном случае восстанавливал системный Message и просто выводил сообщение. Заодно и некоторые другие сообщения сервера (например, о нарушении Referential Integrity) приводил в более удобопонятный вид...
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

ODBC Mysql проверка на соединение с БД

Сообщение gopstop2007 »

kreator писал(а): 09 Апрель 2018, 12:31 Вот здесь тоже об этом - https://clarionhub.com/t/handling-disco ... halts/1591. Может совсем хорошо будет? И ещё я где-то читал, что народ давно уже просил SV сделать такую фишку. Вай-фай развивается, а он склонен терять коннект.
Только сам недавно наткнулся, использую пока только для убирания сообщений об ошибках при дисконекте, при использовании программа просто закрывается, а не вываливается куча ошибок не надо использовать ctrl+shrift+esc для убивания приложения :)
Yufil писал(а): 09 Апрель 2018, 14:18 ...заново перезапускал текущее приложение. ...
Для моего приложения - это накладно. Надо при дисконнекте перейти в локальный режим работы или продолжить коннектиться к серверу
Тут у Деда Пахома проскальзывало viewtopic.php?p=6721#p6721
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Ответить