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"));
存储过程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++;
}