Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема OFF: ADO возвращает закрытый рекордсет (число прочтений - 1839 )
The gray Cardinal
Full Member
***
Отсутствует



Сообщений: 159
Зарегистрирован: 17. Июня 2006
Пол: Мужской
OFF: ADO возвращает закрытый рекордсет
08. Сентября 2006 :: 15:55
Печать  
Есть примерно такой скрипт:
Код
Выбрать все
CREATE TABLE #TempTable (
[Recipient] [int] NOT NULL,
[RecipientName] varchar (64) Null,
[Local] [int] Not Null,
[LocalName] varchar (64) Null,
[Sup] [int] NOT NULL,
[SuplName] varchar (64) Null,
[Operation] [smallint] NOT NULL,
[OperationName] varchar (64) Null,
[Product] [int] NOT NULL,
[Article] varchar (64) Null,
[ArtSup] varchar (64) Null,
[ProductName] varchar (64) Null,
[Group1] [int]  Null,
[Group1Name] varchar (64) Null,
[AvgOstQty] [money]  NULL,
[AvgOstSum1] [money]  NULL,
[SaleMove] [money] NULL,
[SaleSum1] [money] NULL,
[SaleProceed1] [money] NULL
)
INSERT #TempTable
EXEC My_Report_AvgOstBySupplRecip
@Recip = '',
@Local = '',
@grp = '',
@Supls = '',
@operation = N'121,120,145',
@Product = '',
@datefrom = '20060701',
@dateto = '20060731'
--*******************************************************************
SELECT

CASE WHEN (GROUPING(RecipientName) = 1) THEN 'ВСЕ Магазины'
     ELSE ISNULL(CAST(RecipientName AS varchar), 'UNKNOWN')
END AS RecipientName,

CASE WHEN (GROUPING(SuplName) = 1) THEN 'ВСЕ Поставщики'
     ELSE ISNULL(CAST(SuplName AS varchar), 'UNKNOWN')
END AS SuplName,

CASE WHEN (GROUPING(Group1Name) = 1) THEN 'ВСЕ Группы'
     ELSE ISNULL(CAST(Group1Name AS varchar), 'UNKNOWN')
END AS Group1Name,

SUM(AvgOstQty) AS AvgOstQty,
SUM(AvgOstSum1) AS AvgOstSum1,
SUM(SaleMove) AS SaleMove,
SUM(SaleSum1) AS SaleSum1,
SUM(SaleProceed1) AS SaleProceed1

FROM #TempTable
GROUP BY RecipientName, SuplName, Group1Name WITH ROLLUP
ORDER BY RecipientName DESC, SuplName DESC, Group1Name DESC
--*******************************************************************
DROP TABLE #TempTable 


Пытаюсь его исполнить через ADO (клиент - 1C v8.0, сервер - MS SQL 2005) и получить результат. Примерно так:
Код
Выбрать все
Conn = Новый COMОбъект("ADODB.Connection");
Conn.ConnectionString = СтрокаПодключения;
Conn.Open();
Comm = Новый COMОбъект("ADODB.Command");
Comm.CommandTimeout = 0;
Comm.CommandText = ТекстЗапроса;
Comm.ActiveConnection = Conn;
Comm.CommandType = 1;
Rec = Comm.Execute();
Rec.Open();
Сообщить(Rec.State);
Rec = Rec.NextRecordset();
Rec.Open();
Сообщить(Rec.State); 


Рекордсет(ы) оказывается закрытым! Хотя очень похоже, что скрипт исполняется - одинэсина белеет, как парус в море, на целую минуту, при этом никаких ошибок (исключений) нет. Как открыть рекордсет и выдрать данные?
  
Наверх
www  
IP записан
 
The gray Cardinal
Full Member
***
Отсутствует



Сообщений: 159
Зарегистрирован: 17. Июня 2006
Пол: Мужской
Re: OFF: ADO возвращает закрытый рекордсет
Ответ #1 - 11. Сентября 2006 :: 13:02
Печать  
Проблема решена добавлением в начало сиквельного скрипта
Код
Выбрать все
SET NOCOUNT ON 


Кроме того, важно, что данные в этом случае возвращаются во втором рекордсете, т.е. после получения данных действительно надо использовать метод NextRecordset().
P.S. Редко этим пользуюсь, так что каждый раз успеваю всё успешно забыть Улыбка
  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать