Страница 1 из 1

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

Добавлено: 08 Апрель 2018, 19:33
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 не помогает :(

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)
   

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

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

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

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

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

Добавлено: 09 Апрель 2018, 11:06
gopstop2007
Игорь Столяров писал(а): 09 Апрель 2018, 7:39ClarionHUB это конечно авторитетное издание ... но мы уже как-то обсуждали, что для проверки
соединения, лучше не делать тупо фиктивный запрос, а воспользоваться встроенными функциями ODBC.
Спасибо Игорь, проверил, действительно работает )
Но вопрос с ODBC окном остался открытым.
До этого использовал MAV, там было так реализовано viewtopic.php?f=16&t=1530&p=7013&hilit=mavconnect#p5532

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

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

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

Добавлено: 09 Апрель 2018, 11:25
gopstop2007
Игорь Столяров писал(а): 09 Апрель 2018, 11:11 Пожалуйста ! Обращайтесь ... :)
Сами напросились :D ), немного по наглею, а если дисконнект произошел в процессе работы, как не вываливаясь с программы и законнектиться повторно?

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

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

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

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

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

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

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

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

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

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

Добавлено: 09 Апрель 2018, 17:41
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