ODBC的工作流程
使用ODBC的应用系统大致的工作流程如下图所示。下面将结合具体的应用实例来介绍如何使用ODBC开发应用系统。

【例1】将KingbaseES数据库中Student表的数据备份到SQL Server数据库中。
该应用涉及两个不同的关系数据库管理系统中的数据源,因此使用ODBC来开发应用程序,只要改变应用程序中连接函数(SQLConnect)的参数,就可以连接不同关系数据库管理系统的驱动程序,连接两个数据源。
在应用程序运行前,已经在KingbaseES和SQL Server中分别建立了Student关系表。应用程序要执行的操作是:在KingbaseES上执行SELECT * FROM Student:把获取的结果集,通过多次执行INSERT语句插入到SQL Server的Student表中。
①配置数据源
配置数据源有两种方法:
(1)运行数据源管理工具来进行配置。
(2)使用Driver Manager提供的ConfigDsn函数来增加、修改或删除数据源。这种方法特别适用于在应用程序中创建的临时使用的数据源。
【例2】采用第一种方法创建数据源。因为要同时用到KingbaseES和SQL Server,所以分别建立两个数据源,将其取名为KingbaseES ODBC和SQL Server。不同的驱动器厂商提供了不同的配置数据源界面,建立这两个数据源的具体步骤从略。程序源码如下。
左右滑动或点击查看全图
②初始化环境
由于还没有和具体的驱动程序相关联,所以不是由具体的数据库管理系统驱动程序来进行管理,而是由Driver Manager来进行控制并配置环境属性。直到应用程序通过调用连接函数和某个数据源进行连接后,Driver Manager才调用所连的驱动程序中的SQLAllocHandle来真正分配环境句柄的数据结构。
③建立连接
应用程序调用SQLAllocHandle分配连接句柄,通过SQLConnect、SQLDriverConnect或SQLBrowseConnect与数据源连接。其中SQLConnect是最简单的连接函数,输入参数为配置好的数据源名称、用户ID和口令。本例中KingbaseESODBC为数据源名字,SYSTEM为用户名,而MANAGER为用户密码,注意系统对用户名和密码大小写的要求。
④分配语句句柄
在处理任何SQL语句之前,应用程序还需要首先分配一个语句句柄。语句句柄含有具体的SQL语句以及输出的结果集等信息。在后面的执行函数中,语句句柄都是必要的输入参数。本例中分配了两个语句句柄,一个用来从KingbaseES中读取数据产生结果集(kinghstmt),另一个用来向SQLServer插入数据(serverhstmt)。
应用程序还可以通过SQLtStmtAttr来设置语句属性(也可以使用默认值)。
⑤执行SQL语句
应用程序处理SQL语句的方式有两种:预处理(SQLPrepare、SQLExecute适用于语句的多次执行)或直接执行(SQLExecdirect)。如果SQL语句含有参数,应用程序为每个参数调用SQLBindParameter,并把它们绑定至应用程序变量。这样应用程序可以直接通过改变应用程序缓冲区的内容从而在程序中动态改变SQL语句的具体执行。接下来的操作则会根据语句类型来进行相应处理。
(1)对于有结果集的语句(select或是编目函数),则进行结果集处理。
(2)对于没有结果集的函数,可以直接利用本语句句柄继续执行新的语句或是获取行计数(本次执行所影响的行数)之后继续执行。
在本例中,使用SQLExecdirect获取KingbaseES中的结果集,并将结果集根据各列不同的数据类型绑定到用户程序缓冲区。
在插入数据时采用了预编译的方式,首先通过SQLPrepare来预处理SQL语句,然后将每一列绑定到用户缓冲区。
⑥结果集处理
应用程序可以通过SQLNumResultCols来获取结果集中的列数,通过SQL DescribeCol或是SQLColAttrbute函数来获取结果集每一列的名称、数据类型、精度和范围。以上两步对于信息明确的函数是可以省略的。
ODBC中使用游标来处理结果集数据。游标可以分为forward-only游标和可滚动(scroll)游标。Forward-only游标只能在结果集中向前滚动,它是ODBC的默认游标类型。可滚动(scroll)游标又可以分为静态(static)、动态(dynamic)、码集驱动(keyset-driven)和混合型(mixed)4种。
ODBC游标的打开方式不同于嵌入式SQL,不是显式声明而是系统自动产生一个游标,当结果集刚刚生成时,游标指向第一行数据之前。应用程序通过SQLBindCol把查询结果绑定到应用程序缓冲区中,通过SQLFetch或是SQLFetchScroll来移动游标获取结果集中的每一行数据。对于如图像这类特别的数据类型,当一个缓冲区不足以容纳所有数据时,可以通过SQLGetdata分多次获取。最后通过SQLClosecursor来关闭游标。
⑦中止处理
处理结束后,应用程序将首先释放语句句柄,然后释放数据库连接并与数据库服务器断开,最后释放ODBC环境。
小 结
本章讲解了如何使用编程方法对数据库进行操纵的技术。
嵌入式SQL把SQL语句嵌入到某种高级语言中,SQL语句用来存取数据库中的数据,主语言用来控制程序流程以及对取出的数据做进一步加工处理,利用高级语言的强大计算能力来实现复杂应用的需求。
SQL与主语言具有不同的数据处理方式。SQL是面向集合的,而主语言是面向记录的。所以,嵌入式SQL用游标来协调这两种不同的处理方式。要掌握游标的概念,学会用游标来编写实际的应用程序。
本章讲解了过程化SQL以及如何用过程化SQL编写存储过程和自定义函数。存储过程和自定义函数经编译和优化后存储在数据库服务器中,运行效率高,客户机和服务器之间的通信量小,可以集中控制管理,因此被广泛使用。
本章还阐述了ODBC的工作原理和工作流程。使用这些技术编写的应用程序可移植性好,能同时访问不同的数据库,共享多个数据资源。











