powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ADO и закрытый рекордсет.
3 сообщений из 3, страница 1 из 1
ADO и закрытый рекордсет.
    #32044004
rmatveev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сразу после pCmd->Execute - эксэпшн (рекордсет закрыт).
Без темповой таблице с (только) одним селектом все работает.
Вызов в COM+ компоненте:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
STDMETHODIMP CChkResults::GetStation(long lNodeId, long lExchangeId, VARIANT_BOOL bXML, VARIANT *pvRetval)
{
	// TODO: Add your implementation code here
		
	_ConnectionPtr pCn = NULL;
	_RecordsetPtr pRs = NULL;
	_CommandPtr pCmd = NULL;
	
	_bstr_t strEmpty(_T( ""));
	_variant_t vParam;	
	
	try
	{
		TESTHR(pCn.CreateInstance(CLSID_Connection));
		pCn->Open(m_strCnn, strEmpty, strEmpty, adConnectUnspecified);
		pCn->CursorLocation = adUseClient;


		TESTHR(pCmd.CreateInstance(CLSID_Command));
		pCmd->ActiveConnection = pCn;
		pCmd->CommandText = _T(" iis_GetStation ");
		pCmd->CommandTimeout = m_lCmdTimeout;
		
	// Fill parameters for a procedure

		if (lNodeId > 0 )
		{
			vParam.vt = VT_I4;
			vParam.lVal = lNodeId;
		}
		else
			vParam.vt = VT_NULL;
		pCmd->Parameters->Append(pCmd->CreateParameter("NODE_ID ",adInteger,adParamInput,4 ,vParam));
		vParam.Clear();

		if (lExchangeId >  0 )
		{
			vParam.vt = VT_I4;
			vParam.lVal = lExchangeId;
		}
		else
			vParam.vt = VT_NULL;
		pCmd->Parameters->Append(pCmd->CreateParameter("EXCHANGE_ID ",adInteger,adParamInput,4 ,vParam));
		vParam.Clear();

	// Execute a stored procedure
		pRs = pCmd->Execute(NULL, NULL, adCmdStoredProc);

		if(!pRs->BOF && !pRs->EndOfFile)
		{
			if(!bXML)
			{
				vParam = pRs->GetRows(adGetRowsRest);
				*pvRetval = vParam.Detach();			
			}
			else
			{
				MSXML::IXMLDOMDocumentPtr pXMLDOMDoc; 
				pXMLDOMDoc.CreateInstance(__uuidof(DOMDocument));
				pRs->Save(pXMLDOMDoc.GetInterfacePtr(), adPersistXML);
#ifdef _DEBUG
				pXMLDOMDoc->save(_variant_t(_T("C:\\res.xml ")));
#endif

				pvRetval->vt = VT_BSTR;
				pvRetval->bstrVal = pXMLDOMDoc->Getxml();
			}
		}

		pRs->Close();
		pCn->Close();
	}
	catch(_com_error &e)
	{
		long lState = 0 ;

		if(pRs)
		{
			pRs->get_State(&lState);
			if(lState & adStateOpen)
				pRs->raw_Close();
		}
		if(pCn)
		{
			lState =  0 ;
			pCn->get_State(&lState);
			if(lState & adStateOpen)
				pCn->raw_Close();
		}

		_bstr_t strErr;
		if(e.Description().length()== 0 )	
			strErr = e.ErrorMessage();
		else 
			strErr = e.Description();

		ErrorStr(&__uuidof(IChkResults),SYS_E_COM,SYS_E_SOURCE,(LPTSTR)strErr,e.Error(),_T("CChkResults "),_T(" GetStation"));

		return e.Error();
	}

	return S_OK;
}


Процедура:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
CREATE PROCEDURE IIS_GetStation
	@NODE_ID int = NULL,
	@EXCHANGE_ID int = NULL
AS
EXEC XXX.master.dbo.sp_executesql @stmt = N'
	USE zzz
	CREATE TABLE #tmp_station(SPECIAL_NUMBER int)

	IF @EXCHANGE_ID IS NULL AND @NODE_ID IS NULL 
		INSERT INTO #tmp_station
		SELECT EXCHANGE.SPECIAL_NUMBER
		FROM EXCHANGE 
			INNER JOIN NODE ON EXCHANGE.PARENT_NODE_id = NODE.NODE_id
		WHERE (@NODE_ID IS NULL OR NODE.NODE_ID = @NODE_ID) AND 
	              (@EXCHANGE_ID IS NULL OR EXCHANGE.EXCHANGE_ID = @EXCHANGE_ID) 
		GROUP BY EXCHANGE.SPECIAL_NUMBER
		HAVING COUNT(*) >= 2
	
	SELECT  EXCHANGE.EXCHANGE_ID, 
			CASE 
				WHEN 	NOT @EXCHANGE_ID IS NULL OR 
					NOT @NODE_ID IS NULL  OR 
					ts.SPECIAL_NUMBER IS NULL 
				THEN EXCHANGE.Name 
				ELSE EXCHANGE.Name +'', ''+ RTRIM(NODE.Name)
			END AS STATION,
			EXCHANGE.SPECIAL_NUMBER
	FROM EXCHANGE 
			INNER JOIN NODE ON EXCHANGE.PARENT_NODE_id = NODE.NODE_id
			LEFT OUTER JOIN #tmp_station ts ON ts.SPECIAL_NUMBER = EXCHANGE.SPECIAL_NUMBER
	WHERE  	(@NODE_ID IS NULL OR NODE.NODE_ID = @NODE_ID) AND 
			(@EXCHANGE_ID IS NULL OR EXCHANGE.EXCHANGE_ID = @EXCHANGE_ID) 
	ORDER BY EXCHANGE.SPECIAL_NUMBER',
	@params = N'@NODE_ID int, @EXCHANGE_ID int',
	@NODE_ID = @NODE_ID,
	@EXCHANGE_ID = @EXCHANGE_ID

RETURN  0 
...
Рейтинг: 0 / 0
ADO и закрытый рекордсет.
    #32044007
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SET NOCOUNT ON в начало процедуры
...
Рейтинг: 0 / 0
ADO и закрытый рекордсет.
    #32044008
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
EXEC XXX.master.dbo.sp_executesql @stmt = N'
SET NOCOUNT ON ......'
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ADO и закрытый рекордсет.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]