Visual C++ 中的ODBC编程的介绍
什么是ODBC?
ODBC全称是Open Database Connectivity,即开放数据库连接,是微软公司提出的一种面向关系型数据库的连接规范,基于ODBC开发的应用程序可以访问各种类型的数据库。
ODBC编程的步骤
- 加载ODBC驱动程序。
- 建立连接并打开数据库。
- 执行SQL语句。
- 获取执行结果。
- 断开连接。
ODBC编程的基本概念
- DSN:Data Source Name,即数据源名称,用来标示一个数据源。
- 数据库连接句柄(HDBC):ODBC连接的句柄,用于建立、断开连接和事务处理等操作。
- 语句句柄(HSTMT):用于执行SQL语句和获取执行结果。
ODBC编程的示例
示例一:创建表格
假设需要创建一个名为"Student"的表格,该表格包含三个字段:"id"、"name"和"age"。
#include <cstdio>
#include <windows.h>
#include <sqlext.h>
#define MAXBUFLEN 256
int main()
{
SQLHENV henv; // 环境句柄
SQLHDBC hdbc; // 连接句柄
SQLHSTMT hstmt; // 语句句柄
SQLRETURN ret;
char* dsn = "TestDSN";
char* create_table_sql = "CREATE TABLE Student(id INT, name VARCHAR(20), age INT)";
// 1. 分配环境句柄
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLAllocHandle error!\n");
return -1;
}
// 2. 设置环境属性
ret = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLSetEnvAttr error!\n");
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
// 3. 分配连接句柄
ret = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLAllocHandle error!\n");
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
// 4. 连接数据库
ret = SQLConnect(hdbc, (SQLCHAR*)dsn, SQL_NTS, NULL, SQL_NTS, NULL, SQL_NTS);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLConnect error!\n");
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
// 5. 分配语句句柄
ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLAllocHandle error!\n");
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
// 6. 执行SQL语句
ret = SQLExecDirect(hstmt, (SQLCHAR*)create_table_sql, SQL_NTS);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLExecDirect error!\n");
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
// 7. 释放语句句柄
ret = SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLFreeHandle error!\n");
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
// 8. 断开连接
ret = SQLDisconnect(hdbc);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLDisconnect error!\n");
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
// 9. 释放连接句柄
ret = SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLFreeHandle error!\n");
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
// 10. 释放环境句柄
ret = SQLFreeHandle(SQL_HANDLE_ENV, henv);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLFreeHandle error!\n");
return -1;
}
return 0;
}
示例二:向表格中添加数据
假设已存在一个名为"Student"的表格,需要向表格中插入一条数据。
#include <cstdio>
#include <windows.h>
#include <sqlext.h>
#define MAXBUFLEN 256
int main()
{
SQLHENV henv; // 环境句柄
SQLHDBC hdbc; // 连接句柄
SQLHSTMT hstmt; // 语句句柄
SQLRETURN ret;
char* dsn = "TestDSN";
char* insert_sql = "INSERT INTO Student(id, name, age) VALUES(10001, '张三', 20)";
// 1. 分配环境句柄
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLAllocHandle error!\n");
return -1;
}
// 2. 设置环境属性
ret = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLSetEnvAttr error!\n");
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
// 3. 分配连接句柄
ret = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLAllocHandle error!\n");
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
// 4. 连接数据库
ret = SQLConnect(hdbc, (SQLCHAR*)dsn, SQL_NTS, NULL, SQL_NTS, NULL, SQL_NTS);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLConnect error!\n");
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
// 5. 分配语句句柄
ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLAllocHandle error!\n");
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
// 6. 执行SQL语句
ret = SQLExecDirect(hstmt, (SQLCHAR*)insert_sql, SQL_NTS);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLExecDirect error!\n");
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
// 7. 获取执行结果
SQLLEN row_count;
ret = SQLRowCount(hstmt, &row_count);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLRowCount error!\n");
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
printf("Inserted row count: %ld\n", row_count);
// 8. 释放语句句柄
ret = SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLFreeHandle error!\n");
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
// 9. 断开连接
ret = SQLDisconnect(hdbc);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLDisconnect error!\n");
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
// 10. 释放连接句柄
ret = SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLFreeHandle error!\n");
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
// 11. 释放环境句柄
ret = SQLFreeHandle(SQL_HANDLE_ENV, henv);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLFreeHandle error!\n");
return -1;
}
return 0;
}
以上是ODBC编程的介绍和示例。需要注意的是,在使用ODBC连接数据库时,需要安装对应的ODBC驱动程序和注册ODBC数据源。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Visual C++ 中的ODBC编程的介绍 - Python技术站