|
ADO и закрытый рекордсет.
#32044004
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
|
|
|
|
Сразу после pCmd->Execute - эксэпшн (рекордсет закрыт).
Без темповой таблице с (только) одним селектом все работает.
Вызов в COM+ компоненте:
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;
}
Процедура:
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
|
|
|