PRB: Output Param Not Returned from Procedure Without ResultsetLast reviewed: February 26, 1998Article ID: Q181837 |
The information in this article applies to:
SYMPTOMSWhen using stored procedures with the Microsoft Foundation Class Library's CRecordset class, no values are returned for output parameters unless the stored procedure returns a resultset.
CAUSECRecordset is not designed to handle output parameters from a stored procedure if no resultset is returned.
RESOLUTIONIf the stored procedure doesn't return a resultset, derive from CDatabase and override the BindParameters function to provide your own binding. Then use CDatabase::ExecuteSQL directly without using CRecordset.
Sample of BindParameters
void CExecDatabase::BindParameters(HSTMT hstmt) { // This sample shows how to return RETURN code and OUTPUT params. RETCODE nRetCode; m_lDbOutParam = 0; // First, the RETURN parameter. m_lBufLength = sizeof(m_lDbOutParam); // This is binding the RETURN value. nRetCode = ::SQLBindParameter(hstmt, 1, SQL_PARAM_OUTPUT, SQL_C_SLONG, SQL_INTEGER, 11, 0, (void*)&m_lDbOutParam, 0, &m_lBufLength); m_lDbOutParam2 = 1; // Second, the OUTPUT parameter. m_lBufLength2 = sizeof(m_lDbOutParam2); // This is binding the OUTPUT value. nRetCode = ::SQLBindParameter(hstmt, 2, SQL_PARAM_OUTPUT, SQL_C_SLONG, SQL_INTEGER, 11, 0, (void*)&m_lDbOutParam2, 0, &m_lBufLength2); } // In your MFC code, call your stored procedure directly. // CRecordset is not involved. db.ExecuteSQL(_T("{?=CALL TestQuery(?)}"));However, if the stored procedure does return a resultset, use CRecordset's FlushResultSet function as follows:
while( rs.FlushResultSet()) { while (!rs.IsEOF()) { rs.MoveNext(); } } // Now retrieve your bound parameters, as you normally would. m_strName = rs.m_noutparam; STATUSThis is by design.
Keywords : MfcDatabase Version : WINNT:5.0 Platform : winnt Issue type : kbprb |
================================================================================
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |