设为首页 收藏本站
查看: 719|回复: 0

[经验分享] ODBC访问Oracle实例(附代码)

[复制链接]

尚未签到

发表于 2016-7-27 11:20:29 | 显示全部楼层 |阅读模式
ODBC访问Oracle基本流程和代码:

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sql.h"
#include "sqlext.h"
void check_return( RETCODE rc, HENV henv, HDBC hdbc, HSTMT hstmt )
{
UCHAR state_str [SQL_MAX_MESSAGE_LENGTH];
SDWORD native_error;
UCHAR  error_msg [SQL_MAX_MESSAGE_LENGTH];
SWORD  error_msg_avail = SQL_MAX_MESSAGE_LENGTH - 1;
SWORD  error_msg_len;
RETCODE local_rc;
if (rc != SQL_ERROR && rc != SQL_SUCCESS_WITH_INFO )
{
return;
}
local_rc = SQLError (henv,hdbc,hstmt,state_str,&native_error,error_msg,error_msg_avail,&error_msg_len);
if (local_rc != SQL_SUCCESS && rc !=SQL_SUCCESS_WITH_INFO)
{
fprintf(stderr,"Uninterpretable error; exiting \n");
exit (EXIT_FAILURE);
}
if (rc == SQL_SUCCESS_WITH_INFO)
{
fprintf(stderr,"Fatal Error %s: %s\n", state_str,error_msg);
return;
}
fprintf(stderr,"Fatal Error %s: %s\n",state_str,error_msg);
exit (EXIT_FAILURE);
}
/*----------------------------------------------------------------------*/
int main (void)
{
HENV henv = SQL_NULL_HENV;
HDBC hdbc = SQL_NULL_HDBC;
HSTMT hstmt = SQL_NULL_HSTMT;
RETCODE rc;
char buf[257];
short buflen;
printf ("Initialize the environment structure.\n");
SQLAllocEnv (&henv);
printf ("Initialize the connection structure.\n");
SQLAllocConnect (henv,&hdbc);
printf("Load the ODBC driver.\n");
rc = SQLConnect(hdbc,(SQLCHAR*)"Oracle", SQL_NTS, //注明:DBDEMO是一个系统数据源,如果这样子写就不行L“DNS=DBDEMO”
(SQLCHAR*)"alien", SQL_NTS, (SQLCHAR*)"alienchang", SQL_NTS);
//rc = SQLDriverConnect (hdbc,0,(SQLCHAR*)"DSN=Oracle;UID=alien;PASSWD=alienchang",SQL_NTS,(UCHAR*) buf,sizeof (buf),&buflen,SQL_DRIVER_COMPLETE);
check_return (rc,henv,hdbc,hstmt);
printf ("Initialize the statement structure.\n");
SQLAllocStmt (hdbc,&hstmt);
SQLUINTEGER ID;
SQLCHAR Name[20];
SQLINTEGER szID = 0, szName=0;

/************************************************************************/
/* prepare, bind and execute                                            */
/************************************************************************/
SQLPrepare(hstmt, (SQLCHAR*)"begin say( ?, ?); end;", SQL_NTS);
SQLBindParameter(hstmt, 1, SQL_PARAM_OUTPUT, SQL_C_CHAR, SQL_VARCHAR, 10, 0,
&Name, 0, &szName);
SQLBindParameter(hstmt, 2, SQL_PARAM_OUTPUT, SQL_INTEGER, SQL_INTEGER, 64, 0,
&ID, 0, 0);
rc= SQLExecute(hstmt);
printf("%03d %d %s %d\n", ID, szID, Name, szName);

/************************************************************************/
/* SqlExecDirect Select                                                 */
/************************************************************************/
SQLSMALLINT cols;
SQLINTEGER   sID;
SQLCHAR   szAccount[50], szRegdate[50];
SQLINTEGER cbID, cbAccount, cbRegdate; //save the length of parameter
rc = SQLExecDirect (hstmt,(SQLCHAR*)"Select id, account, to_char(regdate,'yyyy-mm-dd hh24:mi:ss') from hx_account", SQL_NTS);
check_return (rc, henv, hdbc, hstmt);
while(SQL_NO_DATA != SQLFetch(hstmt)){
SQLGetData(hstmt, 1, SQL_C_ULONG, &sID, 0, &cbID);
//此处并没有指明BufferLength参数的值,是因为数据类型是定长的LONG型
SQLGetData(hstmt, 2, SQL_C_CHAR, szAccount, 50, &cbAccount);
SQLGetData(hstmt, 3, SQL_C_CHAR, szRegdate, 50,&cbRegdate);
printf("%8d %s %s\n", sID,  szAccount, szRegdate);
}
SQLCHAR colName[21];
SQLUINTEGER szCol;
SQLSMALLINT colNums, szCName, dType, Digits, isNULL;
rc = SQLNumResultCols(hstmt, &colNums);
rc = SQLDescribeCol(hstmt, 1, colName, 20, &szCName, &dType, &szCol, &Digits, &isNULL);
printf("列数:%d \n第一列:name:%s %d\t type: %d\t size: %d\t isnull:%d\n", colNums, colName, szCName, dType, szCol, isNULL);
/************************************************************************/
/* Create Table and Insert                                              */
/************************************************************************/
printf ("Creat table table \"foo\".\n");
rc = SQLExecDirect (hstmt,(SQLCHAR*)"CREATE TABLE foo (bar INTEGER)", SQL_NTS);
check_return (rc, henv, hdbc, hstmt);
printf ("Insert values into table \"foo\".\n");
rc = SQLExecDirect (hstmt,(SQLCHAR*)"INSERT INTO foo(bar) VALUES (1)", SQL_NTS);
check_return (rc, henv, hdbc, hstmt);
rc = SQLExecDirect (hstmt,(SQLCHAR*)"INSERT INTO foo(bar) VALUES (2)", SQL_NTS);
check_return (rc, henv, hdbc, hstmt);
rc = SQLExecDirect (hstmt,(SQLCHAR*)"INSERT INTO foo(bar) VALUES (3)", SQL_NTS);
check_return (rc, henv, hdbc, hstmt);
SQLINTEGER rowNums;
rc = SQLRowCount(hstmt, &rowNums);
printf("影响行数:%d\n", rowNums);
printf ("Drop table \"foo\".\n");
rc = SQLExecDirect (hstmt, (SQLCHAR*)"DROP TABLE foo", SQL_NTS);
check_return (rc,henv,hdbc,hstmt);
/*  We're done:free resources and exit*/
printf ("Free the statement handle.\n");
SQLFreeStmt (hstmt,SQL_DROP);
printf ("Disconnect from the data source.\n");
SQLDisconnect (hdbc);
printf ("Free the connection structure.\n");
SQLFreeConnect (hdbc);
printf ("Free the environment structure.\n");
SQLFreeEnv (henv);
printf ("Goodbye!\n");
exit (EXIT_SUCCESS);
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-250232-1-1.html 上篇帖子: Oracle import命令使用浅解 下篇帖子: ORACLE 10G 中的正则表达式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表