cC语言连接Oracle12c实现技术研究(c 连接oracle12)
C语言是计算机科学中的一门基础语言,而Oracle12c是一款领先的关系型数据库软件。将C语言与Oracle12c相连接,可以实现更高效的数据处理和存储。下面将介绍如何通过C语言连接Oracle12c,以及实现过程中的技术研究。
一、连接Oracle12c
1.安装Oracle12c客户端
在安装Oracle12c客户端前需要注意以下几个问题:操作系统的对应版本、数据库驱动的对应版本、Visual C++的对应版本等。具体的安装步骤如下:
(1)下载安装包:从Oracle官网下载Oracle12c客户端,选择与操作系统相对应的版本。
(2)运行安装程序:运行下载好的安装程序,按照提示进行安装。
(3)设置环境变量:在系统环境变量中设置ORACLE_HOME和PATH两个变量,用于连接数据库。
2.进行数据库连接
连接Oracle12c需要先创建连接字符串,其中包括服务器名、端口、用户名、密码等信息。如果连接成功,即可进行查询或者更新操作。以下是连接Oracle12c的代码:
#include
#include
#include //用于连接Oracle12c的库
#define MAX_COL 50#define MAX_SQL_LEN 2000
#define UID_LEN 30#define PASS_LEN 30
#define SERVER_LEN 50
char uid[UID_LEN];char pass[PASS_LEN];
char server[SERVER_LEN];
int mn(){
//读取用户ID、密码、服务器名 printf("Please enter your ID:\n");
scanf("%s", uid); printf("Please enter your password:\n");
scanf("%s", pass); printf("Please enter your server name:\n");
scanf("%s", server);
//连接Oracle12c数据库 SQLHENV henv;
SQLHDBC hdbc; SQLHSTMT hstmt;
char sql[MAX_SQL_LEN]; int retcode;
SQLCHAR *outdata[MAX_COL]; SQLLEN outlength[MAX_COL];
//分配环境句柄 retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
//设置环境属性 retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
//分配数据库连接句柄 retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
//设置登录认证属性 retcode = SQLSetConnectAttr(hdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_NTS);
//连接数据库 retcode = SQLDriverConnect(hdbc, NULL, (SQLCHAR*)server, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);
//分配语句句柄 retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (SQL_SUCCEEDED(retcode)) {
printf("Connect Oracle12c successfully!\n"); }
else {
printf("Fled to connect Oracle12c!\n"); }
//关闭连接 SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv); return EXIT_SUCCESS;
}
二、实现技术研究
1.封装连接
对于连接数据库的代码,可以将其封装成函数,从而方便其他模块的调用。以下是封装连接的代码:
#include
#include
#include //用于连接Oracle12c的库
#define MAX_COL 50#define MAX_SQL_LEN 2000
#define UID_LEN 30#define PASS_LEN 30
#define SERVER_LEN 50
SQLHDBC hdbc;SQLHSTMT hstmt;
//连接Oracle12c数据库int ConnectOracle12c(char *uid, char *pass, char *server)
{ SQLHENV henv;
int retcode;
//分配环境句柄 retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
//设置环境属性 retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
//分配数据库连接句柄 retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
//设置登录认证属性 retcode = SQLSetConnectAttr(hdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_NTS);
//连接数据库 retcode = SQLDriverConnect(hdbc, NULL, (SQLCHAR*)server, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);
//分配语句句柄 retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (SQL_SUCCEEDED(retcode)) {
printf("Connect Oracle12c successfully!\n"); return 0;
} else
{ printf("Fled to connect Oracle12c!\n");
return -1; }
}
//关闭连接int CloseOracle12c()
{ int retcode = SQL_SUCCESS;
retcode = SQLFreeHandle(SQL_HANDLE_STMT, hstmt); if (SQL_SUCCEEDED(retcode))
{ printf("Close statement handle successfully!\n");
} else
{ printf("Fled to close statement handle!\n");
}
retcode = SQLDisconnect(hdbc); if (SQL_SUCCEEDED(retcode))
{ printf("Disconnect Oracle12c successfully!\n");
} else
{ printf("Fled to disconnect Oracle12c!\n");
}
retcode = SQLFreeHandle(SQL_HANDLE_DBC, hdbc); if (SQL_SUCCEEDED(retcode))
{ printf("Close connection handle successfully!\n");
} else
{ printf("Fled to close connection handle!\n");
}
SQLFreeHandle(SQL_HANDLE_ENV, henv); return 0;
}
int mn(){
char uid[UID_LEN]; char pass[PASS_LEN];
char server[SERVER_LEN];
//读取用户ID、密码、服务器名 printf("Please enter your ID:\n");
scanf("%s", uid); printf("Please enter your password:\n");
scanf("%s", pass); printf("Please enter your server name:\n");
scanf("%s", server);
//连接Oracle12c数据库 if (ConnectOracle12c(uid, pass, server) == 0)
{ //进行查询或者更新操作...
}
//关闭连接 CloseOracle12c();
return EXIT_SUCCESS;}
2.增加日志
在实际应用中,需要对连接数据库的操作进行记录,这样可以方便排错和检索。因此,在连接数据库的代码中,可以增加日志功能,记录连接的状态以及错误信息。以下是增加日志的代码:
#include
#include
#include //用于连接Oracle12c的库
#define MAX_COL 50#define MAX_SQL_LEN 2000
#define UID_LEN 30#define PASS_LEN 30
#define SERVER_LEN 50
SQLHDBC hdbc;SQLHSTMT hstmt;
//连接Oracle12c数据库int ConnectOracle12c(char *uid, char *pass, char *server)
{ SQLHENV henv;
int retcode;
//分配环境句柄 retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
//设置环境属性 retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
//分配数据库连接句柄 retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
//设置登录认证属性 retcode = SQLSetConnectAttr(hdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_NTS);
//连接数据库 retcode = SQLDriverConnect(hdbc, NULL, (SQLCHAR*)server, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);
//分配语句句柄 retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (SQL_SUCCEEDED(retcode)) {
printf("Connect Oracle12c successfully!\n"); return 0;
} else
{ printf("Fled to connect Oracle12c!\n");
SQLCHAR Message[SQL_MAX_MESSAGE_LENGTH + 1]; SQLCHAR SqlState