Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Ошибки (число прочтений - 11322 )
nobucks
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 9
Зарегистрирован: 17. Октября 2006
Ошибки
02. Ноября 2006 :: 12:58
Печать  
Юзаю 1С++ v2.0.3.1.
Есть две переменные БД и РекСет объявленные в глобальном модуле, которые инициализируются при вызове внешней обработки
Код
Выбрать все
	Попытка
		БД.ЕстьСоединение();
	Исключение
		БД=СоздатьОбъект("ODBCDatabase");
		РекСет=СоздатьОбъект("ODBCRecordSet");
		  РекСет.УстБД(БД);
	КонецПопытки; 



При первом запуске все нормально соединяется и отрабатывает, далее соединение закрывается
Код
Выбрать все
	БД.Закрыть(); 



При повторном вызове нормально соединяется, но при попытке выполнить
Код
Выбрать все
РекСет.Выполнить(Текст); 


вываливается Access Violation .... read of adress 0x00000018

Замена dll на версию 1.8.1.6 приводит к появлению ошибок типа

РекСет.УдалитьПараметры();
{...}: Нет обработчика метода под номером: 10)

посоветуйте плз как заставить все работать?
  
Наверх
 
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибки
Ответ #1 - 02. Ноября 2006 :: 14:44
Печать  
ну мне кажется при закрытии содениния, если тебе нужно опять сделать выборку, его нужно открыть, а не проверять есть ли соединение...
или ты не совсем понимаешь что делает метод ЕстьСоединение()?
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
nobucks
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 9
Зарегистрирован: 17. Октября 2006
Re: Ошибки
Ответ #2 - 03. Ноября 2006 :: 08:21
Печать  
Цитата:
ну мне кажется при закрытии содениния, если тебе нужно опять сделать выборку, его нужно открыть, а не проверять есть ли соединение...
или ты не совсем понимаешь что делает метод ЕстьСоединение()?

Так я проверяю существует ли объект ODBCDatabase в переменной БД, т.к. она только объявлена в ГМ а инициализация ее происходит при открытии формы внешней обработки (это не суть важно), думаю не тут грабли а в неправильной работе класса ODBCRecordSet при работе с установленной в нем базе (ODBCDatabase), т.е. после закрытия и открытия соединения дальнейшие попытки что-либо выполнить приводят к ошибке. так же неполучилось у меня разрушить элемент ODBCRecordSet путем РекСет="", тот же Access Violation...
Нашел обходной путь, перенес объявление переменной РекСет в форму, все работает как надо и сволько угодно раз. Но ради интереса хочется узнать мнение грамотного народа - это у меня руки кривые или дело в 1с++? Сталкивался кто-нить с похожими проблемами? Почему замена длл на более раннюю версию приводит к появлению ошибок, может это связано с регистрацией компоненты в винде?
  
Наверх
 
IP записан
 
nvg
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 72
Местоположение: Киев
Зарегистрирован: 14. Сентября 2006
Пол: Мужской
Re: Ошибки
Ответ #3 - 03. Ноября 2006 :: 09:36
Печать  
Сталкивался с подобной ситуацией.
Писал отдельный класс-обертку для класса ODBCRecordSet (для доступа к сторонней БД).
Версия 1С++ 2.0.3.1. При попытке закрыть соединение объекта ODBCDatabase 1с падала.
РекСет=0 перед БД.Закрыть() - и 1с перестала падать.
  
Наверх
ICQ  
IP записан
 
DionX
Senior Member
****
Отсутствует



Сообщений: 373
Местоположение: Кемерово
Зарегистрирован: 22. Августа 2006
Пол: Мужской
Re: Ошибки
Ответ #4 - 07. Ноября 2006 :: 02:43
Печать  
nobucks писал(а) 02. Ноября 2006 :: 12:58:
Юзаю 1С++ v2.0.3.1.
Есть две переменные БД и РекСет объявленные в глобальном модуле, которые инициализируются при вызове внешней обработки
Код
Выбрать все
	Попытка
		БД.ЕстьСоединение();
	Исключение
		БД=СоздатьОбъект("ODBCDatabase");
		РекСет=СоздатьОбъект("ODBCRecordSet");
		  РекСет.УстБД(БД);
	КонецПопытки; 



При первом запуске все нормально соединяется и отрабатывает, далее соединение закрывается
Код
Выбрать все
	БД.Закрыть(); 



При повторном вызове нормально соединяется, но при попытке выполнить
Код
Выбрать все
РекСет.Выполнить(Текст); 


вываливается Access Violation .... read of adress 0x00000018


БД.ЕстьСоединение() - функция, кот. возвращает 1, если соед. есть, 0 - если нет. При вервом запуске переменная БД=ПустоеЗначение(), при попытке запросить ЕстьСоединение() у БД возникает ошибка, а следовательно срабатывает описанная тобой исключительная ситуация, т.е. создается объект ODBCDatabase и ссылка на него в переменной БД, а также объект ODBCRecordSet и открывается соединение.
Потом, ты, выполнив ряд волшебных манипуляций закрываешь объект ODBCDatabase. Понимаешь? Закрываешь, но не уничтожаешь, т.е. в переменной БД по прежнему ссылка на сущь. объект ODBCDatabase, а при следующей обработки кода:
Код
Выбрать все
	Попытка
		БД.ЕстьСоединение();
	Исключение
		БД=СоздатьОбъект("ODBCDatabase");
		РекСет=СоздатьОбъект("ODBCRecordSet");
		  РекСет.УстБД(БД);
	КонецПопытки; 


