c语言之odbc编程指南.docx
《c语言之odbc编程指南.docx》由会员分享,可在线阅读,更多相关《c语言之odbc编程指南.docx(23页珍藏版)》请在冰点文库上搜索。
c语言之odbc编程指南
DM4ODBC编程指南
本章结合DM4数据库的特点,比较全面系统的介绍ODBC的基本概念以及DM4ODBCDRIVER的使用方法,以便用户更好地使用DM4ODBC编写应用程序。
ODBC提供给你访问不同类型的数据库的途径。
结构化查询语言SQL是一种用来访问数据库的语言。
通过使用ODBC,应用程序能够使用相同的源代码和各种各样的数据库交互。
这使得开发者不需要以特殊的数据库管理系统DBMS为目标,或者了解不同支撑背景的数据库的详细细节,就能够开发和发布客户/服务器应用程序。
DM4ODBC3.0遵照MicrosoftODBC3.0规范设计与开发,实现了ODBC应用程序与DM4的互连接口。
用户可以直接调用DM4ODBC3.0接口函数访问DM4,也可以使用可视化编程工具如C++Builder、PowerBuilder等利用DM4ODBC3.0访问DM4。
在DM4客户端软件安装过程中,如果选择了安装ODBC驱动程序的相关选项,安装工具可完成将DM4ODBC3.0驱动程序复制到硬盘,并在Windows注册表中登记DM4ODBC驱动程序信息的工作。
要进一步使用DM4ODBC驱动程序,请阅读本章以了解ODBC数据源管理方法。
1数据类型
客户程序可以通过SQLGetTypeInfo函数来获取DM4ODBC3.0支持的数据类型信息。
由SQLGetTypeInfo返回的数据类型是数据源所支持的数据类型,它们是预备用于DDL(DataDefinitionLanguage)语句的。
调用DM4ODBC3.0的SQLGetTypeInfo,返回支持的数据类型如表1.1如下:
表1:
数据类型列表
类型名类型描述
char(n)固定串长度为n的字符串,n<=8000
Varchar(n)最大字符串长度为n的可变长度字符串,n<=8000
binary(n)固定长度为n的二进制数据,n<=8000
varbinary(n)最大长度为n的可变长度二进制数据,n<=8000
Image 影像数据类型,可变长度的二进制数据,最大长度为2G-1
Text文本数据类型,可变长度的字符数据,最大长度为2G-1
Bit单个二进制位数据
Tinyint精度为3,刻度为0的有符号精确数字,取值范围-128…127
Smallint精度为5,刻度为0的有符号精确数字,取值范围-32,768…32,767
Int精度为10,刻度为0的有符号精确数字,取值范围-2[31]…2[31]-1
Bigint精度为19,刻度为0的有符号精确数字值,取值范围-2[63]…2[63]-1
Real二进制精度为24的有符号近似数字值,取值范围0或者绝对值为:
10[-38]…10[38]
Float二进制精度为53的有符号近似数字值,取值范围0或者绝对值为:
10[-308]…10[308]
Double二进制精度为53的有符号近似数字值,取值范围0或者绝对值为:
10[-308]…10[308]
decimal(p,s)精度为p,刻度为s的有符号精确数字值,1≤p≤53,s≤p
numeric(p,s)精度为p,刻度为s的有符号精确数字值,1≤p≤38,s≤p
Money精度固定为19,刻度固定为4的精确有符号数值
Date日期数据类型,年月日字段,格式与Gregorian(罗马)日历一致
Time(p)时间数据类型,时分秒字段,精度p指定了秒的精度
timestamp(p)时间戳数据类型,年月日时分秒字段,精度p指定了秒的精度
intervalyear(p)年间隔,即两个日期之间的年数字,p为时间间隔的首项字段精度(后面简称为:
首精度)
intervalmonth(p)月间隔,即两个日期之间的月数字,p为时间间隔的首精度
intervalyear(p)tomonth年月间隔,即两个日期之间的年月数字,p为时间间隔的首精度
intervalday(p)日间隔,即为两个日期/时间之间的日数字,p为时间间隔的首精度
intervalhour(p)时间隔,即为两个日期/时间之间的时数字,p为时间间隔的首精度
intervalminute(p)分间隔,即为两个日期/时间之间的分数字,p为时间间隔的首精度
intervalsecond(p,q)秒间隔,即为两个日期/时间之间的秒数字,p为时间间隔的首精度,q为时间间隔秒精度
intervalday(p)tohour日时间隔,即为两个日期/时间之间的日时数字,p为时间间隔的首精度
intervalday(p)tominute日时分间隔,即为两个日期/时间之间的日时分数字,p为时间间隔的首精度
Intervalday(p)tosecond(q)日时分秒间隔,即为两个日期/时间之间的日时分秒数字,p为时间间隔的首精度,q为时间间隔秒精度
Intervallhour(p)tominute时分间隔,即为两个日期/时间之间的时分数字,p为时间间隔的首精度
intervalhour(p)tosecond(q)时分秒间隔,即为两个日期/时间之间的时分秒数字,p为时间间隔的首精度,q为时间间隔秒精度
Intervalminute(p)tosecond(q)分秒间隔,即为两个日期/时间之间的分秒间隔,p为时间间隔的首精度,q为时间间隔秒精度
注:
要支持interval数据类型,必须在数据源中进行设置,否则将不提供对该类数据类型的支持。
2支持的函数
客户程序可以通过SQLGetFunctions函数来获取DM4ODBC3.0支持的函数信息。
由SQLGetFunctions返回的函数列表是数据源所支持的函数。
以下按照类型分类列出了DM4ODBCx提供的函数。
应用程序能够通过调用SQLGetFunctions来获得指定函数的支持信息。
1.连接到数据源
下面的函数用于连接到数据源:
(1)SQLAllocHandle:
分配环境、连接、语句或者描述符句柄。
(2)SQLConnect:
建立与驱动程序或者数据源的连接。
访问数据源的连接句柄包含了包括状态、事务申明和错误信息的所有连接信息。
(3)SQLDriverConnect:
与SQLConnect相似,用来连接到驱动程序或者数据源。
但它比SQLConnect支持数据源更多的连接信息,它提供了一个对话框来提示用户设置所有的连接信息以及系统信息表没有定义的数据源。
(4)SQLBrowseConnect:
支持一种交互方法来检索或者列出连接数据源所需要的属性和属性值。
每次调用函数可以获取一个连接属性字符串,当检索完所有的属性值,就建立起与数据源的连接,并且返回完整的连接字符串,否则提示缺少的连接属性信息,用户根据此信息重新输入连接属性值再次调用此函数进行连接。
2.获取驱动程序和数据源信息
下面的函数用来获取驱动程序和数据源信息:
(1)SQLDataSources:
能够被调用多次来获取应用程序使用的所有数据源的名字。
(2)SQLDrivers:
返回所有安装过的驱动程序清单,包括对它们的描述以及属性关键字。
(3)SQLGetInfo:
返回连接的驱动程序和数据源的元信息。
(4)SQLGetFunctions:
返回指定的驱动程序是否支持某个特定函数的信息。
(5)SQLGetTypeInfo:
返回指定的数据源支持的数据类型的信息。
设置或者获取驱动程序属性
下面的函数用来设置或者获取驱动程序属性:
(1)SQLSetConnectAttr:
设置连接属性值。
(2)SQLGetConnectAttr:
返回连接属性值。
(3)SQLSetEnvAttr:
设置环境属性值。
(4)SQLGetEnvAttr:
返回环境属性值。
(5)SQLSetStmtAttr:
设置语句属性值。
(6)SQLGetStmtAttr:
返回语句属性值。
4.设置或者获取描述符字段
下面的函数用来设置或者获取描述符字段:
(1)SQLGetDescField:
返回单个描述符字段的值。
(2)SQLGetDescRec:
返回当前描述符记录的多个字段的值。
(3)SQLSetDescField:
设置单个描述符字段的值。
(4)SQLSetDescRec:
设置描述符记录的多个字段。
5.准备SQL语句
下面的函数用来准备SQL语句:
(1)SQLPrepare:
准备要执行的SQL语句。
(2)SQLBindParameter:
在SQL语句中分配参数的缓冲区。
(3)SQLGetCursorName:
返回与语句句柄相关的游标名称。
(4)SQLSetCursorName:
设置与语句句柄相关的游标名称。
(5)SQLSetScrollOptions:
设置控制游标行为的选项。
6.提交SQL请求
下面的函数用来提交SQL请求:
(1)SQLExecute:
执行准备好的SQL语句。
(2)SQLExecDirect:
执行一条SQL语句。
(3)SQLNativeSql:
返回驱动程序对一条SQL语句的翻译。
(4)SQLDescribeParam:
返回对SQL语句中指定参数的描述。
(5)SQLNumParams:
返回SQL语句中参数的个数。
(6)SQLParamData:
与SQLPutData联合使用在运行时给参数赋值。
(7)SQLPutData:
在SQL语句运行时给部分或者全部参数赋值。
7.检索结果集及其相关信息
下面的函数用来检索结果集及其相关信息:
(1)SQLRowCount:
返回INSERT、UPDATE或者DELETE等语句影响的行数。
(2)SQLNumResultCols:
返回结果集中列的数目。
(3)SQLDescribeCol:
返回结果集中列的描述符记录。
(4)SQLColAttribute:
返回结果集中列的属性。
(5)SQLBindCol:
为结果集中的列分配缓冲区。
(6)SQLFetch:
在结果集中检索下一行元组。
(7)SQLFetchScroll:
返回指定的结果行。
(8)SQLGetData:
返回结果集中当前行某一列的值。
(9)SQLSetPos:
在取到的数据集中设置游标的位置。
这个记录集中的数据能够刷新、更新或者删除。
(10)SQLBulkOperations:
执行块插入和块书签操作,其中包括根据书签更新、删除或者取数据。
(11)SQLMoreResults:
确定是否能够获得更多的结果集,如果能就执行下一个结果集的初始化操作。
(12)SQLGetDiagField:
返回一个字段值或者一个诊断数据记录。
(13)SQLGetDiagRec:
返回多个字段值或者一个诊断数据记录。
8.取得数据源系统表的信息
下面的函数用来取得数据源系统表的信息:
(1)SQLColumnPrivileges:
返回一个关于指定表的列的列表以及相关的权限信息。
(2)SQLColumns:
返回指定表的列信息的列表。
(3)SQLForeignKeys:
返回指定表的外键信息的列表。
(4)SQLPrimaryKeys:
返回指定表的主键信息的列表。
(5)SQLProcedureColumns:
返回指定存储过程的参数信息的列表。
(6)SQLProcedures:
返回指定数据源的存储过程信息的列表。
(7)SQLSpecialColumns:
返回唯一确定某一行的列的信息,或者当某一事务修改一行的时候自动更新各列的信息。
(8)SQLStatistics:
返回一个单表的相关统计信息和索引信息。
(9)SQLTablePrivileges:
返回相关各表的名称以及相关的权限信息。
(10)SQLTables:
返回指定数据源中表信息。
9.终止语句执行
下面的函数用来终止语句执行:
(1)SQLFreeStmt:
终止语句执行,关闭所有相关的游标,放弃没有提交的结果,选择释放与指定语句句柄相关的资源。
(2)SQLCloseCursor:
关闭一个打开的游标,放弃没有提交的结果。
(3)SQLCancel:
放弃执行一条SQL语句。
(4)SQLEndTran:
提交或者回滚事务。
10.中断连接
下面的函数处理中断连接的任务:
(1)SQLDisconnect:
关闭指定连接。
(2)SQLFreeHandle:
释放环境、连接、语句或者描述符句柄。
3建立ODBC连接
1.申请环境与连接句柄
客户程序要和一个远程的服务器或数据库进行通讯,必须首先和这个服务器或数据库建立连接,如何通过ODBC建立一个连接以及使用连接呢?
是我们下面将要介绍的内容。
为了建立一个ODBC数据源连接,需要使用到环境句柄以及连接句柄。
句柄有一个层次的概念,一个连接句柄总是和一个唯一的环境句柄相联系的,所有的连接句柄必须在环境句柄释放之前释放。
客户程序可以通过调用函数SQLAllocHandle来申请一个环境句柄,调用函数SQLAllocHandle时必须传入句柄选项SQL_HANDLE_ENV,当申请环境句柄成功之后,可以在此环境句柄上申请连接句柄。
申请环境句柄和连接句柄的代码示范如下:
#include
#include
#include
#include
/*检测返回代码是否为成功标志,当为成功标志返回TRUE,否则返回FALSE*/
#defineRC_SUCCESSFUL(rc)((rc)==SQL_SUCCESS||(rc)==SQL_SUCCESS_WITH_INFO)
/*检测返回代码是否为失败标志,当为失败标志返回TRUE,否则返回FALSE*/
#defineRC_NOTSUCCESSFUL(rc)(!
(RC_SUCCESSFUL(rc)))
HENVhenv;/*环境句柄*/
HDBChdbc;/*连接句柄*/
SQLRETURNsret;/*返回代码*/
voidmain(void)
{
/*申请一个环境句柄*/
SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv);
/*设置环境句柄的ODBC版本*/
SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,
SQL_IS_INTEGER);
/*申请一个连接句柄*/
SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
/*释放连接句柄*/
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
/*释放环境句柄*/
SQLFreeHandle(SQL_HANDLE_ENV,henv);
}
2.如何与数据源进行连接
ODBC的连接是从数据源开始的,数据源是ODBC对一个特定的数据库的别称。
为了访问由数据源提供的数据,你的程序中必须首先建立和数据源之间的连接,在环境和连接句柄正确分配之后,才能通过这些连接管理数据访问。
为了产生建立连接时必要的参数,必须完成以下的几项工作:
(1)调用SQLAllocHandle申请一个环境句柄。
(2)调用SQLAllocHandle申请一个连接句柄。
(3)创建一个数据源DSN。
(4)一个有效的用户ID。
(5)一个对应于这个用户ID的口令。
(6)其它的一些提供给驱动程序的参数信息。
连接ODBC数据源时,ODBC提供三种不同的连接函数,即SQLConnect、SQLDriverConnect和SQLBrowseConnect,每个函数都有不同的参数以及不同级别的一致性。
表1:
连接到数据源的ODBC函数
函数ODBC版本一致性主要参数
SQLConnect1.0核心级hdbc,数据源,用户ID,口令
SQLDriverConnect1.01级hdbc,窗口句柄,输入连接字符串
SQLBrowseConnect1.02级hdbc,输入连接字符串,输出连接字符串
SQLConnect是连接ODBC数据源的最基本的方法,在所有的一致性级别上都支持。
SQLConnect函数有以下参数:
连接句柄,数据源名称,数据源名称长度,用户名(用户ID),用户名长度,用户口令以及口令长度。
返回代码有:
SQL_SUCCESS,SQL_SUCCESS_WITH_INFO,SQL_ERROR或者SQL_INVALID_HANDLE。
使用SQLConnect函数连接数据源的代码示范如下:
sret=SQLConnect(hdbc,(SQLCHAR*)"DM4",SQL_NTS,(SQLCHAR*)"SYSDBA",SQL_NTS,(SQLCHAR*)"SYSDBA",SQL_NTS);
if(RC_SUCCESSFUL(sret)){
/*连接数据源失败!
*/
…进行相应的错误处理…
exit(0);
}
SQLDriverConnect提供了比SQLConnect更灵活的方法来建立ODBC连接。
它支持:
要求更多连接参数的数据源;对话框提示用户输入所有的连接信息;以及没有在系统信息表中定义的数据源。
SQLDriverConnect提供以下的连接方法:
(1)用一个连接字符串建立一个连接,这个字符串包括建立连接的所有数据,如DSN,一个或多个用户ID及其口令,以及其他的数据库所需要的连接信息。
(2)用一个并不完整的连接字符串来建立连接,使得ODBC驱动程序管理器来提示用户输入所需要的连接信息。
(3)用一个没有在系统信息表中登记的数据源建立连接,驱动程序自动提示用户输入连接信息。
(4)用一个连接字符串建立连接,这个字符串在DSN配置文件中是确定的。
SQLDriverConnect函数fDriverCompletion参数说明:
(1)SQL_DRIVER_PROMPT:
设置此选项用来显示一个对话框来提示用户输入连接信息。
(2)SQL_DRIVER_COMPLETE:
如果函数调用中包含了足够的信息,ODBC就进行连接,否则弹出对话框提示用户输入连接信息,此时等同于SQL_DRIVER_PROMPT。
(3)SQL_DRIVER_COMPLETE_REQUIRED:
这个参数与SQL_DRIVER_COMPLETE参数唯一的不同是用户不能改变由函数提供的信息。
(4)SQL_DRIVER_NOPROMPT:
如果函数调用时有足够的信息,ODBC就进行连接,否则返回SQL_ERROR。
使用SQLDriverConnect连接数据源的代码示范如下:
SQLCHARszConnStrIn[256]="DSN=DM4;DRIVER=DMODBCDRIVER;
DATABASE=SYSTEM;UID=SYSDBA;PWD=SYSDBA";
SQLCHARszConnStrOut[256];
SQLSMALLINTcbConnStrOut;
sret=SQLDriverConnect(hdbc,hwnd,szConnStrIn,SQL_NTS,szConnStrOut,256,&cbConnStrOut,SQL_DRIVER_PROMT);
if(RC_SUCCESSFUL(sret)){
/*连接数据源失败!
*/
…进行相应的错误处理…
exit(0);
}
SQLBrowseConnect函数与SQLDriverConnect函数相似,但是调用SQLBrowseConnect函数时,程序在运行时可以再形成一个连接字符串,使用这个函数可以用一个交互的方式来决定连接到数据源时所需要的一些信息。
使用SQLBrowseConnect函数连接数据源的代码示范如下:
SQLCHARszConnStrIn[256]="DSN=DM4;DRIVER=DMODBCDRIVER;
DATABASE=SYSTEM;UID=SYSDBA;PWD=SYSDBA;";
SQLCHARszConnStrOut[256];
SQLSMALLINTcbConnStrOut;
sret=SQLBrowseConnect(hdbc,szConnStrIn,SQL_NTS,szConnStrOut,256,&cbConnStrOut);
if(RC_SUCCESSFUL(sret)){
/*连接数据源失败!
*/
…进行相应的错误处理…
exit(0);
}
设置与取得连接的属性
建立连接之后,应用程序可以通过调用SQLSetConnectAttr函数来设置连接属性,对连接进行全方面的管理。
下面列出了一些常用的连接属性。
表2:
常用的连接属性
属性描述
SQL_ATTR_ACCESS_MODE用来设置访问模式,即只读或者读写连接模式,可以用来优化并发控制策略。
不支持
SQL_ATTR_ASYNC_ENABLE是否支持异步执行
SQL_ATTR_AUTOCOMMIT是否使用自动提交功能。
SQL_ATTR_CONNECTION_TIMEOUT设定连接超时。
(不支持)
SQL_ATTR_CURRENT_CATALOG当前连接使用的编目。
SQL_ATTR_LOGIN_TIMEOUT设定登录超时。
不支持
SQL_ATTR_ODBC_CURSORS设置驱动程序管理器使用游标的方式。
SQL_ATTR_PACKET_SIZE设置网络传输包的大小。
不支持
SQL_ATTR_QUIET_MODE使弹出对话框有效/无效。
更多的连接属性,用户可以参考《MicrosoftODBC3.0程序员参考手册》,在这里不做介绍了。
应用程序可以通过调用SQLGetConnectAttr函数来取得当前连接的属性。
设置与取得连接属性的代码示范如下:
SQLINTEGERAUTOCOMMIOT_MODE;
/*设置连接句柄属性,关闭自动提交功能*/
SQLSetConnectAttr(hdbc,SQL_ATTR_AUTOCOMMIT,(SQLPOINTER)SQL_AUTOCOMMIT_OFF,
SQL_IS_INTEGER);
/*取得连接句柄属性,取得提交的模式*/
SQLGetConnectAttr(hdbc,SQL_ATTR_AUTOCOMMIT,(SQLPOINTER)&AUTOCOMMIOT_MODE,
Sizeof(SQLINTEGER),NULL);
4.断开与数据源之间的连接
如果要终止客户程序与服务器之间的连接,客户程序应当完成以下的几个操作:
(1)调用SQLFreeHandle释放语句句柄,关闭所有打开的游标,释放相关的语句句柄资源。
(在非自动提交模式下,需事先提交当前的事务)
(2)调用函数SQLDisconnect关闭所有的连接。
(3)调用SQLFreeHandle释放连接句柄及其相关的资源。
(4)调用SQLFreeHandle释放环境句柄及其相关的资源。
一个完整的连接管理示范代码如下:
#include
#include
#include
#include
/*检测返回代码是否为成功标志,当为成功标志返回TRUE,否则返回FALSE*/
#defineRC_SUCCESSFUL(rc)((rc)==SQL_SUCCESS||(rc)==SQL_SUCCESS_WITH_INFO)
/*检测返回代码是否为失败标志,当为失败标志返回TRUE,否则返回FALS