技术原理
ODBC的架构包括三个主要组件:应用程序、ODBC驱动管理程序和ODBC驱动程序。应用程序使用ODBC API与ODBC驱动管理程序通信,而ODBC驱动管理程序负责加载和管理ODBC驱动程序。ODBC驱动程序则负责与特定的数据库通信,执行SQL查询并返回结果。操作系统分为UNIX/Linux和Windows两种,所以ODBC的架构也主要分为两种形式。整体的架构二者是一致的,均是应用程序通过驱动程序管理器调用数据库的驱动来连接数据库,区别在于驱动管理器与对应数据库的驱动不同。
ODBC的系统架构请参见图1。
ODBC支持的平台
GaussDB目前在以下环境中提供对ODBC3.5的支持。
| 操作系统 | 平台 |
|---|---|
| EulerOS V2.0SP5 | x86_64位 |
| EulerOS V2.0SP9 | ARM64位 |
| EulerOS V2.0SP10 | x86_64位 |
| EulerOS V2.0SP10 | ARM64位 |
| Windows 7 | x86_32位 |
| Windows 7 | x86_64位 |
| Windows Server 2008 | x86_32位 |
| Windows Server 2008 | x86_64位 |
| Kylin V10 | x86_64位 |
| Kylin V10 | ARM64位 |
| UnionTech V20 | x86_64位 |
| UnionTech V20 | ARM64位 |
| Huawei Cloud EulerOS 2.0 | x86_64位 |
| Huawei Cloud EulerOS 2.0 | ARM64位 |
| Suse 12.5 | x86_64位 |
| openEuler 22.03 LTS SP4 | ARM64位 |
| BCLinux-R8-U2 | x86_64位 |
| BCLINUX21.10 | x86_64位 |
| REDHAT 8.10 | x86_64位 |
| REDHAT 8.10 | ARM64位 |
| NFSChina Server 4.0 | x86_64位 |
| NFSChina Server 4.0 | ARM64位 |
| Ubuntu 22.04 LTS | x86_64位 |
| Ubuntu 22.04 LTS | ARM64位 |
| Suse15.7 | x86_64位 |
| Suse15.7 | ARM64位 |
| Huawei Cloud EulerOS 3.0 | x86_64位 |
| Huawei Cloud EulerOS 3.0 | ARM64位 |
| Kylin V11 | ARM64位 |
UNIX/Linux系统下的驱动程序管理器主要有unixODBC和iODBC,在这选择驱动管理器unixODBC-2.3.7作为连接数据库的组件。
Windows系统自带ODBC驱动程序管理器,在控制面板->管理工具中可以找到数据源(ODBC)选项。
当前数据库ODBC驱动基于开源版本,对于tinyint、smalldatetime、nvarchar2类型,在获取数据类型的时候,可能会出现不兼容的情况。
在Suse12.5上,默认没有libltdl库,需要安装libltdl这个库后,才可以使用ODBC。
接口介绍
ODBC提供了一组标准的C语言API接口,使得应用程序可以与不同类型的数据库进行通信。ODBC的接口被广泛用于各种编程语言和数据库管理系统之间的交互。表2对ODBC中常用的一些接口(函数)进行了介绍,涵盖了连接数据库、执行查询、获取结果等常见操作。
| 接口 | 功能描述 | 原型 | ||
|---|---|---|---|---|
| SQLAllocHandle | 分配环境、连接、语句或描述符的句柄。 |
| ||
| SQLConnect | 在驱动程序和数据源之间建立连接。连接上数据源之后,可以通过连接句柄访问到所有有关连接数据源的信息,包括程序运行状态、事务处理状态和错误信息。 |
| ||
| SQLPrepare | 准备一个将要使用的SQL语句。 需要注意的是,ODBC发送准备好的语句默认不支持内核复用计划,会导致每次执行都需要重新生成计划,CPU占用率高。如果业务对计划复用有需求,建议开启MaxCacheQueries参数。 |
| ||
| SQLExecDirect | 使用当前句柄,执行一条准备好的语句。对于一次只执行一条SQL语句,SQLExecDirect是最快的执行方式。 |
| ||
| SQLExecute | SQLExecute 用于执行一个已经通过 SQLPrepare 函数预编译的 SQL 语句。 |
| ||
| SQLGetData | SQLGetData返回结果集中某一列的数据。可以多次调用它来部分检索不定长度的数据。 |
| ||
| SQLFetch | 从结果集中取下一个行集的数据,并返回所有被绑定列的数据。 |
| ||
| SQLDisconnect | 关闭一个与特定连接句柄相关的连接。 |
|
