Имя: Пароль:
1C
 
Ошибка ADODB.Recordset при выполнении SQL запроса
0 bvb
 
01.10.14
18:01
Выполняю запрос по сторонней SQL базе

eXsocet = Новый   COMОбъект ("ADODB.Connection");
eXrowset = Новый   COMОбъект("ADODB.Recordset");

eXsocet.Open(ConnectionString(Server,NameDatabase,UserID,Password));
eXrowset.ActiveConnection = eXsocet;
    
eXrowset.Open(СокрЛП(SqlQuery));
КолСтрок=eXrowset.Recordcount();
---------------------------------------
Ошибка :

{ОбщийМодуль.SQL.Модуль(34)}: Ошибка при вызове метода контекста (RecordCount)
     КолСтрок=eXrowset.Recordcount();
по причине:
Произошла исключительная ситуация (ADODB.Recordset): Операция не допускается, если объект закрыт.
-----------------------------------------
Другие запросы выполняются нормально. А этот нет.
В Managment Studio он исполняется нормально
Я грешу на то что он использует UNION.
1 Ёпрст
 
гуру
01.10.14
18:02
Содержимое SqlQuery предлагается угадывать ?
2 Jaap Vduul
 
01.10.14
18:16
(0)Результат запроса пустой.

Кстати, поскольку тип курсора не указан, то по-умолчанию будет использован forward-only курсор.
У которого Recordcount всегда равняется -1.
3 shuhard
 
01.10.14
18:18
(2) +1
ни типа блокировки, ни курсора
4 Banned
 
01.10.14
18:20
(2) зависит от драйвера.
(0) давай строку подключения и запрос
5 bvb
 
01.10.14
18:28
Provider=SQLOLEDB.1;Persist Security Info=False;Initial Catalog=MY_BASE;Data Source=10.10.0.2;User ID=sa;Password=sql;
6 bvb
 
01.10.14
18:29
SET DATEFORMAT 'DMY'
DECLARE @DocType varchar(5)
DECLARE @DocStatus varchar(5)
DECLARE @TAB_09 TABLE(ALC_CODE VARCHAR(30),SUMMA INT) -- Приходы
DECLARE @TAB_10 TABLE(ALC_CODE VARCHAR(30),SUMMA INT) -- Расходы
DECLARE @TAB_11 TABLE(ALC_CODE VARCHAR(30),SUMMA INT) -- Возвраты от покупателя
DECLARE @TAB_12 TABLE(ALC_CODE VARCHAR(30),SUMMA INT) -- Возвраты поставщику
DECLARE @TAB_46 TABLE(ALC_CODE VARCHAR(30),SUMMA INT) -- Первичные остатки
DECLARE @TAB_59 TABLE(ALC_CODE VARCHAR(30),SUMMA INT) -- Сведения о ввозе (ГТД)
--36126 --
SET @DocStatus = '38041' -- Только зафиксированные
--Ищем приходные накладные
Set @DocType = '36009'
INSERT @TAB_09 (ALC_CODE,SUMMA)
SELECT T2.REF_ALC_CODE_ID,SUM(T2.[COUNT])
FROM WRH_WAYBILL AS T1 INNER JOIN
WRH_WAYBILL_POS AS T2 ON T1.ID = T2.REF_WAYBILL_ID INNER JOIN
DOCFLOW_OBJECT AS T3 ON T1.ID = T3.ID
WHERE T1.INACTIVE_FLAG = '0' AND T2.INACTIVE_FLAG = '0' AND T3.REF_DATA_ID36 = @DocType AND T3.REF_DATA_ID38 = @DocStatus
GROUP BY T2.REF_ALC_CODE_ID
--Ищем расходные накладные
Set @DocType = '36010'
INSERT @TAB_10 (ALC_CODE,SUMMA)
SELECT T2.REF_ALC_CODE_ID,SUM(T2.[COUNT])
FROM WRH_WAYBILL AS T1 INNER JOIN
WRH_WAYBILL_POS AS T2 ON T1.ID = T2.REF_WAYBILL_ID INNER JOIN
DOCFLOW_OBJECT AS T3 ON T1.ID = T3.ID
WHERE T1.INACTIVE_FLAG = '0' AND T2.INACTIVE_FLAG = '0' AND T3.REF_DATA_ID36 = @DocType AND T3.REF_DATA_ID38 = @DocStatus
GROUP BY T2.REF_ALC_CODE_ID
--Ищем возвратные приходные накладные
Set @DocType = '36011'
INSERT @TAB_11 (ALC_CODE,SUMMA)
SELECT T2.REF_ALC_CODE_ID,SUM(T2.[COUNT])
FROM WRH_WAYBILL AS T1 INNER JOIN
WRH_WAYBILL_POS AS T2 ON T1.ID = T2.REF_WAYBILL_ID INNER JOIN
DOCFLOW_OBJECT AS T3 ON T1.ID = T3.ID
WHERE T1.INACTIVE_FLAG = '0' AND T2.INACTIVE_FLAG = '0' AND T3.REF_DATA_ID36 = @DocType AND T3.REF_DATA_ID38 = @DocStatus
GROUP BY T2.REF_ALC_CODE_ID
--Ищем возвратные расходные накладные
Set @DocType = '36012'
INSERT @TAB_12 (ALC_CODE,SUMMA)
SELECT T2.REF_ALC_CODE_ID,SUM(T2.[COUNT])
FROM WRH_WAYBILL AS T1 INNER JOIN
WRH_WAYBILL_POS AS T2 ON T1.ID = T2.REF_WAYBILL_ID INNER JOIN
DOCFLOW_OBJECT AS T3 ON T1.ID = T3.ID
WHERE T1.INACTIVE_FLAG = '0' AND T2.INACTIVE_FLAG = '0' AND T3.REF_DATA_ID36 = @DocType AND T3.REF_DATA_ID38 = @DocStatus
GROUP BY T2.REF_ALC_CODE_ID
--Ищем первичные остатки
Set @DocType = '36046'
INSERT @TAB_46 (ALC_CODE,SUMMA)
SELECT T2.REF_ALC_CODE_ID,SUM(T2.[COUNT])
FROM WRH_WAYBILL AS T1 INNER JOIN
WRH_WAYBILL_POS AS T2 ON T1.ID = T2.REF_WAYBILL_ID INNER JOIN
DOCFLOW_OBJECT AS T3 ON T1.ID = T3.ID
WHERE T1.INACTIVE_FLAG = '0' AND T2.INACTIVE_FLAG = '0' AND T3.REF_DATA_ID36 = @DocType AND T3.REF_DATA_ID38 = @DocStatus
GROUP BY T2.REF_ALC_CODE_ID
--Ищем сведения о ввозе
Set @DocType = '36059'
INSERT @TAB_59 (ALC_CODE,SUMMA)
SELECT T2.REF_ALC_CODE_ID,SUM(T2.QUANTITY)
FROM TAB_IMPORT_INFO AS T2 INNER JOIN
DOCFLOW_OBJECT AS T3 ON T2.ID = T3.ID
WHERE T2.INACTIVE_FLAG = '0' AND T3.REF_DATA_ID38 = @DocStatus
GROUP BY T2.REF_ALC_CODE_ID
--36126 Сведения о постановке продукции на баланс
--36128 Акт списания продукции на прочие расходы
select T1.ALC_CODE,T5.CLIENT_CODE,T3.FULL_NAME,T3.PERCENT_ALC,T4.VOLUME,T5.FULL_NAME AS PRODUCER ,T1.CNT from
(select alc_code,SUM(summa) AS 'CNT' from
((Select ALC_CODE,SUMMA from @TAB_09)
union
(Select ALC_CODE,-SUMMA from @TAB_10)
union
(Select ALC_CODE,SUMMA from @TAB_11)
union
(Select ALC_CODE,-SUMMA from @TAB_12)
union
(Select ALC_CODE,SUMMA from @TAB_46)
union
(Select ALC_CODE,SUMMA from @TAB_59)) as tab1
group by ALC_CODE) AS T1 INNER JOIN
TAB_ALC_CODE AS T2 ON T1.ALC_CODE = T2.ID INNER JOIN
TAB_ALC_NAME AS T3 ON T2.REF_ALC_NAME_ID = T3.ID INNER JOIN
TAB_VOLUME AS T4 ON T2.REF_VOLUME_ID = T4.ID INNER JOIN
TAB_CLIENT AS T5 ON T2.REF_CLIENT_ID = T5.ID
7 Banned
 
