Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Подключение занято до получения результатов для другого hstmt (число прочтений - 7984 )
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Подключение занято до получения результатов для другого hstmt
21. Сентября 2010 :: 18:46
Печать  
Отлаживал сегодня создание элементов в нескольких справочниках, используя sqllock, нечасто но стабильно вылетала ошибка
Цитата:
State HY000, native 0, message [Microsoft][ODBC SQL Server Driver]Подключение занято до получения результатов для другого hstmt
. Причем вылетало в исключение, а иногда и 1с вылетала даже, на одной и той же строчке  Id = sqllock.НовыйИД().
После начала транзакции begin tran  добавил set nocount on - вылеты прекратились. Собсна вопросы :

1.Почему без строчки set nocount on вылетало не всегда ?
2.Как связан sqllock.НовыйИД() c set nocount on ?
3.Правильно ли я поставил диагноз проблемы ?
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Подключение занято до получения результатов для другого hstmt
Ответ #1 - 21. Сентября 2010 :: 18:56
Печать  
диагноз поставлен верно.

Кроме НовыйИД(), в котором кстати есть set nocount on, у тебя наверняка есть еще и insert без set nocount on.
Результирующий роукаунт от инсерта никто не вычитывал, поэтому и "Подключение занято до получения результатов для другого hstmt"
  

1&&2&&3
Наверх
 
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Подключение занято до получения результатов для другого hstmt
Ответ #2 - 21. Сентября 2010 :: 19:13
Печать  
trad писал(а) 21. Сентября 2010 :: 18:56:
диагноз поставлен верно.

у тебя наверняка есть еще и insert без set nocount on.
Результирующий роукаунт от инсерта никто не вычитывал, поэтому и "Подключение занято до получения результатов для другого hstmt"


И insert и delete, потом опять insert.

Выходит set nocount on нужно применять для всех иструкций SQL которые изменяют данные ?
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Подключение занято до получения результатов для другого hstmt
Ответ #3 - 21. Сентября 2010 :: 19:22
Печать  
для всех которые генерируют rowcount: insert, update, delete
  

1&&2&&3
Наверх
 
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: Подключение занято до получения результатов для другого hstmt
Ответ #4 - 20. Мая 2014 :: 11:51
Печать  
А что может быть в таком случае? (если тут еще кто есть) Улыбка
Первый запрос отлично получается данные.

это при открытии отчета:

Код
Выбрать все
rs2 = СоздатьОбъект("ODBCRecordSet");
ТекстЗапроса = "
|SET NOCOUNT ON
|
|SELECT *
|FROM _1SENTRY (NOLOCK)
|WHERE DATE_TIME_DOCID = ?
|";
rs2.ДобПараметр(1, 14, 23, 0);
rs2.Подготовить(ТекстЗапроса);
 



и уже потом в цикле процедура в которой:

Код
Выбрать все
rs2.УстПараметр(1, rs2.md.ПолучитьДатуВремяИдДок(СформироватьПозициюДокумента(док)));
рез = rs2.ВыполнитьСкалярный();
 



rs2 глобальный внутри отчета.

после второго запроса (как я понял) рушится 1С с текстом:
подключение занято до получения результатов для другого hstmt
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Подключение занято до получения результатов для другого hstmt
Ответ #5 - 20. Мая 2014 :: 12:10
Печать  
возвращается более одной записи.

вместо SELECT *
применить либо top 1, либо агрегацию

или
вместо ВыполнитьСкалярный
применить ВыполнитьИнструкцию
  

1&&2&&3
Наверх
 
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: Подключение занято до получения результатов для другого hstmt
Ответ #6 - 20. Мая 2014 :: 12:12
Печать  
тьфу ты ну ты Улыбка спс, совсем забыл же что скаляр одна строка.
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
varelchik_f
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 36
Местоположение: Киев
Зарегистрирован: 10. Апреля 2014
Пол: Мужской
Re: Подключение занято до получения результатов для другого hstmt
Ответ #7 - 21. Мая 2014 :: 05:55
Печать  
не одна строка, а должно быть одной стройкой иначе крах.
  
Наверх
 
IP записан
 
vligm
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 1
Зарегистрирован: 28. Ноября 2014
Re: Подключение занято до получения результатов для другого hstmt
Ответ #8 - 28. Ноября 2014 :: 09:16
Печать  
Добрый день!
Столкнулся и я с этой ошибкой. Проявила сь пока на одном документе.

Есть код в документе:
Код
Выбрать все
		Тпрод.УдалитьСтроки();
		ВыбратьСтроки();
		Пока ПолучитьСтроку() = 1 Цикл
			//Тпрод	Нпп,ТМЦ,Ед,КвоБух,(Кратность)
			Тпрод.НоваяСтрока();
			Тпрод.Нпп		= НомерСтроки;
			Тпрод.ТМЦ		= ТМЦ;
			Тпрод.Ед		= Ед;
			Тпрод.КвоБух	= Количество;
			Тпрод.Кратность	= }}}");
			Если ПустоеЗначение(Кратность) = 0 Тогда
				ТекстЗапроса = "
				|SET NOCOUNT ON
				|SELECT
				|	$ref_mult_group.НомГруппы		AS Нпп
				|	,$ref_mult_group.КвоОтрезков	AS КвоОтр
				|	,$ref_mult_group.ДлинаОтрезка	AS Длина
				|FROM
				|	$Справочник.КратностьДлин AS ref_mult_lengths
				|	INNER JOIN
				|	$Справочник.ГруппыКратности AS ref_mult_group ON ref_mult_lengths.ID = ref_mult_group.PARENTEXT
				|WHERE
				|	ref_mult_lengths.ID = :curr_mult_length
				|";
				RS.УстановитьТекстовыйПараметр("curr_mult_length", MDW.ЗначениеВСтрокуБД(Кратность));
				Тзпр = глПолучитьВыборку(, ТекстЗапроса,0);
				Тпрод.Кратность.Загрузить(Тзпр);
				Тзпр = "";
			КонецЕсли;// Если ПустоеЗначение(Кратность) = 0
		КонецЦикла;// Пока ПолучитьСтроку() = 1
 


и соответственно в глобальном модуле:
Код
Выбрать все
Функция глПолучитьВыборку(ODBCRecordset = "", Текст, Отладка = 0, Очищать = 1, Тзпр = "") Экспорт
	Если ПустоеЗначение(ODBCRecordset) = 1 Тогда
		ODBCRecordset = RS;
	КонецЕсли; //Если ПустоеЗначение(ODBCRecordset) = 1
	ODBCRecordset.Отладка(Отладка);
	Если ODBCRecordset.Открыть(Текст) = 0 Тогда
		Ошибка = ODBCRecordset.ПолучитьОписаниеОшибки();
		Если ПустоеЗначение(Ошибка) = 0 Тогда
			Сообщить(Ошибка);
		КонецЕсли; //Если ПустоеЗначение(Ошибка) = 0
	КонецЕсли; //Если ODBCRecordset.Открыть(Текст) = 0
	Если ПустоеЗначение(Тзпр) = 1 Тогда
		Тзпр = }}}");
	КонецЕсли; //Если ПустоеЗначение(Тзпр) = 1
	ODBCRecordset.ПолучитьРезультатыВ_ТЗ(Тзпр, Очищать);
	ODBCRecordset.Закрыть();
	Возврат Тзпр;
КонецФункции //глПолучитьВыборку
 


Вылетает все время на 17 строке в документе. Криминала жесткого я там не нашел. Отладчиком выловил, что вылетает на строке -

ODBCRecordset.ПолучитьРезультатыВ_ТЗ(Тзпр, Очищать);

Подскажите, пожалуйста, в чем я не прав... ;-(

  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Подключение занято до получения результатов для другого hstmt
Ответ #9 - 28. Ноября 2014 :: 10:35
Печать  
Запрос в цикле... это же полный ПЭ.
Остальное не смотрел даже.

Код
Выбрать все
//ПолучитьРезультатыВ_ТЗ
ТЗ = Запрос.ВыполнитьИнструкцию(бляблабла... 

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать