Проверка на открытие файла.

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
kreator
✯ Ветеран ✯
Сообщения: 4170
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Проверка на открытие файла.

Сообщение kreator »

Программа крутится на клиенте в режиме 24х7. Держит постоянную связь с сервером Firebird (вроде не по WiFi), таблицы открыты. Есть подозрение, что при спячке таблицы закрываются, может теряется коннект. Сообщений при этом нет. При выходе из спячки не находит записи по Fetch(). Проблема нестабильная. Есть ли возможность проверить таблицу на открытие? Или коннект? TryOpen()? Share()?
We are hard at work… for you. :)
Аватара пользователя
morkovin
Ветеран
Сообщения: 872
Зарегистрирован: 20 Июль 2005, 13:53
Откуда: Volgograd, Russia
Контактная информация:

Проверка на открытие файла.

Сообщение morkovin »

kreator писал(а): 06 Май 2021, 16:23 Есть подозрение, что при спячке таблицы закрываются, может теряется коннект. Сообщений при этом нет.
ну так не давать серверу уснуть. Есть утилиты типа NoSleep...
WBR, morkovin
gopstop2007
✯ Ветеран ✯
Сообщения: 1557
Зарегистрирован: 25 Март 2009, 21:55

Проверка на открытие файла.

Сообщение gopstop2007 »

Первое на стороне сервера, если свой сервер, отключить спящий режим сетевой и остальных девайсов
Создать на сервере таблицу в которую писать время коннекта и пользователя )

Н а стороне клиента, сделать запись в в таблицу с таймингом который вы сами укажите от 1минуту и больше
У меня такое работает круглосуточно, заодно и видно когда были проблемы с коннектом
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5309
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

Проверка на открытие файла.

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

Му, на самом деле, проверить наличие подключения к серверу не сложно через ODBC.
А вот, отвечать на вечные вопросы: кто виноват и что делать - нужно уже по обстановке.

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

! --- 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)

   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

CheckSQLConnect      PROCEDURE(),byte
Loc:RetValue         BYTE(False)   ! Предполагаем худшее
Loc:RetCode          LONG                                  !
Loc:S1               CSTRING(255)                          !
Loc:S2               CSTRING(1025)                         !
Loc:Short            SHORT                                 !
Loc:Henv             LONG(0)
Loc:Hdbc             LONG(0)
Loc:Window           &WINDOW                               !

  CODE
 
  ! === 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)
«V» значит Вендетта !
Ответить