Исключения не возникает, на момент выполнения команды РекСет.Выполнить(Текст) объект ODBCDatabase закрыт, что и приводит к ошибке.
  
Наверх
ICQ  
IP записан
 
DionX
Senior Member
****
Отсутствует



Сообщений: 373
Местоположение: Кемерово
Зарегистрирован: 22. Августа 2006
Пол: Мужской
Re: Ошибки
Ответ #5 - 07. Ноября 2006 :: 02:46
Печать  
nobucks писал(а) 03. Ноября 2006 :: 08:21:
думаю не тут грабли а в неправильной работе класса ODBCRecordSet при работе с установленной в нем базе (ODBCDatabase), т.е. после закрытия и открытия соединения дальнейшие попытки что-либо выполнить приводят к ошибке

а где у тебя происходит именно "закрытие и открытие соединения"? Я имеюю ввиду в случае повторного открытия обработки, когда в глобальной переменной БД уже "сидит" ODBCDatabase?
  
Наверх
ICQ  
IP записан
 
DionX
Senior Member
****
Отсутствует



Сообщений: 373
Местоположение: Кемерово
Зарегистрирован: 22. Августа 2006
Пол: Мужской
Re: Ошибки
Ответ #6 - 07. Ноября 2006 :: 02:51
Печать  
Код
Выбрать все
Попытка
Если БД.ЕстьСоединение()=0 Тогда
//открыть  БД
КонецЕсли;
Исключение
БД=СоздатьОбъект("ODBCDatabase");
РекСет=СоздатьОбъект("ODBCRecordSet");
  РекСет.УстБД(БД);
КонецПопытки;  

  
Наверх
ICQ  
IP записан
 
nobucks
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 9
Зарегистрирован: 17. Октября 2006
Re: Ошибки
Ответ #7 - 07. Ноября 2006 :: 08:31
Печать  
DionX писал(а) 07. Ноября 2006 :: 02:46:
а где у тебя происходит именно "закрытие и открытие соединения"? Я имеюю ввиду в случае повторного открытия обработки, когда в глобальной переменной БД уже "сидит" ODBCDatabase?


Закрытие и открытие происходит в другой функции внешней обработки, я не стал приводить ее код, после закрытия при повторном открытии открывается соединение, там все в порядке.
  
Наверх
 
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Ошибки
Ответ #8 - 07. Ноября 2006 :: 08:48
Печать  
nvg писал(а) 03. Ноября 2006 :: 09:36:
Сталкивался с подобной ситуацией.
Писал отдельный класс-обертку для класса ODBCRecordSet (для доступа к сторонней БД).
Версия 1С++ 2.0.3.1. При попытке закрыть соединение объекта ODBCDatabase 1с падала.
РекСет=0 перед БД.Закрыть() - и 1с перестала падать.


Частично подтверждаю.
При организации распределенной работы на трех серверах создавались, помимо родного 1С-овского, еще два соединения:


//Начало проц.


Перем .........

     Перем лИстБаза;
     Перем лОтчБаза;
     
     Перем лИстСоединение;
     Перем лОтчСоединение;

     СтрокаСоед ="DRIVER=SQL Server;UID=...................;
     лОтчСоединение=СоздатьОбъект("ODBCDatabase");
     лОтчСоединение.Соединение(СтрокаСоед);
     Если лОтчСоединение.ЕстьСоединение()=0 Тогда
           Сообщить("................");
           Возврат;
     КонецЕсли;
     
     лОтчБаза=СоздатьОбъект("ODBCRecordSet");
     лОтчБаза.УстБД(лОтчСоединение);
     
     СтрокаСоед ="DRIVER=SQL Server;...............;
     
     лИстСоединение=СоздатьОбъект("ODBCDatabase");
     лИстСоединение.Соединение(СтрокаСоед);
     Если лИстСоединение.ЕстьСоединение()=0 Тогда
           Сообщить(".......................");

// ТОЧКА 1
           Возврат;
     КонецЕсли;
     
     лИстБаза=СоздатьОбъект("ODBCRecordSet");
     лИстБаза.УстБД(лИстСоединение);


//Здесь всякие разные извращенные запросы............
//............тыщи на полторы строк кода............


// ТОЧКА 2

Возврат;

Так вот, после использования данной процедуры 1С непредсказуемо вылетало через непредсказуемый промежуток времени. Или же не вылетало вообще - тоже непредсказуемо.

После шаманских вставок

В точке 1:

           лОтчБаза=0;
           лОтчСоединение.Закрыть();

В точке 2:

     лОтчБаза=0;
     лОтчСоединение.Закрыть();
     лИстБаза=0;
     лИстСоединение.Закрыть();


вылеты прекратились
« Последняя редакция: 08. Ноября 2006 :: 14:46 - Quan »  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
DionX
Senior Member
****
Отсутствует



Сообщений: 373
Местоположение: Кемерово
Зарегистрирован: 22. Августа 2006
Пол: Мужской
Re: Ошибки
Ответ #9 - 07. Ноября 2006 :: 10:06
Печать  
nobucks писал(а) 07. Ноября 2006 :: 08:31:
DionX писал(а) 07. Ноября 2006 :: 02:46:
а где у тебя происходит именно "закрытие и открытие соединения"? Я имеюю ввиду в случае повторного открытия обработки, когда в глобальной переменной БД уже "сидит" ODBCDatabase?


Закрытие и открытие происходит в другой функции внешней обработки, я не стал приводить ее код, после закрытия при повторном открытии открывается соединение, там все в порядке.

ты не стал приводить код, а я не оказался телепатом. Нерешительный
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать