`
alienchang
  • 浏览: 30962 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ODBC访问Oracle实例(附代码)

阅读更多
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);
}

分享到:
评论

相关推荐

    基于vc的odbc连接oracle实例

    基于vc的odbc连接oracle实例, 源码,对于学习者很直观的

    javascript连接Oracle实例

    javascript连接Oracle实例,

    ODBC.zip_odbc _odbc oracle_visual c

    ODBC函数库 详细介绍ODBC接口 以及应用实例

    java基于odbc连接oracle的实现方法

    主要介绍了java基于odbc连接oracle的实现方法,结合实例形式分析了连接操作的具体步骤与相关实现技巧,需要的朋友可以参考下

    获取Oracle服务名

    本组件是为了获得本地Oracle本地oracle服务名所写的。 本组件使用 .net 2005 编写。所以使用该组件必须安装framwork 2.0 另附代码一份!!!

    Visual C++中的ODBC编程实例

    这些标准数据格式包括有:SQL Server、Access、Paradox、dBase、FoxPro、Excel、Oracle以及Microsoft Text。如果用户希望使用其他数据格式,则需要安装相应的ODBC驱动器及DBMS。  用户使用自己的DBMS数据库管理功能...

    操作系统重装后oracle数据库的恢复

    使用它能够创建、修改、删除,启动、停止本机上的oracle实例服务,有兴趣的,可以使用它实现一个单数据库多实例的案例。 c、使用sqlplus以dba身份登录确认数据库是否正常启动。 ******此处操作需要对oradim工具、...

    oracle 最大连接数问题

    oracle 在实际部署环境下,会存在session 不能操作250的限制

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    该资料是《Oracle SQL高级编程》的源代码 对应的书籍资料见: Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐) 基本信息 原书名: Pro Oracle SQL 原出版社: Apress 作者: (美)Karen Morton Kerry ...

    OTL+代码+实例+帮助

    This document describes the Oracle, ODBC and DB2-CLI Template Library, Version 4.0 (OTL 4.0). OTL 4.0 is a C++ library based on C++ templates. OTL 4.0 was designed as a combination of a C++ template ...

    JAVA上百实例源码以及开源项目源代码

    Java圆形按钮实例代码,含注释 两个目标文件,自绘button。 Java圆形电子时钟源代码 1个目标文件 内容索引:JAVA源码,系统相关,电子钟  用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有...

    oracle数据库ODBC连接-技术文档v1.0.docx

    第三方组态软件连接Oracle数据库做数据源实例分享,涉及oracle数据库客户端安装、odbc连接数据库、32位odbc连接64位数据库等。

    jsp+oracle

    使用JSP访问Oracle数据库,使用JDBC访问数据库,JDBC-ODBC桥作为JDBC API访问具体数据库的中间环节,是使用JSP访问数据库...访问Oracle 10g的实例来讲解如何在JSP中使用JDBC-ODBC桥结合ODBC驱动程序的机制来访问数据库。

    Visual C++程序开发范例宝典(光盘) 第八部分

    实例205 使用ODBC DSN连接SQL Server数据库 实例206 用ADO动态连接数据库 实例207 连接Oracle数据库 8.2 添加数据 实例208 利用INSERT语句批量插入数据 实例209 利用SELECT INTO生成临时表 8.3 更新数据 实例...

    orcle dblink 的创建与删除的详解及实例

    orcle dblink 的创建与删除的详解及实例 易混淆术语介绍:Db_name,Db_domain,Global_name,Service_name 删除 Dblink 报错 ORA-02024: database link not found 的解决方法 .

    Instant Client Setup

    是流行语言和环境的Oracle API的基础,包括Node.js、Python和PHP,以及为OCI、OCCI、JDBC、ODBC和Pro*C应用程序提供访问。包含的工具(如SQL Plus和Oracle Data Pump)提供快速方便的数据访问。

    JAVA上百实例源码以及开源项目

    Java圆形按钮实例代码,含注释 两个目标文件,自绘button。 Java圆形电子时钟源代码 1个目标文件 内容索引:JAVA源码,系统相关,电子钟  用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有...

Global site tag (gtag.js) - Google Analytics