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;
}