MS SQL и граблы ...

ODBC

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

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

MS SQL и граблы ...

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

Привет всем, кто нашел возможным это прочитать ... ;)

Неожиданно для себя столкнулся с проблемой, там где ее не ждал.
Среда C62 ABC Win2000 MSSQL2000 (если это имеет значение).

Есть простая программка состоящая из Frame в котором запускается MDI процедура (Source) по таймеру с очень простой задачей:

- получить доступ к БД MS SQL;
- выполнить хранимую процедуру (которая добавляет запись в БД);
- полностью отключиться от БД;

Я написал что-то вроде:

Glo:MSSQL = "Server,Base,User,Password"
MSQLFile{Prop:LogonScreen} = False
Open(MSQLFile)
If ~ErrorCode()

MSQLFile{Prop:SQL} = 'CALL ....'
Close(MSQLFile)
MSQLFile{Prop:Disconnect}
end

Вот. Код интеллектом не блещет - но вроде все правильно.
И работает. Но в какой-то момент после нескольких вызовов
этот код не отключается от БД MS SQL и соответственно наотрез
отказывается к ней подключаться. После перезапуска программы
все опять некоторое время работает - потом проблема повторяется ... :(

У меня есть такое нехорошее ощущение, что я как-то вообще не правильно получаю доступ к БД MS SQL. Справку читал и пробовал разные варианты. Результат один и тот же, на разных компьютерах, серверах и сетях.

Вопрос: подскажите пожалуйста, кто имеет опыт работы из Clarion с MS SQL - как правильно выполнить эту элементарную операцию (код, последовательность операций подключения и отключения от БД) ?

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

Re: MS SQL и граблы ...

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

Игорь Столяров писал(а):Привет всем, кто нашел возможным это прочитать ... ;)

Неожиданно для себя столкнулся с проблемой, там где ее не ждал.
Среда C62 ABC Win2000 MSSQL2000 (если это имеет значение).

Есть простая программка состоящая из Frame в котором запускается MDI процедура (Source) по таймеру с очень простой задачей:

- получить доступ к БД MS SQL;
- выполнить хранимую процедуру (которая добавляет запись в БД);
- полностью отключиться от БД;

Я написал что-то вроде:

Glo:MSSQL = "Server,Base,User,Password"
MSQLFile{Prop:LogonScreen} = False
Open(MSQLFile)
If ~ErrorCode()

MSQLFile{Prop:SQL} = 'CALL ....'
Close(MSQLFile)
MSQLFile{Prop:Disconnect}
end

Вот. Код интеллектом не блещет - но вроде все правильно.
И работает. Но в какой-то момент после нескольких вызовов
этот код не отключается от БД MS SQL и соответственно наотрез
отказывается к ней подключаться. После перезапуска программы
все опять некоторое время работает - потом проблема повторяется ... :(

У меня есть такое нехорошее ощущение, что я как-то вообще не правильно получаю доступ к БД MS SQL. Справку читал и пробовал разные варианты. Результат один и тот же, на разных компьютерах, серверах и сетях.

Вопрос: подскажите пожалуйста, кто имеет опыт работы из Clarion с MS SQL - как правильно выполнить эту элементарную операцию (код, последовательность операций подключения и отключения от БД) ?

Заранее огромное спасибо ...
два варианта:

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

 до CLOSE FILE получить HDBC
  HDBC = FILE{PROP:HDBC}
 после CLOSE FILE явно закрыть соединение
  SQLFreeHandle(SQL_HANDLE_DBC,HDBC)
или

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

FILE_DESTROY надо сделать после CLOSE(FILE)

функция не продекларирована в BUILTINS.CLW, но она есть, в ClaListe её обсуждали, примерно так:

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

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

За помощь спасибо - не помогло, т.к. причина оказалась совсем в другом. Код программы делает простую вещь в цикле - запрос к MS SQL и сброс данных на E-mail. С MS SQL работал через штатный драйвер, для отправки e-mail через SMTP использовал пример Дмитрия Осипова из архива ClarionLife.NET. Т.е. что-то вроде:

Loop
MSBase{Prop:SQL} = 'CALL ...'
....
- обработка данных из запроса, криптозащита и т.д.
....
Error# = Email_QuickSend( .....
end

первый цикл проходит нормально, на втором обращение к MS SQL глухо блокируется без выдачи ошибок. Повторные переоткрытия БД и переподключения к БД (что я пытался сделать) - эффекта не дают. Только перезапуск всего приложения. После замены отправки почты на SMTP Catalyst Library - все стало работать прекрасно. Похоже какой-то конфликт с сокетами у ODBC драйвера MS SQL и функции отправки почты Email_QuickSend(). Может кому пригодиться мой печальный опыт. ;(
Ответить