Про сервер MS SQL - которого нет ...
Модератор: Andrew™
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
чего это ты мудришьИгорь Столяров писал(а):Видимо я совсем темный ... После первого вызова:
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, SELF.henv)
в SELF.henv - будет адрес, а для второго вызова:
SQLAllocHandle(SQL_HANDLE_DBC, SELF.henv, SELF.hdbc)
Нужно вторым значением передавать не сам адрес переменной, а значение по этому адресу ... Или я не прав ?
Первый вызов отрабатывает нормально, а со второй возвращает ошибку - насколько я смог понять из-за описанной причины ...
второй параметр передаётся по значению, третий OUTPUT по адресу
и тот кусок, который я приводил выкушен из работающей либы
не, так не покатит, это получается - проверить соединение после открытия файла, эти PROP'ы доступны именно после установки соединения - т е после открытия файлаДед Пахом писал(а):Есть такие (и много других) 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))
- Игорь Столяров
- Ветеран движения
- Сообщения: 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
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) и глянь что там за мессага об ошибке, по идее код правильный, правда между двумя этими вызовами я ещё вызываю:Игорь Столяров писал(а):Я вставил простейший код - в чем здесь может быть косяк ?
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
Код: Выделить всё
! === 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 уже не нужно сбрасывать запрошенное выделение ресурсов ?
После вставки SQLSetEnvAttr ... все заработало как часы !
Теперь буду пробовать встроить это в боевую программу и попробую отловить момент обрыва подключения к серверу ...
Единственное, что смущает:
- для SQLDriverConnect есть SQLDisconnect
- а для SQLAllocHandle уже не нужно сбрасывать запрошенное выделение ресурсов ?
это на тему скалероза, конечно надо, я то один раз в библе реализовал и забылИгорь Столяров писал(а):Ну так совсем другое дело ... Огромное спасибо !
После вставки 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 .... !
Функция проверки коннекта с MS SQL через ODBC (еще раз огромное спасибо за помощь !) работает прекрасно и неубиенно.
Но к сожалению, обращение к MS SQL даже после восстановления подключения все-равно вызывает GPF.
Решил следующим образом - по ODBC определяю потерю подключения к серверу и после его восстановления - рестартую программу через CHAIN. Вроде, в таком варианте, пока все OK .... !
кажись я догадываюсь от куда ветер дуетИгорь Столяров писал(а):Ну в общем-то да, что-то интересное уже получилось.
Функция проверки коннекта с MS SQL через ODBC (еще раз огромное спасибо за помощь !) работает прекрасно и неубиенно.
Но к сожалению, обращение к MS SQL даже после восстановления подключения все-равно вызывает GPF.
Решил следующим образом - по ODBC определяю потерю подключения к серверу и после его восстановления - рестартую программу через CHAIN. Вроде, в таком варианте, пока все OK .... !
после закрытия файлов надо временные ихние буфера прибить
Код: Выделить всё
FILE_DESTROY(FILE),NAME('Cla$FILE_DESTROY')
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Ну прям как в бородатом анекдоте ...
Доктор осматривающий пациента приговаривает: "Хорошо, очень хорошо, Да ! Просто прекрасно, Повернитесь ! Очень хорошо ! ...."
Пациент не выдерживает и спрашивает "Доктор, что хорошо-то ?!"
Доктор отвечает: "А, хорошо, батенька - что у меня такого нет !!"
Доктор осматривающий пациента приговаривает: "Хорошо, очень хорошо, Да ! Просто прекрасно, Повернитесь ! Очень хорошо ! ...."
Пациент не выдерживает и спрашивает "Доктор, что хорошо-то ?!"
Доктор отвечает: "А, хорошо, батенька - что у меня такого нет !!"
За теми кто отстал - не возвращаться. (С) Кодекс
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Пробовал - реакции нет (все равно GPF).
Радикальный эффект оказывает SQLDisconnect - после него вообще обращение через драйвер к таблице невозможно ...
Сейчас система работает уже 2 часа (интервал обращений к MS SQL - 5 сек.) с "обрывами" сети через 5 мин, и перезагрузкой SQL сервера через 10 мин. Это абсолютный и недостижимый ранее рекорд. Если продержится в таком ритме до утра - пойдет на боевой сервер ...
Радикальный эффект оказывает 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
С уважением, ДП