Страница 2 из 3

Добавлено: 21 Июнь 2006, 11:33
Дед Пахом
ага, верно.

Добавлено: 21 Июнь 2006, 11:37
Andrew™
Игорь Столяров писал(а):Видимо я совсем темный ... После первого вызова:

SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, SELF.henv)

в SELF.henv - будет адрес, а для второго вызова:

SQLAllocHandle(SQL_HANDLE_DBC, SELF.henv, SELF.hdbc)

Нужно вторым значением передавать не сам адрес переменной, а значение по этому адресу ... Или я не прав ?

Первый вызов отрабатывает нормально, а со второй возвращает ошибку - насколько я смог понять из-за описанной причины ... :(
чего это ты мудришь

второй параметр передаётся по значению, третий OUTPUT по адресу

и тот кусок, который я приводил выкушен из работающей либы

Добавлено: 21 Июнь 2006, 11:39
Andrew™
Дед Пахом писал(а):Есть такие (и много других) ODBC API-свойства:
PROP:hdbc
PROP:hstmt
PROP:henv

так что вызывай сразу

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

SELF.retCode = SQLDriverConnect(myfile{prop:hdbc},class_W{PROP:Handle},SELF.ConnectString.S,| 
        SELF.ConnectString.Pos,SELF.szOutConn, | 
    255, SELF.cbOutConn, CHOOSE(NOT DefaultLogon,0,SQL_DRIVER_COMPLETE_REQUIRED))
не, так не покатит, это получается - проверить соединение после открытия файла, эти PROP'ы доступны именно после установки соединения - т е после открытия файла

Добавлено: 21 Июнь 2006, 11:43
Игорь Столяров
Я вставил простейший код - в чем здесь может быть косяк ?

Loc:L1 Long
Loc:L2 Long

Code

! === Allocate environment handle
RetCode1# = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, Loc:L1)
Message(RetCode1#) ! SQL_SUCCESS = 0

! === Allocate connection handle
RetCode2# = SQLAllocHandle(SQL_HANDLE_DBC, Loc:L1, Loc:L2)
Message(RetCode2#) ! SQL_ERROR = -1

Добавлено: 21 Июнь 2006, 11:52
Andrew™
Игорь Столяров писал(а):Я вставил простейший код - в чем здесь может быть косяк ?

Loc:L1 Long
Loc:L2 Long

Code

! === Allocate environment handle
RetCode1# = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, Loc:L1)
Message(RetCode1#) ! SQL_SUCCESS = 0

! === Allocate connection handle
RetCode2# = SQLAllocHandle(SQL_HANDLE_DBC, Loc:L1, Loc:L2)
Message(RetCode2#) ! SQL_ERROR = -1
включи чисто ODBC трассу (odbcad32.exe) и глянь что там за мессага об ошибке, по идее код правильный, правда между двумя этими вызовами я ещё вызываю:

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

 ! === Set the ODBC version environment attribute
 SELF.retcode = SQLSetEnvAttr(SELF.henv, SQL_ATTR_ODBC_VERSION,SQL_OV_ODBC3,SQL_IS_INTEGER)

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

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

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

SQL_ATTR_ODBC_VERSION                           EQUATE(200)
SQL_OV_ODBC3                                            EQUATE(3)
SQL_IS_INTEGER                                                  EQUATE(-6)

Добавлено: 21 Июнь 2006, 12:27
Игорь Столяров
Ну так совсем другое дело ... :) Огромное спасибо !

После вставки SQLSetEnvAttr ... все заработало как часы !
Теперь буду пробовать встроить это в боевую программу и попробую отловить момент обрыва подключения к серверу ...

Единственное, что смущает:
- для SQLDriverConnect есть SQLDisconnect
- а для SQLAllocHandle уже не нужно сбрасывать запрошенное выделение ресурсов ?

Добавлено: 21 Июнь 2006, 12:30
Andrew™
Игорь Столяров писал(а):Ну так совсем другое дело ... :) Огромное спасибо !

После вставки SQLSetEnvAttr ... все заработало как часы !
Теперь буду пробовать встроить это в боевую программу и попробую отловить момент обрыва подключения к серверу ...

Единственное, что смущает:
- для SQLDriverConnect есть SQLDisconnect
- а для SQLAllocHandle уже не нужно сбрасывать запрошенное выделение ресурсов ?
это на тему скалероза, конечно надо, я то один раз в библе реализовал и забыл

после SQLDisconnect

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

  IF SELF.hdbc
   SQLFreeHandle(SQL_HANDLE_DBC,SELF.hdbc)
   SELF.hdbc = 0
  END

 IF SELF.henv
  SQLFreeHandle(SQL_HANDLE_ENV,SELF.henv)
  SELF.henv = 0
 END

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

    SQLFreeHandle(SHORT HandleType, LONG Handle),SHORT,RAW,PASCAL,NAME('SQLFreeHandle'),PROC!,DLL(1)

Добавлено: 21 Июнь 2006, 14:33
Игорь Столяров
Ну в общем-то да, что-то интересное уже получилось. :)

Функция проверки коннекта с MS SQL через ODBC (еще раз огромное спасибо за помощь !) работает прекрасно и неубиенно.

Но к сожалению, обращение к MS SQL даже после восстановления подключения все-равно вызывает GPF.

Решил следующим образом - по ODBC определяю потерю подключения к серверу и после его восстановления - рестартую программу через CHAIN. Вроде, в таком варианте, пока все OK .... ;) !

Добавлено: 21 Июнь 2006, 14:57
Andrew™
Игорь Столяров писал(а):Ну в общем-то да, что-то интересное уже получилось. :)

