Про сервер 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))
- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
Я вставил простейший код  - в чем здесь может быть косяк ?
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)- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
Ну так совсем другое дело ... 
 Огромное спасибо !
После вставки 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)- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
Ну в общем-то да, что-то интересное уже получилось. 
Функция проверки коннекта с 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')- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
Ну прям как в бородатом анекдоте ...
Доктор осматривающий пациента приговаривает: "Хорошо, очень хорошо, Да ! Просто прекрасно, Повернитесь ! Очень хорошо ! ...."
Пациент не выдерживает и спрашивает "Доктор, что хорошо-то ?!"
Доктор отвечает: "А, хорошо, батенька - что у меня такого нет !!"
			
			
									
						Доктор осматривающий пациента приговаривает: "Хорошо, очень хорошо, Да ! Просто прекрасно, Повернитесь ! Очень хорошо ! ...."
Пациент не выдерживает и спрашивает "Доктор, что хорошо-то ?!"
Доктор отвечает: "А, хорошо, батенька - что у меня такого нет !!"
За теми, кто отстал, не возвращаться ! 
 Кодекс
			
						- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
Пробовал - реакции нет (все равно GPF).
Радикальный эффект оказывает SQLDisconnect - после него вообще обращение через драйвер к таблице невозможно ...
Сейчас система работает уже 2 часа (интервал обращений к MS SQL - 5 сек.) с "обрывами" сети через 5 мин, и перезагрузкой SQL сервера через 10 мин. Это абсолютный и недостижимый ранее рекорд. Если продержится в таком ритме до утра - пойдет на боевой сервер ...
			
			
									
						Радикальный эффект оказывает SQLDisconnect - после него вообще обращение через драйвер к таблице невозможно ...
Сейчас система работает уже 2 часа (интервал обращений к MS SQL - 5 сек.) с "обрывами" сети через 5 мин, и перезагрузкой SQL сервера через 10 мин. Это абсолютный и недостижимый ранее рекорд. Если продержится в таком ритме до утра - пойдет на боевой сервер ...
- Дед Пахом
 - Старичок
 - Сообщения: 3346
 - Зарегистрирован: 07 Июль 2005, 16:51
 - Откуда: Москва, Россия
 - Благодарил (а): 20 раз
 - Поблагодарили: 56 раз
 - Контактная информация:
 
я тут врезАлся в 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
С уважением, ДП
			
						