15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Calling Stored Procedures from CRecordset

Pinker Michael -- PinkerM@logica.com
Friday, September 06, 1996


Hi

Environment: Windows 95, MSVC 4.0

I am trying to call a store procedure from my app which has one output 
parameter
and no returned result set.

The MFC documentation says use CDatabase::ExecuteSQL for stored procedures
that don't return result set but i need to return parameter from the stored 
proc, so I
used a CRecordset instead. This works fine - the parameter is passed and
returned fine - apart from a message box "No columns were bound prior to 
calling SQLExtendedFetch".
I've set the number of fields to 0 but it still attempts to make a call to 
extended fetch.
I've looked at the help and MSDN but can't find anything.

I could get rid of the message box by returning a dummy result set but i 
would like to
do it without.

Any ideas/articles??


cheers


mike



John Ferguson -- johnf@uvsg.com
Saturday, September 07, 1996

I have looked at this recently. One of the great things about the MFC
classes, is the well thought
out design that allows you to fall back to the SDK level.

In my application, I use the CDatbase class for my connection, and
CRecordset classes for almost all of my data retrieval. But, like you, I
did run into a couple of situations that the MFC database classes don't
yet support.  Catching a return value from a STP, for example; or the
one you gave.

solution...
Use open CDatabase object's data members, in native odbc2.0 sdk calls.
It works great.

I've also used this technique to return a single row from a table,
without having to set up a recordset class.

hope this helps
johnf

>I am trying to call a store procedure from my app which has one output
>parameter
>and no returned result set.
>
>The MFC documentation says use CDatabase::ExecuteSQL for stored procedures
>that don't return result set but i need to return parameter from the stored
>proc, so I
>used a CRecordset instead. This works fine - the parameter is passed and
>returned fine - apart from a message box "No columns were bound prior to
>calling SQLExtendedFetch".
>I've set the number of fields to 0 but it still attempts to make a call to
>extended fetch.
>I've looked at the help and MSDN but can't find anything.
>
>I could get rid of the message box by returning a dummy result set but i
>would like to
>do it without.
>
>Any ideas/articles??
>
>
>cheers
>
>
>mike
>



Dan Kirby -- dkirby@accessone.com
Saturday, September 07, 1996

[Mini-digest: 2 responses]

Remember that if you are using the cursor library, you must have at least
one bound column.  That is what can cause the "No columns were bound prior
to calling SQLExtendedFetch" message. Also remember that using
CRecordset::Open() expects that you will have a returned resutlset. If you
won't have a returned resultset, use the ExecuteSQL.  In VC++ 4.2, there is
now a virtual function of CDatabase called BindParameters which gets passed
an HSTMT,  you can call SQLBindParameters in there if you would like to
have a return values/parameters in the SQL statement you are about to
perform.

-dan


----------
> From: Pinker Michael 
> To: 'smtp:mfc-l@netcom.com'
> Subject: Calling Stored Procedures from CRecordset
> Date: Friday, September 06, 1996 10:27 AM
> 
> 
> Hi
> 
> Environment: Windows 95, MSVC 4.0
> 
> I am trying to call a store procedure from my app which has one output 
> parameter
> and no returned result set.
> 
> The MFC documentation says use CDatabase::ExecuteSQL for stored
procedures
> that don't return result set but i need to return parameter from the
stored 
> proc, so I
> used a CRecordset instead. This works fine - the parameter is passed and
> returned fine - apart from a message box "No columns were bound prior to 
> calling SQLExtendedFetch".
> I've set the number of fields to 0 but it still attempts to make a call
to 
> extended fetch.
> I've looked at the help and MSDN but can't find anything.
> 
> I could get rid of the message box by returning a dummy result set but i 
> would like to
> do it without.
> 
> Any ideas/articles??
> 
> 
> cheers
> 
> 
> mike
-----From: Mike Geldens 

G'day Mike,

Here's how I do it:

In SQL Server...
/****** Object:  Stored Procedure dbo.GetScoreCount    Script Date: 10/07/96
20:40:17 ******/
CREATE PROCEDURE dbo.GetScoreCount
AS
    begin
	RETURN (SELECT COUNT(*) from Scores)
    end



In MSVC...

long CRallyScoreDoc::SQLGetScoreCount()
{
    RETCODE rc ;
    HDBC   hdbc ;
    HSTMT  hstmt ;
    long   lRowCount = 0 ;
	
    if ( !SQLCheckDBOpen())      // helper fn to ensure valid DB connection
	return 0 ;

    hdbc = m_dbRally.m_hdbc ;
	
    rc = ::SQLAllocStmt( hdbc, &hstmt ) ;
    switch ( rc )
    {
	case SQL_INVALID_HANDLE:
	case SQL_ERROR :
	    SQLErrorHandler( hdbc, hstmt ) ;
	    break ;
	case SQL_SUCCESS :
	case SQL_SUCCESS_WITH_INFO :
	{
            SWORD  sRowCount;
            SDWORD cbRowCount ;

            ::SQLBindParameter(hstmt, 1, SQL_PARAM_OUTPUT, SQL_C_SLONG,
SQL_INTEGER, 0, 0, &sRowCount, 0, &cbRowCount) ;
            rc = ::SQLExecDirect(hstmt, (unsigned char *)"{?=call
GetScoreCount}",SQL_NTS) ;

            if ( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO )
                SQLErrorHandler( hdbc, hstmt ) ;
            else
                lRowCount = sRowCount ;

            rc = ::SQLFreeStmt(hstmt, SQL_DROP)	;
            break ;
        }
        default:            // ??
            break ;
	}
    return lRowCount ;
}

Hope this helps

Regards,


Mike
Mike Geldens               mgeldens@thehub.com.au
 cwinds Software - custom software for engineers






| Вернуться в корень Архива |