Функция проверки коннекта с MS SQL через ODBC (еще раз огромное спасибо за помощь !) работает прекрасно и неубиенно.

Но к сожалению, обращение к MS SQL даже после восстановления подключения все-равно вызывает GPF.

Решил следующим образом - по ODBC определяю потерю подключения к серверу и после его восстановления - рестартую программу через CHAIN. Вроде, в таком варианте, пока все OK .... ;) !
кажись я догадываюсь от куда ветер дует

после закрытия файлов надо временные ихние буфера прибить

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

     FILE_DESTROY(FILE),NAME('Cla$FILE_DESTROY')

Добавлено: 21 Июнь 2006, 15:03
Игорь Столяров
Пробовал и неоднократно - все равно GPF :(
Проблему решает только полный рестарт ...

Добавлено: 21 Июнь 2006, 15:09
Andrew™
Игорь Столяров писал(а):Пробовал и неоднократно - все равно GPF :(
Проблему решает только полный рестарт ...
FILE,DRIVER есть FILE,DRIVER, как хорошо, что у меня таких проблем уже давно не наблюдается ;)

Добавлено: 21 Июнь 2006, 15:45
Игорь Столяров
Ну прям как в бородатом анекдоте ...

Доктор осматривающий пациента приговаривает: "Хорошо, очень хорошо, Да ! Просто прекрасно, Повернитесь ! Очень хорошо ! ...."

Пациент не выдерживает и спрашивает "Доктор, что хорошо-то ?!"

Доктор отвечает: "А, хорошо, батенька - что у меня такого нет !!" :)

Добавлено: 21 Июнь 2006, 16:26
Andrew™
Игорь Столяров писал(а):Пробовал и неоднократно - все равно GPF :(
Проблему решает только полный рестарт ...
а может надо SqlFreeHandle натравить после CLOSE File

на PROP:Hdbc и на PROP:henv по образу и подобию как я уже писал

Добавлено: 21 Июнь 2006, 16:44
Игорь Столяров
Пробовал - реакции нет (все равно GPF).
Радикальный эффект оказывает SQLDisconnect - после него вообще обращение через драйвер к таблице невозможно ... ;)

Сейчас система работает уже 2 часа (интервал обращений к MS SQL - 5 сек.) с "обрывами" сети через 5 мин, и перезагрузкой SQL сервера через 10 мин. Это абсолютный и недостижимый ранее рекорд. Если продержится в таком ритме до утра - пойдет на боевой сервер ... :)

Добавлено: 21 Июнь 2006, 17:06
Дед Пахом
я тут врезАлся в ABC-шаблоны с целью восстановления подключения при обрыве. В 6.2 примерно такой код успешно справлялся с задачей (т.е. он после disconnect пытался переоткрыть файл, и ему это ВСЕГДА удавалось, если сервер оживал)

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

  IF SELF.Me.File{prop:sqldriver}
    !prop:disconnect работает ТОЛЬКО при закрытом файле
    LOOP WHILE SELF.Me.IsOpened()
      Opened+=1
      SELF.Me.Close()
    END

    SELF.Me.File{prop:disconnect}

    LOOP WHILE SELF.Me.TryOpen() <> Level:Benign
      OpenTries+=1
      IF OpenTries >= 10
        RETURN Level:User
      END
    END
    LOOP Opened-1 TIMES
      SELF.Me.Open()
      SELF.Me.UseFile()
    END
  END