ODBC API开发教程 - 图文(3)

2019-09-01 12:04

图2.4中是一个基本的使用ODBC API的一个流程,你现在并不理解上面所有的函数的作用,这没有关系。但希望能够通过这幅图给你一个最初的映象,那就是使用ODBC API开发并不复杂。

2.2.6 数据类型定义

在使用ODBC开发时一个重要的问题就是数据转换的问题,在ODBC中存在下面的几类数据:

l 数据库中SQL语言表达数据的类型 l ODBC中表达数据的类型 l C语言中表达数据的类型

在程序运行过程中数据需要经历两次转换:C语言的数据或结构类型与ODBC的数据类型的转换,ODBC与SQL间数据类型的转换。所以ODBC所定义的数据类型起到了中间桥梁的作用,在ODBC的驱动程序调用自己的DBMS数据库访问接口时就需要对数据类型进行转换。我们所需要关注的是C语言的数据类型和ODBC数据类型间的转换关系。

从下图中可以看到ODBC中定义的数据类型和SQL语言中数据类型的对应关系,所以通过下表我们可以将ODBC和SQL语言间的数据一一对应,在后面的文字中我们不再区分ODBC数据类型和SQL语言数据类型。 ODBC数据类型名称 SQL_CHAR SQL_VARCHAR SQL_LONGVARCHAR SQL_WCHAR SQL_WVARCHAR SQL_WLONGVARCHAR SQL_DECIMAL SQL_NUMERIC SQL_SMALLINT SQL_INTEGER SQL_REAL SQL语言数据类型名称 CHAR(n) VARCHAR(n) LONG VARCHAR WCHAR(n) VARWCHAR(n) LONGWVARCHAR DECIMAL(p,s) NUMERIC(p,s) SMALLINT INTEGER REAL SQL_FLOAT SQL_DOUBLE SQL_BIT SQL_TINYINT SQL_BIGINT SQL_BINARY SQL_VARBINARY SQL_LONGVARBINARY SQL_TYPE_DATE[6] SQL_TYPE_TIME[6] SQL_TYPE_TIMESTAMP[6] SQL_GUID 图2.5

FLOAT(p) DOUBLE PRECISION BIT TINYINT BIGINT BINARY(n) VARBINARY(n) LONG VARBINARY DATE TIME(p) TIMESTAMP(p) GUID 使用C/C++语言开发,那么必定会在与ODBC语言间存在数据的转换的问题,因为ODBC所存在的一些数据类型在C语言中是不存在的。在ODBC以宏定义的方式定义了C语言和ODBC中使用的数据类型: C语言数据类型名称 SQL_C_CHAR SQL_C_SSHORT[j] SQL_C_USHORT[j] SQL_C_SLONG[j] SQL_C_ULONG[j] SQL_C_FLOAT SQL_C_DOUBLE SQL_C_BIT SQL_C_STINYINT SQL_C_UTINYINT[j] SQL_C_SBIGINT SQL_C_UBIGINT [j]ODBC 数据类型定义 SQLCHAR * SQLSMALLINT SQLUSMALLINT SQLINTEGER SQLUINTEGER SQLREAL C语言实际类型 unsigned char * short int unsigned short int long int unsigned long int float SQLDOUBLE, SQLFLOAT double SQLCHAR SQLSCHAR SQLCHAR SQLBIGINT SQLUBIGINT unsigned char signed char unsigned char _int64 unsigned _int64 [h][h]SQL_C_BINARY SQL_C_BOOKMARK SQL_C_VARBOOKMARK SQL_C_TYPE_DATE [c][i]SQLCHAR * BOOKMARK SQLCHAR * SQL_DATE_STRUCT unsigned char * unsigned long int unsigned char * struct tagDATE_STRUCT { SQLSMALLINT year; SQLUSMALLINT month; SQLUSMALLINT day; } DATE_STRUCT;[a] struct tagTIME_STRUCT { SQLUSMALLINT hour; SQLUSMALLINT minute; SQLUSMALLINT second; } TIME_STRUCT;[a] [d]SQL_C_TYPE_TIME[c] SQL_TIME_STRUCT SQL_C_TYPE_TIMESTAMP [c]SQL_TIMESTAMP_STRUCT struct tagTIMESTAMP_STRUCT { SQLSMALLINT year; SQLUSMALLINT month; SQLUSMALLINT day; SQLUSMALLINT hour; SQLUSMALLINT minute; SQLUSMALLINT second; SQLUINTEGER fraction;[b] } TIMESTAMP_STRUCT;[a] SQL_NUMERIC_STRUCT struct tagSQL_NUMERIC_STRUCT { SQLCHAR precision; SQLSCHAR scale; SQLCHAR sign[g]; SQLCHAR val[SQL_MAX_NUMERIC_LEN];[e], [f] } SQL_NUMERIC_STRUCT; struct tagSQLGUID { DWORD Data1; WORD Data2; WORD Data3; BYTE Data4[8]; } SQLGUID;[k] SQL_C_NUMERIC SQL_C_GUID SQLGUID 图2.6

