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

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

Добавлено: 06 Май 2021, 16:23
kreator
Программа крутится на клиенте в режиме 24х7. Держит постоянную связь с сервером Firebird (вроде не по WiFi), таблицы открыты. Есть подозрение, что при спячке таблицы закрываются, может теряется коннект. Сообщений при этом нет. При выходе из спячки не находит записи по Fetch(). Проблема нестабильная. Есть ли возможность проверить таблицу на открытие? Или коннект? TryOpen()? Share()?

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

Добавлено: 06 Май 2021, 19:23
morkovin
kreator писал(а): 06 Май 2021, 16:23 Есть подозрение, что при спячке таблицы закрываются, может теряется коннект. Сообщений при этом нет.
ну так не давать серверу уснуть. Есть утилиты типа NoSleep...

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

Добавлено: 06 Май 2021, 20:00
gopstop2007
Первое на стороне сервера, если свой сервер, отключить спящий режим сетевой и остальных девайсов
Создать на сервере таблицу в которую писать время коннекта и пользователя )

Н а стороне клиента, сделать запись в в таблицу с таймингом который вы сами укажите от 1минуту и больше
У меня такое работает круглосуточно, заодно и видно когда были проблемы с коннектом

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

Добавлено: 07 Май 2021, 6:29
Игорь Столяров
Му, на самом деле, проверить наличие подключения к серверу не сложно через 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)