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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,删除Oracle实例的注册表可以按照以下步骤进行操作: 1. 停止所有Oracle相关的服务。可以通过控制面板的管理工具中的服务选项停止所有以oracle开头的服务\[1\]。 2. 卸载Oracle10g数据库服务器组件。可以通过开始菜单中的oracleuniversalinstaller或者控制面板的添加/删除程序中的oracleuniversalinstaller来卸载已安装的程序\[2\]。 3. 手动删除注册表中与Oracle相关的内容。可以通过运行regedit命令打开注册表编辑器,然后删除HKEY_LOCAL_MACHINE\SOFTWARE下的Oracle选项,删除HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet下与oracle服务相关的选项,以及删除HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application中以Oracle开头的项\[2\]。 4. 删除TEMP目录下Oracle相关的文件夹。 5. 检查“开始”菜单中是否还有Oracle程序组,如果有,则将其删除。 6. 重新启动计算机。 7. 删除Windows系统安装磁盘中的ProgramFiles\Oracle目录。 8. 最后,删除Oracle安装目录。 这样就可以完全卸载Oracle实例的注册表了\[2\]。 请注意,对于ODBC的数据源DSN的移除,可以通过运行C:\WINDOWS\SysWOW64里的regedit.exe,找到要删除的DSN数据源连接的名称,直接删除,并重启计算机\[3\]。 #### 引用[.reference_title] - *1* *3* [怎样删除oracle注册表信息](https://blog.csdn.net/fygkchina/article/details/105535614)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [如何完全卸载oracle和删除oracle在注册表中的注册信息](https://blog.csdn.net/zy846771221/article/details/52689076)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值