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

解决方案 »

  1.   

    直接性看不懂!小弟刚学数据库不久阿。
    不过我记得当初我看别人用java调用Excel中的数据时是在操作系统下设置的连接。
    这也能在系统下设置吗?
      

  2.   

    配置ODBC,建立ODBC和SQL SERVER的连接是在os下先设置好的
      

  3.   

    在控制面板里有个“数据源(ODBC)”,打开后选择“系统DSN”页面,选择“添加”并选择要连接的数据源类型,根据向导再选择服务器和登录方式......
      

  4.   

    按上面的朋友说的,我配置那ODBC
    结果是
    Microsoft SQL Server ODBC 驱动程序版本 03.80.0194数据源名称: AA
    数据源描述: 
    Server: BUCT-MARS
    数据库: liu
    语言: (Default)
    转换字符数据: Yes
    日志长运行查询: No
    日志驱动程序统计: No
    使用集成安全机制: Yes
    使用区域设置: No
    预定义的语句选项: 在断开连接时删除临时存储过程
    使用备用服务器: No
    使用 ANSI 引用的标识符: Yes
    使用 ANSI 的空值,填充和警告: Yes
    数据加密: No并且测试数据源也是成功的。
    我在VC编译器中写那:(没有写别的) EXEC SQL INCLUDE SQLCA;
    EXEC SQL BEGIN DECLARE SECTION; CHAR Sno(5);
    CHAR Con(3);
    INT Grade; EXEC SQL END DECLARE SECTION;void main()
    {
    EXEC  SQL CREATE TABLE SS
    (Sno CHAR(5) NOT NULL UNIQUE,
    Sname CHAR(20),
    Ssex CHAR(1),
    Sage INT
    );
    EXEC SQL TABLE :table_name;
    }
    编译有错:
    --------------------Configuration: sql - Win32 Debug--------------------
    Compiling...
    sql.cpp
    c:\documents and settings\lmarsy\桌面\sql.cpp(2) : error C2146: syntax error : missing ';' before identifier 'SQL'
    c:\documents and settings\lmarsy\桌面\sql.cpp(2) : error C2501: 'EXEC' : missing storage-class or type specifiers
    c:\documents and settings\lmarsy\桌面\sql.cpp(2) : fatal error C1004: unexpected end of file found
    Error executing cl.exe.sql.obj - 3 error(s), 0 warning(s)不解!