SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_henv); SQLSetEnvAttr(m_henv, 
    SQL_ATTR_ODBC_VERSION,
    (SQLPOINTER)SQL_OV_ODBC3,
     SQL_IS_INTEGER);
//分配连接句柄
SQLAllocHandle(SQL_HANDLE_DBC, m_henv, &m_hdbc);
//连接数据源
    ret = SQLConnect(m_hdbc,
(SQLCHAR *)("register"),(SQLSMALLINT)strlen("register"),
(SQLCHAR *)"",(SQLSMALLINT)strlen(""),
 (SQLCHAR *)"",(SQLSMALLINT)strlen(""));
SQLAllocHandle(SQL_HANDLE_STMT, m_hdbc, &m_hstmt); 
ret = SQLExecDirect(m_hstmt,(SQLTCHAR *)"SELECT * FROM user",(SQLINTEGER)strlen("select from user"));

解决方案 »

  1.   

    odbc访问oracle  procdure的源码:
    存储过程test1:
    create or replace procedure test1(i in number,result out varchar2) as
    begin
    /*dbms_output.put_line('输入参数是' || to_char(i));*/
    delete from a;
    insert into a values (17,'pretty pretty gril');
    result :='pretty pretty gril';
    end;
    在控制面板里odbc数据源新建一个user dsn.add->orace odbc driver->确定.data source name为oracle,desciption为 oracle.service name为oracle数据库的名字,我的cdwz.userid为system.(根据你自己的机子更改一下)
    新建一个win32 console project,加入文件odbc.cpp;
    #include <stdio.h>
    #include <windows.h>
    #include <sqlext.h>
    #include <sql.h>
    #include <odbcss.h>#define MAXBUFLEN 256
    SQLHENV henv = SQL_NULL_HENV;
    SQLHDBC hdbc = SQL_NULL_HDBC;
    void      ProcessLogMessages(SQLSMALLINT plm_handle_type,
                         SQLHANDLE plm_handle, char *logstring,
                         int ConnInd);
    int main()
    {
    SQLHSTMT hstmt = SQL_NULL_HSTMT;
    RETCODE retcode;
        retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);  

    SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);
    retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

    retcode = SQLConnect(hdbc, (SQLCHAR*) "oracle", SQL_NTS, (SQLCHAR*) "system", SQL_NTS,(SQLCHAR*) "manager", SQL_NTS);
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
        retcode = SQLPrepare(hstmt, (SQLCHAR *)"{call test1(?,?)}",  SQL_NTS);
    SQLINTEGER inparm;
    SQLCHAR outparm[30];
    ZeroMemory(outparm, 30);
    inparm=1;
    long length=SQL_NTS; retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG  , 
    SQL_INTEGER, 1, 0, &inparm, 0, &length);
        retcode = SQLBindParameter(hstmt,2, SQL_PARAM_OUTPUT, SQL_C_CHAR, 
    SQL_CHAR, 30, 0, outparm, 30, &length); retcode = SQLExecute(hstmt);
    if ( (retcode != SQL_SUCCESS) &&(retcode != SQL_SUCCESS_WITH_INFO) ) {
    ProcessLogMessages(SQL_HANDLE_STMT, hstmt,"SQLExecute() Failed\n\n", TRUE);
    }
        printf("%s\n", outparm);
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    retcode = SQLDisconnect(hdbc);
    retcode = SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    return 0;
    }
    void ProcessLogMessages(SQLSMALLINT plm_handle_type,
                      SQLHANDLE plm_handle,
                      char *logstring, int ConnInd)
    {
       RETCODE      plm_retcode = SQL_SUCCESS;
       UCHAR      plm_szSqlState[MAXBUFLEN] = "",
                plm_szErrorMsg[MAXBUFLEN] = "";
       SDWORD      plm_pfNativeError = 0L;
       SWORD      plm_pcbErrorMsg = 0;
       SQLSMALLINT   plm_cRecNmbr = 1;
       SDWORD      plm_SS_MsgState = 0, plm_SS_Severity = 0;
       SQLINTEGER   plm_Rownumber = 0;
       while (plm_retcode != SQL_NO_DATA_FOUND) {
          plm_retcode = SQLGetDiagRec(plm_handle_type, plm_handle,
             plm_cRecNmbr, plm_szSqlState, &plm_pfNativeError,
             plm_szErrorMsg, MAXBUFLEN - 1, &plm_pcbErrorMsg);  
          }
          plm_cRecNmbr++;