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

ODBC

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

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

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

Сообщение gopstop2007 » 08 Апрель 2018, 19:33

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

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

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 не помогает :(
С уважением РА - Быть сильным не означает "никогда не падать". Быть сильным означает "ВСЕГДА СНОВА ПОДНИМАТЬСЯ!"

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3267
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

Сообщение Игорь Столяров » 09 Апрель 2018, 7:39

Привет !

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)
   
Вам помочь или не мешать ?

Ал
Ветеран
Сообщения: 704
Зарегистрирован: 08 Июль 2005, 5:48
Откуда: Зеленоград/Московская обл./Россия

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

Сообщение Ал » 09 Апрель 2018, 9:07

...посмотреть в коде где создается и как вызывается это стандартное окно...

PavelNK
Активист
Сообщения: 180
Зарегистрирован: 15 Март 2011, 8:02

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

Сообщение PavelNK » 09 Апрель 2018, 10:52

Ал писал(а):
09 Апрель 2018, 9:07
...посмотреть в коде где создается и как вызывается это стандартное окно...
оно вызывается в недрах ODBC

gopstop2007
Ветеран
Сообщения: 996
Зарегистрирован: 25 Март 2009, 21:55

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

Сообщение gopstop2007 » 09 Апрель 2018, 11:06

Игорь Столяров писал(а):
09 Апрель 2018, 7:39
ClarionHUB это конечно авторитетное издание ... но мы уже как-то обсуждали, что для проверки
соединения, лучше не делать тупо фиктивный запрос, а воспользоваться встроенными функциями ODBC.
Спасибо Игорь, проверил, действительно работает )
Но вопрос с ODBC окном остался открытым.
До этого использовал MAV, там было так реализовано viewtopic.php?f=16&t=1530&p=7013&hilit=mavconnect#p5532
С уважением РА - Быть сильным не означает "никогда не падать". Быть сильным означает "ВСЕГДА СНОВА ПОДНИМАТЬСЯ!"

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3267
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

Сообщение Игорь Столяров » 09 Апрель 2018, 11:11

gopstop2007 писал(а):
09 Апрель 2018, 11:06
Спасибо Игорь, проверил, действительно работает
Ага, причём уже лет 15 точно (пример кода скопировал из проекта 2004 г.) :idied:
Пожалуйста ! Обращайтесь ... :)
Вам помочь или не мешать ?

gopstop2007
Ветеран
Сообщения: 996
Зарегистрирован: 25 Март 2009, 21:55

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

Сообщение gopstop2007 » 09 Апрель 2018, 11:25

Игорь Столяров писал(а):
09 Апрель 2018, 11:11
Пожалуйста ! Обращайтесь ... :)
Сами напросились :D ), немного по наглею, а если дисконнект произошел в процессе работы, как не вываливаясь с программы и законнектиться повторно?
С уважением РА - Быть сильным не означает "никогда не падать". Быть сильным означает "ВСЕГДА СНОВА ПОДНИМАТЬСЯ!"

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3267
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

Сообщение Игорь Столяров » 09 Апрель 2018, 11:46

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

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

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

Я сразу уточню, что написанное выше относится именно к процедуре взаимодействия с БД.
Если Вы юзаете какие-либо самопальные шаблоны, то скорее всего это как-то там уже и так реализовано ... ;)
Вам помочь или не мешать ?

kreator
Ветеран
Сообщения: 2711
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

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

Сообщение kreator » 09 Апрель 2018, 12:31

Вот здесь тоже об этом - https://clarionhub.com/t/handling-disco ... halts/1591. Может совсем хорошо будет? И ещё я где-то читал, что народ давно уже просил SV сделать такую фишку. Вай-фай развивается, а он склонен терять коннект.
С уважением, Kreator.

Yufil
Ветеран движения
Сообщения: 965
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

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

Сообщение Yufil » 09 Апрель 2018, 14:18

Я перехватывал текстовое сообщение, благо Кларион позволяет переопределять Message. Если из текста сообщения следует, что дело дрянь - спрашивал пользователя и, при необходимости, заново перезапускал текущее приложение. В противном случае восстанавливал системный Message и просто выводил сообщение. Заодно и некоторые другие сообщения сервера (например, о нарушении Referential Integrity) приводил в более удобопонятный вид...

gopstop2007
Ветеран
Сообщения: 996
Зарегистрирован: 25 Март 2009, 21:55

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

Сообщение gopstop2007 » 09 Апрель 2018, 17:41

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
С уважением РА - Быть сильным не означает "никогда не падать". Быть сильным означает "ВСЕГДА СНОВА ПОДНИМАТЬСЯ!"

Ответить