below is from MSDN,you can find a lot of technical article in MSDN if you search"stored procedure and VC"
good luckSteps To Reproduce Behavior
In the SQL Server 7.0 Query Analyzer select the test database Pubs.
Create the following stored procedure. This stored procedure returns a recordset and an out parameter count.if exists (select * from sysobjects where id = object_id(N'[dbo].[GetJobs]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
   drop proc GetJobs
   go
   create proc GetJobs @id as int, @count as int [out] as
   begin
    Select @count = Count(*) from jobs where job_id >@id
    Select * from jobs where job_id >@id
   end
   go
 Use VC App Wizard to create a new console application and modify the code as follows:#include "stdafx.h"
   #include "stdio.h"
   #import "C:\PROGRA~1\COMMON~1\System\ado\msado15.dll" no_namespace rename ("EOF", "EOF2")   struct InitOle {
     InitOle()  { ::CoInitialize(NULL); }
     ~InitOle() { ::CoUninitialize();   }
   } _init_InitOle_;   int main(int argc, char* argv[])
   {
    _variant_t varErr((long)0, VT_ERROR);
    _CommandPtr comm(__uuidof(Command));
    _ConnectionPtr conn(__uuidof(Connection));    _bstr_t connstr="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=pubs;Data Source=(local)";
    conn->Open(connstr, "", "", adConnectUnspecified);
    comm->ActiveConnection=conn;
    comm->CommandText="GetJobs";
    comm->CommandType = adCmdStoredProc ; 
    comm->Parameters->Refresh();
    _variant_t recs;    comm->Parameters->Item[_variant_t((short)1)]->Value= _variant_t((long)5);
    _RecordsetPtr rs = comm->Execute(&recs, &vtMissing,adCmdStoredProc);     _variant_t recordcount= comm->Parameters->Item[_variant_t((short)2)]->Value;    printf("recordcount = %li\n", (long)recordcount);
    return 0;
   }
 
Change the Datasource, User ID and password in the connection string above.
The recordcount variant that the above code returns is of type VT_NULL rather than the number of records that the stored procedure returns.

解决方案 »

  1.   

    首先感谢 pengdali(大力) 问题没有解决现有程序中没有使用ADO方式,单使用odbc api调用,Query Analyzer 做过测试,存储过程没有问题,关键在于如何使用api获得存储过程的返回值
    无论获得return  ,output,或RAISERROR  均可加40分,查收
    在线期待中...
      

  2.   

    1.配置ODBC,建立ODBC和SQL SERVER的连接ODBCTEST
    2.在VC++通过该ODBC调用SQL SERVER的STORED PROCEDURE(szTypes )
    #include "stdafx.h"
    #include "DatabaseServer.h"
    #include <stdarg.h>#ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif//////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////CDatabaseServer::CDatabaseServer()
    {

    }CDatabaseServer::~CDatabaseServer()
    {}bool CDatabaseServer::getConnectionString(char *szConnectionString)
    {
    char szServerName[MAX_COMPUTERNAME_LENGTH + 1];
    DWORD dwSize=sizeof(szServerName) ;
    if(!GetComputerName(szServerName,&dwSize))
    return false ;
    if(!szConnectionString)
    return false ; char szUserName[] = "SA";
    char szPassword[] = "";
    char szDatabase[] = "IPLOMA";//ADD YOU DATEBASE NAME

    sprintf(szConnectionString,"DSN=ODBCTEST;uid=%s;pwd=%s;",szServerName,szDatabase,szUserName,szPassword); //建立CONNECTION STRING return true;
    }VARIANT CDatabaseServer::getExecStoredProcedure(char *szTypes,SAFEARRAY *pSPFields)
    {
        _variant_t vtResultRows;
        try
        {
    _CommandPtr   pCmdPtr;
            _RecordsetPtr pRecordset;
            HRESULT hr ;  hr = pCmdPtr.CreateInstance(__uuidof(Command)); char szConnectionString[255];
    getConnectionString(szConnectionString);
    _variant_t vtConnectionString(szConnectionString);
    pCmdPtr->put_ActiveConnection(vtConnectionString);        pCmdPtr->CommandType = adCmdStoredProc; //CALL SQL SP
    pCmdPtr->CommandText =  szTypes ; //YOU SP NAME
    hr = pCmdPtr->Parameters->Refresh();    long lBound,uBound ;
       HRESULT hresult ;
       // Getting Safe Array's Lower and Upper Bounds
       hresult = SafeArrayGetLBound(pSPFields, 1, &lBound);
           hresult = SafeArrayGetUBound(pSPFields, 1, &uBound);    variant_t vtParamVal;
    _variant_t Index;
    Index.vt = VT_I2;
    Index.iVal = 1 ;
       for (long iElements=lBound;iElements<=uBound;iElements++)
       {
    hresult = SafeArrayGetElement(pSPFields, &iElements, &vtParamVal);
    pCmdPtr->GetParameters()->GetItem(Index)->PutValue(vtParamVal) ;
    Index.iVal++ ;
       }    //Execute current Stored Procedure
            _variant_t vEffected ;
    pRecordset = pCmdPtr->Execute(&vEffected,NULL,NULL);
    if (pRecordset->BOF || pRecordset->EndOfFile)
    throw ;
    // Get result set in the form of array
            vtResultRows = pRecordset->GetRows(-1);
            return vtResultRows.Detach() ;
    }
    catch(_com_error &e)
        {
    ATLTRACE((LPCSTR)e.Description());
        }
    vtResultRows.vt = VT_EMPTY ;
        return vtResultRows.Detach();
    }long CDatabaseServer::setExecStoredProcedure(char *szTypes,SAFEARRAY *pSPFields)
    {
        _variant_t vtResultRows;
        try
        {
            _CommandPtr   pCmdPtr;
            _RecordsetPtr pRecordset;
            HRESULT hr ;  hr = pCmdPtr.CreateInstance(__uuidof(Command)); char szConnectionString[255];
    getConnectionString(szConnectionString);
    _variant_t vtConnectionString(szConnectionString);
    pCmdPtr->put_ActiveConnection(vtConnectionString);        pCmdPtr->CommandType = adCmdStoredProc;
    pCmdPtr->CommandText =  szTypes ;
    hr = pCmdPtr->Parameters->Refresh();    long lBound,uBound;
       HRESULT hresult;
       // Getting Safe Array's Lower and Upper Bounds
       hresult = SafeArrayGetLBound(pSPFields, 1, &lBound);
           hresult = SafeArrayGetUBound(pSPFields, 1, &uBound);    variant_t vtParamVal;
    _variant_t Index;
    Index.vt = VT_I2;
    Index.iVal = 1 ;
       for (long iElements=lBound;iElements<=uBound;iElements++)
       {
    hresult = SafeArrayGetElement(pSPFields, &iElements, &vtParamVal);
    pCmdPtr->GetParameters()->GetItem(Index)->PutValue(vtParamVal) ;
    Index.iVal++ ;
       }        _variant_t vEffected ;
    pCmdPtr->Execute(&vEffected,NULL,NULL);

    // We Are Expecting That Stored Procedures Return ID for Entity to which 
    // NSERT/UPDATE/DELETE  operation is being performed
            return (long)pCmdPtr->Parameters->Item["RETURN_VALUE"]->Value  ;
        }
        catch(_com_error &e)
        {
           ATLTRACE((LPCSTR)e.Description());
        }
        return 0;
    }