
# 技术原理
ODBC的架构包括三个主要组件：应用程序、ODBC驱动管理程序和ODBC驱动程序。应用程序使用ODBC API与ODBC驱动管理程序通信，而ODBC驱动管理程序负责加载和管理ODBC驱动程序。ODBC驱动程序则负责与特定的数据库通信，执行SQL查询并返回结果。操作系统分为UNIX/Linux和Windows两种，所以ODBC的架构也主要分为两种形式。整体的架构二者是一致的，均是应用程序通过驱动程序管理器调用数据库的驱动来连接数据库，区别在于驱动管理器与对应数据库的驱动不同。
ODBC的系统架构请参见[图1]。
图1ODBC系统架构   
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002620640645.png "点击放大")
#### ODBC支持的平台
GaussDB目前在以下环境中提供对ODBC3.5的支持。
表1ODBC支持的平台 
| 操作系统                     | 平台      |
|:---|:---|
| 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）选项。
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
当前数据库ODBC驱动基于开源版本，对于tinyint、smalldatetime、nvarchar2类型，在获取数据类型的时候，可能会出现不兼容的情况。
在Suse12.5上，默认没有libltdl库，需要安装libltdl这个库后，才可以使用ODBC。
#### 接口介绍
ODBC提供了一组标准的C语言API接口，使得应用程序可以与不同类型的数据库进行通信。ODBC的接口被广泛用于各种编程语言和数据库管理系统之间的交互。[表2]对ODBC中常用的一些接口（函数）进行了介绍，涵盖了连接数据库、执行查询、获取结果等常见操作。
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
详细接口请参见[ODBC接口参考](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0147.html)章节。
 表2ODBC常用接口参考 
| 接口             | 功能描述                                                                                                                                                                                                                                                                                                                                                        | 原型                                                                                                                                                                                                                                        |
|:---|:---|:---|
| SQLAllocHandle | 分配环境、连接、语句或描述符的句柄。                                                                                                                                                                                                                                                                                                                                          | ``` SQLRETURN SQLAllocHandle(SQLSMALLINT   HandleType, SQLHANDLE     InputHandle, SQLHANDLE     *OutputHandlePtr); ```                                                                                                                    |
| SQLConnect     | 在驱动程序和数据源之间建立连接。连接上数据源之后，可以通过连接句柄访问到所有有关连接数据源的信息，包括程序运行状态、事务处理状态和错误信息。                                                                                                                                                                                                                                                                                      | ``` SQLRETURN  SQLConnect(SQLHDBC        ConnectionHandle, SQLCHAR        *ServerName, SQLSMALLINT    NameLength1, SQLCHAR        *UserName, SQLSMALLINT    NameLength2, SQLCHAR        *Authentication, SQLSMALLINT    NameLength3); ``` |
| SQLPrepare     | 准备一个将要使用的SQL语句。 需要注意的是，ODBC发送准备好的语句默认不支持内核复用计划，会导致每次执行都需要重新生成计划，CPU占用率高。如果业务对计划复用有需求，建议开启[MaxCacheQueries](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0819.html#ZH-CN_TOPIC_0000002620639873__p14301153177)参数。 | ``` SQLRETURN SQLPrepare(SQLHSTMT      StatementHandle, SQLCHAR       *StatementText, SQLINTEGER    TextLength); ```                                                                                                                      |
| SQLExecDirect  | 使用当前句柄，执行一条准备好的语句。对于一次只执行一条SQL语句，SQLExecDirect是最快的执行方式。                                                                                                                                                                                                                                                                                                     | ``` SQLRETURN SQLExecDirect(SQLHSTMT         StatementHandle, SQLCHAR         *StatementText, SQLINTEGER       TextLength); ```                                                                                                           |
| SQLExecute     | SQLExecute 用于执行一个已经通过 SQLPrepare 函数预编译的 SQL 语句。                                                                                                                                                                                                                                                                                                             | ``` SQLRETURN SQLExecute(SQLHSTMT    StatementHandle); ```                                                                                                                                                                                |
| SQLGetData     | SQLGetData返回结果集中某一列的数据。可以多次调用它来部分检索不定长度的数据。                                                                                                                                                                                                                                                                                                                 | ``` SQLRETURN SQLGetData(SQLHSTMT        StatementHandle, SQLUSMALLINT    Col_or_Param_Num, SQLSMALLINT     TargetType, SQLPOINTER      TargetValuePtr, SQLLEN          BufferLength, SQLLEN          *StrLen_or_IndPtr); ```             |
| SQLFetch       | 从结果集中取下一个行集的数据，并返回所有被绑定列的数据。                                                                                                                                                                                                                                                                                                                                | ``` SQLRETURN SQLFetch(SQLHSTMT    StatementHandle); ```                                                                                                                                                                                  |
| SQLDisconnect  | 关闭一个与特定连接句柄相关的连接。                                                                                                                                                                                                                                                                                                                                           | ``` SQLRETURN SQLDisconnect(SQLHDBC    ConnectionHandle); ```                                                                                                                                                                             |
   
