更新时间:2026-07-28 GMT+08:00
分享

技术原理

ODBC的架构包括三个主要组件:应用程序、ODBC驱动管理程序和ODBC驱动程序。应用程序使用ODBC API与ODBC驱动管理程序通信,而ODBC驱动管理程序负责加载和管理ODBC驱动程序。ODBC驱动程序则负责与特定的数据库通信,执行SQL查询并返回结果。操作系统分为UNIX/Linux和Windows两种,所以ODBC的架构也主要分为两种形式。整体的架构二者是一致的,均是应用程序通过驱动程序管理器调用数据库的驱动来连接数据库,区别在于驱动管理器与对应数据库的驱动不同。

ODBC的系统架构请参见图1

图1 ODBC系统架构

ODBC支持的平台

GaussDB目前在以下环境中提供对ODBC3.5的支持。

表1 ODBC支持的平台

操作系统

平台

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中常用的一些接口(函数)进行了介绍,涵盖了连接数据库、执行查询、获取结果等常见操作。

详细接口请参见ODBC接口参考章节。

表2 ODBC常用接口参考

接口

功能描述

原型

SQLAllocHandle

分配环境、连接、语句或描述符的句柄。

1
2
3
SQLRETURN SQLAllocHandle(SQLSMALLINT   HandleType,    
                         SQLHANDLE     InputHandle,     
                         SQLHANDLE     *OutputHandlePtr);

SQLConnect

在驱动程序和数据源之间建立连接。连接上数据源之后,可以通过连接句柄访问到所有有关连接数据源的信息,包括程序运行状态、事务处理状态和错误信息。

1
2
3
4
5
6
7
SQLRETURN  SQLConnect(SQLHDBC        ConnectionHandle,
                      SQLCHAR        *ServerName,
                      SQLSMALLINT    NameLength1,
                      SQLCHAR        *UserName,
                      SQLSMALLINT    NameLength2,
                      SQLCHAR        *Authentication,
                      SQLSMALLINT    NameLength3);

SQLPrepare

准备一个将要使用的SQL语句。

需要注意的是,ODBC发送准备好的语句默认不支持内核复用计划,会导致每次执行都需要重新生成计划,CPU占用率高。如果业务对计划复用有需求,建议开启MaxCacheQueries参数。

1
2
3
SQLRETURN SQLPrepare(SQLHSTMT      StatementHandle,    
                     SQLCHAR       *StatementText,     
                     SQLINTEGER    TextLength);

SQLExecDirect

使用当前句柄,执行一条准备好的语句。对于一次只执行一条SQL语句,SQLExecDirect是最快的执行方式。

1
2
3
SQLRETURN SQLExecDirect(SQLHSTMT         StatementHandle,
                        SQLCHAR         *StatementText,     
                        SQLINTEGER       TextLength);

SQLExecute

SQLExecute 用于执行一个已经通过 SQLPrepare 函数预编译的 SQL 语句。

1
SQLRETURN SQLExecute(SQLHSTMT    StatementHandle);

SQLGetData

SQLGetData返回结果集中某一列的数据。可以多次调用它来部分检索不定长度的数据。

1
2
3
4
5
6
SQLRETURN SQLGetData(SQLHSTMT        StatementHandle,
                     SQLUSMALLINT    Col_or_Param_Num,
                     SQLSMALLINT     TargetType,
                     SQLPOINTER      TargetValuePtr,
                     SQLLEN          BufferLength,
                     SQLLEN          *StrLen_or_IndPtr);

SQLFetch

从结果集中取下一个行集的数据,并返回所有被绑定列的数据。

1
SQLRETURN SQLFetch(SQLHSTMT    StatementHandle);

SQLDisconnect

关闭一个与特定连接句柄相关的连接。

1
SQLRETURN SQLDisconnect(SQLHDBC    ConnectionHandle);

相关文档