📅  最后修改于: 2023-12-03 15:03:21.260000             🧑  作者: Mango
ODBC全称为Open Database Connectivity,即开放式数据库连接。ODBC是Microsoft公司推出的面向数据库的应用程序接口(API),它使得应用程序可以通过SQL来访问不同的数据库。
ODBC是一个由C语言编写的专门用于访问数据库的API(应用程序接口)。ODBC提供统一的访问数据库的方法,使得开发人员无论使用哪一种数据库管理系统,都可以用相似的方法来访问数据。
ODBC驱动程序负责实现ODBC API,使得ODBC API能够访问数据库管理系统。ODBC驱动程序其中一部分是标准的,另一部分则由数据库管理系统厂商来提供。ODBC驱动程序分为两类:
ODBC桥接驱动程序是为兼容旧的应用程序而设计的,它们可以将ODBC API调用转换成相应数据库管理系统的本地API调用,因此它们是ODBC与数据库管理系统之间的中介。
Native ODBC 驱动程序是原生支持ODBC API的,它们可以直接将ODBC API调用映射到数据库管理系统支持的本地API调调用中,从而不需要通过桥接驱动程序来实现。
ODBC是从1988年开始的,当时,每个应用程序都必须使用独立的API来访问数据库,这样导致了多种类型的应用程序都不兼容,对于使用不同的数据库的应用程序,代码无法重用,从而造成不便和浪费。为了克服这种情况,Microsoft和IBM共同创建了ODBC标准。
ODBC API封装了对于所有支持ODBC标准的数据库类总的操作,每个操作都对应特定的SQL语句,应用程序可以将这些操作封装为函数或方法调用,在应用程序中使用,从而可以访问数据库。ODBC还提供流式访问的函数,应用程序可以使用类似于文件IO的方法从数据库中读取或修改数据。
ODBC API支持标准的SQL语言,所以无论是什么类型的数据库系统,你只需学习一种常用的SQL语言,就可以访问所有的支持ODBC标准的数据库。
ODBC API不是线程安全的,但是ODBC驱动程序可以支持多线程环境下将ODBC API转换成线程安全的本地API调用。
ODBC的使用分为两个步骤:
首先需要在ODBC控制面板中创建一个ODBC数据源,这个数据源与一个实际的数据库相关联。数据源中会包括一个ODBC驱动程序和数据库服务的连接信息,也就是说,访问这个数据源就是访问具体的数据库。
编写ODBC应用程序时,需要使用ODBC API来访问数据库。在使用ODBC API之前需要调用SQLAllocHandle函数,来分配ODBC API所需要的句柄,每个句柄对应一个ODBC对象,比如,SQL_HANDLE_ENV句柄对应环境句柄。
以下是一个ODBC程序的基本流程:
#include <windows.h>// Windows API头文件
#include <sql.h> // ODBC头文件
#include <sqlext.h> // ODBC扩展头文件
SQLHENV henv; // 环境句柄
SQLHDBC hdbc; // 连接句柄
SQLCHAR* conn_str; // 连接字符串
SQLCHAR* select_stmt; // SQL语句:SELECT
SQLHSTMT hstmt; // 语句句柄:
SQLRETURN rc; // 返回码
int main(int argc, char* argv[])
{
// 分配环境句柄
rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
// 设置ODBC版本号
rc = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, SQL_IS_UINTEGER);
// 分配连接句柄
rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
// 连接数据库
conn_str = (SQLCHAR*)"DRIVER={MySQL ODBC 8.0 ANSI Driver};SERVER=localhost;"
"DATABASE=test;USER=root;PASSWORD=pa$$word;OPTION=3;";
rc = SQLDriverConnect(hdbc, NULL, conn_str, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT);
// 执行查询语句
select_stmt = (SQLCHAR*)"SELECT * FROM employee";
rc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
rc = SQLExecDirect(hstmt, select_stmt, SQL_NTS);
// 获取查询结果
int id;
char name[50];
int salary;
while (SQLFetch(hstmt) != SQL_NO_DATA_FOUND) {
SQLGetData(hstmt, 1, SQL_C_SSHORT, &id, 0, NULL);
SQLGetData(hstmt, 2, SQL_C_CHAR, name, sizeof(name), NULL);
SQLGetData(hstmt, 3, SQL_C_SLONG, &salary, 0, NULL);
printf("%d %s %d\n", id, name, salary);
}
// 关闭连接
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}
ODBC是开发人员的一个强大工具,因为它使得开发人员不用考虑应用程序与数据库管理系统之间的低级协议,从而可以专注于应用程序本身。此外,由于ODBC是一个标准的API,它使得应用程序可以访问不同类型的数据库管理系统,从而能够实现多平台编程。