Про сервер MS SQL - которого нет ...

ODBC

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Сообщение Дед Пахом »

ага, верно.
С уважением, ДП
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

Игорь Столяров писал(а):Видимо я совсем темный ... После первого вызова:

SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, SELF.henv)

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

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

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

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

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

и тот кусок, который я приводил выкушен из работающей либы
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение 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'ы доступны именно после установки соединения - т е после открытия файла
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Я вставил простейший код - в чем здесь может быть косяк ?

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
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение 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)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Ну так совсем другое дело ... :) Огромное спасибо !

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

Единственное, что смущает:
- для SQLDriverConnect есть SQLDisconnect
- а для SQLAllocHandle уже не нужно сбрасывать запрошенное выделение ресурсов ?
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение 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)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Ну в общем-то да, что-то интересное уже получилось. :)

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

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

Решил следующим образом - по ODBC определяю потерю подключения к серверу и после его восстановления - рестартую программу через CHAIN. Вроде, в таком варианте, пока все OK .... ;) !
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

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

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

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

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

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

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

     FILE_DESTROY(FILE),NAME('Cla$FILE_DESTROY')
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Пробовал и неоднократно - все равно GPF :(
Проблему решает только полный рестарт ...
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

Игорь Столяров писал(а):Пробовал и неоднократно - все равно GPF :(
Проблему решает только полный рестарт ...
FILE,DRIVER есть FILE,DRIVER, как хорошо, что у меня таких проблем уже давно не наблюдается ;)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Ну прям как в бородатом анекдоте ...

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

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

Доктор отвечает: "А, хорошо, батенька - что у меня такого нет !!" :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

Игорь Столяров писал(а):Пробовал и неоднократно - все равно GPF :(
Проблему решает только полный рестарт ...
а может надо SqlFreeHandle натравить после CLOSE File

на PROP:Hdbc и на PROP:henv по образу и подобию как я уже писал
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Пробовал - реакции нет (все равно GPF).
Радикальный эффект оказывает SQLDisconnect - после него вообще обращение через драйвер к таблице невозможно ... ;)

Сейчас система работает уже 2 часа (интервал обращений к MS SQL - 5 сек.) с "обрывами" сети через 5 мин, и перезагрузкой SQL сервера через 10 мин. Это абсолютный и недостижимый ранее рекорд. Если продержится в таком ритме до утра - пойдет на боевой сервер ... :)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Сообщение Дед Пахом »

я тут врезАлся в 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
С уважением, ДП
Ответить