Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Перполнение буфера в методе Выполнить ODBCRecordSet (число прочтений - 1937 )
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Перполнение буфера в методе Выполнить ODBCRecordSet
23. Июля 2009 :: 12:53
Печать  
Собственно обнаружил Subj и думаю кто виноват - 1С++, ODBC, SQL или радиус кривизны моих рук...... Улыбка
Ситуация следующая - выполняю такой код
Код
Выбрать все
DECLARE Event_Cursor CURSOR FOR
	SELECT distinct EventType
	FROM SysLog_Events
	WHERE len(EventType) > 15;
OPEN Event_Cursor;
FETCH NEXT FROM Event_Cursor INTO @EventType;
WHILE @@FETCH_STATUS = 0 BEGIN
	select @message = 'EventType='+ltrim(rtrim(@EventType))
	set @oldEventType = @EventType
	if len(rtrim(@EventType)) > 15 begin -- Не нашли и по полному наименованию - тогда приводим к нормальному вмду то что есть
		set @CountNum = 1
		set @EventType = 'UsrEvtType' + convert(char(5), @CountNum)
		while exists (select EventType from SysLog_Events where EventType = @EventType) begin
			-- Ищем первый свободный UserEventType
			set @CountNum = @CountNum + 1
			set @EventType = 'UsrEvtType' + convert(char(5), @CountNum)
		end
	end
	select @message = rtrim(@message) + ' => EventType='+ltrim(rtrim(@EventType))
	print @message
	UPDATE SysLog_Events SET EventType = @EventType WHERE EventType = @oldEventType
	FETCH NEXT FROM Event_Cursor INTO @EventType;
END;
CLOSE Event_Cursor;
DEALLOCATE Event_Cursor;

DECLARE Event_Cursor CURSOR FOR
	SELECT EventType, Event
	FROM SysLog_Events
	WHERE len(Event) > 20;
OPEN Event_Cursor;
FETCH NEXT FROM Event_Cursor INTO @EventType, @Event;
WHILE @@FETCH_STATUS = 0 BEGIN
	select @message = 'EventType='+ltrim(rtrim(@EventType))+', Event='+ltrim(rtrim(@Event))
--	execute CreateEvents_SysLog @EventType out, @Event out, default
	if len(rtrim(@Event)) > 20 begin
		set @CountNum = 1
		set @Event = 'UserEvent' + convert(char(11), @CountNum)
		while exists (select Event from SysLog_Events where Event = @Event) begin
			-- Ищем первый свободный UserEvent
			set @CountNum = @CountNum + 1
			set @Event = 'UserEvent' + convert(char(11), @CountNum)
		end
	end
	UPDATE SysLog_Events SET Event = @Event WHERE CURRENT OF Event_Cursor
	select @message = rtrim(@message) + ' => EventType='+ltrim(rtrim(@EventType))+', Event='+ltrim(rtrim(@Event))
	print @message
	FETCH NEXT FROM Event_Cursor INTO @EventType, @Event;
   END;
CLOSE Event_Cursor;
DEALLOCATE Event_Cursor; 



Т.е. преобразовую данные в таблице используя курсоры. В SQL QA все отрабатывает на ура. Запускаю в 1С++ через Запрос.Выполнить() отрабатывает как-бы только первый цикл. Начинаю ковырятся ...... дохожу до того что если запустить запрос несколько раз подряд то он каждый раз обрабатывает несколько доп. строк. Вобщем после долгих плясок с бубном удаляю отладочный 'print' и запрос обрабатывает почти полностью за один раз (и первый и второй циклы). Ставлю в начале SET NOCOUNT ON  и запрос отрабатывает полностью!!!

Это как это?! Получается что буфер или что-то там в методе Выполнить или в ODBC переполняется выводимыми сообщениями и цикл в запросе тихо (без сообщений об ошибках) перестает выполнятся. Может кто объяснить сей феномен - или я как обычно "открыл Америку" Улыбка
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перполнение буфера в методе Выполнить ODBCRecordSet
Ответ #1 - 23. Июля 2009 :: 13:04
Печать  
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Перполнение буфера в методе Выполнить ODBCRecordSet
Ответ #2 - 24. Июля 2009 :: 05:15
Печать  
berezdetsky писал(а) 23. Июля 2009 :: 13:04:

Спасибо за наводку ....
Значит таки ODBC "прикалывается"
А нельзя-ли как-то прочитать этот буфер в процессе, чтобы он не переполнялся ..... хотя наверное нельзя, т.к. Выполнить() управление не отдаст пока не выполнится .....
Ну или хотя-бы сделать ему >/dev/null на всяк случай. А то ведь бывают там всякие "варнинги" которые не всегда проконтролируешь а batch может прерваться и знать об этом не будешь Печаль
  
Наверх
ICQ  
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Перполнение буфера в методе Выполнить ODBCRecordSet
Ответ #3 - 24. Июля 2009 :: 08:30
Печать  
А SET NOCOUNT ON использовать нельзя?
  
Наверх
ICQ  
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Перполнение буфера в методе Выполнить ODBCRecordSet
Ответ #4 - 24. Июля 2009 :: 11:19
Печать  
Salimbek писал(а) 24. Июля 2009 :: 08:30:
А SET NOCOUNT ON использовать нельзя?

Можно! Я его и использую.... но этого "маловато будет"
Есть еще "варнинги" типа такого
Код
Выбрать все
Warning: The table 'SysLog' has been created but its maximum row size (8533) exceeds the maximum number of bytes per row (8060) 


и их я не могу никак отключить
SET ANSI_WARNINGS OFF почему-то тоже не помогает Печаль
Из-за этого еще один длинный скрипт по изменению структуры таблиц не работает

HELP PLS!!!!
  
Наверх
ICQ  
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Перполнение буфера в методе Выполнить ODBCRecordSet
Ответ #5 - 24. Июля 2009 :: 12:06
Печать  
ну уменьшить размеры полей в таблице SysLog, и не будет ворнинга. Все-равно размер строки больше 8060 байт не есть правильно, о чем сервер и предупреждает
  
Наверх
 
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Перполнение буфера в методе Выполнить ODBCRecordSet
Ответ #6 - 24. Июля 2009 :: 12:54
Печать  
alexdd писал(а) 24. Июля 2009 :: 12:06:
ну уменьшить размеры полей в таблице SysLog, и не будет ворнинга. Все-равно размер строки больше 8060 байт не есть правильно, о чем сервер и предупреждает

Ну уменьшил уже поле Comment до 7700 - после преобразования ругаться перестанет. Т.е. когда скрипт первый раз отработает ...... но он мне на раз и нужен, при переезде на новую версию класса

IMHO это все полумеры, т.к. есть еще 'sp_rename' которая радостно сообщает что имя объекта таки изменено ну и т.п. хрень
В этом скрипте я уже не буду ничего делать - отработаю его вручную из SQL QA да и ИКС с ним....
Но вот на будущее хотелось-бы иметь возможность решения таких проблем
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать