无论是使用ODBC
的新手或老兵,看到SQLCHAR
、SOL_C_CHAR
和SQL_CHAR
,可能都会有些糊涂。它们之间的区别到底是什么呢?
(1)第一种是ODBC
定义的数据类型(像SQLCHAR
):SQL
开头,后面跟着一系列大写字符,但是没有下划线。这种数据类型定义在sqltypes.h
中,比如:
typedef signed short int SQLSMALLINT;
typedef SQLSMALLINT SQLRETURN;
#if (ODBCVER >= 0x0300)
typedef void * SQLHANDLE;
......
#endif
这种数据类型可以用来定义变量,ODBC
API
的变量类型都是这种类型:
#if (ODBCVER >= 0x0300)
SQLRETURN SQL_API SQLAllocHandle(SQLSMALLINT HandleType,
SQLHANDLE InputHandle, SQLHANDLE *OutputHandle);
#endif
这样做的好处是ODBC
提供了一套自己的变量类型,相当于封装了一层,使用者不用关心底层具体的变量类型实现细节。即使底层的变量类型做了修改,使用者的代码也不用做任何改动。
这种数据类型和C
语言数据类型的映射如下:
ODBC 类型 |
C 类型 |
SQLCHAR |
char |
SQLSCHAR |
signed char |
SQLINTEGER |
long int |
… |
… |
(2)第二种是C
语言的数据类型编码(SQL_C_CHAR
)。他们并不是真正的数据类型,而是针对上面提到的的ODBC
定义的数据类型的编码,所以不能用来定义变量。他们可以用作ODBC
API
的参数。这种数据类型定义在sqlext.h
中,比如:
#define SQL_C_CHAR SQL_CHAR /* CHAR, VARCHAR, DECIMAL, NUMERIC */
#define SQL_C_LONG SQL_INTEGER /* INTEGER */
#define SQL_C_SHORT SQL_SMALLINT /* SMALLINT */
#define SQL_C_FLOAT SQL_REAL /* REAL */
#define SQL_C_DOUBLE SQL_DOUBLE /* FLOAT, DOUBLE */
这种数据类型和ODBC
数据类型的映射如下:
整数编码 |
ODBC 类型 |
SQL_C_CHAR |
SQLCHAR |
SQL_S_STINYINT |
SQLSCHAR |
SQL_C_SLONG |
SQLINTEGER |
… |
… |
(3)第三种是SQL
数据类型编码。同第二种一样,他们也不是真正的数据类型,而是提供SQL
数据类型和编程语言数据类型的关联,因为也是数字编码,所以也不能用来定义变量。他们可以用作ODBC
API
的参数。这种数据类型定义在sqlext.h
中,比如:
#define SQL_C_CHAR SQL_CHAR /* CHAR, VARCHAR, DECIMAL, NUMERIC */
#define SQL_C_LONG SQL_INTEGER /* INTEGER */
#define SQL_C_SHORT SQL_SMALLINT /* SMALLINT */
#define SQL_C_FLOAT SQL_REAL /* REAL */
#define SQL_C_DOUBLE SQL_DOUBLE /* FLOAT, DOUBLE */
这种数据类型和SQL
数据类型的映射如下:
整数编码 |
SQL类型 |
SQL_CHAR |
Char(n) |
SQL_VARCHAR |
Varchar(n) |
SQL_SMALLINT |
Smallint |
… |
… |