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. |