01.10.14
18:31
Мда...
SET NOCOUNT ON в начало влепи...
8 МихаилМ
 
01.10.14
18:41
(7)
это oledb . он и так последний результат возвращает
9 Banned
 
01.10.14
18:46
(8) А я всё равно бы поставил....
10 bvb
 
01.10.14
18:47
(7) ура заборбатало !!!

А что сия конструкция означает и почему без нее не работало ?
11 bvb
 
01.10.14
18:49
Если значение инструкции SET NOCOUNT равно ON, то количество строк не возвращается. Если значение инструкции SET NOCOUNT равно OFF, то количество строк возвращается.

А почему другие запросы без нее работают ?
12 Banned
 
01.10.14
18:51
(11) у тебя в начале стоит
INSERT @TAB_09 (ALC_CODE,SUMMA)
И возвращает количество строк вставленных.
В других, видать, такого нет
13 Jaap Vduul
 
01.10.14
18:51
(8)Наоборот, это MSDASQL возвращает только результат, а SQLOLEDB выдаёт на клиента rowcount по каждой инструкции.
14 bvb
 
01.10.14
18:57
(12) А-а-а :
То то я смотрю в закладке сообщения пишет


(строк обработано: 71)

(строк обработано: 1391)

(строк обработано: 151)

(строк обработано: 0)

(строк обработано: 73)

(строк обработано: 0)

(строк обработано: 1405)

в этом то и фича


INSERT @TAB_09 (ALC_CODE,SUMMA)  - это не повод
не отрабатывать  

.Recordcount()
15 bvb
 
01.10.14
19:00
я так понимаю :
в запросе куча промежуточных таблиц и ADO Recordcount() не понимает количество записей которой возвращать
16 Banned
 
01.10.14
19:02
(15) Он может ин а set'ы реагировать... И возвращать в элементе коллекции закрытый рекордсет.
17 bvb
 
01.10.14
19:32
(16) В любом случае большое спасибо - выручили