所以在ODBC的开发过程中不要使用int , float 之类的C语言的实际类型来定义变量而应该使用ODBC定义的数据类型来定义变量,如:SQLINTEGER,SQLFLOAT。

2.2.7 ODBC句柄

ODBC中的句柄分为三类:环境句柄,数据库连接句柄,SQL语句句柄。

通过图2.4看出,在使用ODBC功能时必须先申请环境句柄,然后在环境句柄的基础上创建数据库连接,最后在数据连接的基础上执行SQL语句。

2.3 为本章的例程创建DSN与数据库表

为了后面的例子能够顺利执行,请创建一个名称为“test”的DSN,并且使用下面的语句在数据库中创建表和插入基本的数据,这个例子和以后的例子中我们使用SQL Server作为数据库,你需要连接到SQL Server上执行下面的语句来创建表和插入数据。 Create table test_t1(iID int primary key , tmJoin datetime , szName varchar(40) ,fTall float );

Insert into test_t1 values(1, '2002-1-1 15:25' , 'user_1',1.56 ); Insert into test_t1 values(2, '2002-1-2 12:25' , 'user_2',1.53 ); Insert into test_t1 values(3, '2002-1-3 13:25' , 'user_3',1.76 );

2.4 ODBC的基本功能介绍

2.4.1 所需要了解的ODBC API

2.4.1.1 SQLAllocHandle 创建ODBC句柄

SQLRETURN SQLAllocHandle( SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE * OutputHandlePtr); 第一个参数HandleType的取值可以为:

l SQL_HANDLE_ENV:申请环境句柄。 l SQL_HANDLE_DBC:申请数据库连接句柄。

l SQL_HANDLE_STMT:申请SQL语句句柄,每次执行SQL语句都申请语句句

柄,并且在执行完成后释放。 第二个参数为输入句柄,第三个参数为输出句柄,也就是是你在第一参数指定的需要申请的句柄。

根据1.2.7节的说明,在使用ODBC功能时必须先申请环境句柄,然后在环境句柄的基础上创建数据库连接,最后在数据连接的基础上执行SQL语句。所以可能的调用方式有三种。 SQLAllocHandle(SQL_HANDLE_ENV,NULL,&hEnv);

SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);

SQLAllocHandle(SQL_HANDLE_DBC,hEnv,&hDBC); SQLAllocHandle(SQL_HANDLE_STMT,hDBC,&hSTMT); 请注意,在创建环境句柄后请务必调用:

SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);

将ODBC设置成为版本3,否则某些ODBC API 函数不能被支持。

2.4.1.2 ODBC API的返回值

ODBC API的返回值定义为:SQLRETURN。在成功时返回值为:SQL_SUCCESS, SQL_SUCCESS_WITH_INFO;在失败时返回错误代码。

一点需要注意的是如果ODBC返回值为:SQL_SUCCESS_WITH_INFO并不表明执行完全成功,而是表明执行成功但是带有一定错误信息。当执行错误时ODBC返回的是一个错误信息的结果集,你需要遍历结果集合中所有行,这点和后面讲到的查询SQL语句执行结果集的思路很类似。

在ODBC可以利用SQLGetDiagRec来得到错误描述信息: SQLRETURN SQLGetDiagRec( SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber,


ODBC API开发教程 - 图文(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:第三章 平面机构的运动分析 习题与答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: