ODBC數(shù)據(jù)類型定義
Posted on 2009-04-02 17:45 Prayer 閱讀(4891) 評論(2) 編輯 收藏 引用 所屬分類: 數(shù)據(jù)庫,SQL 、C/C++ 、DB2在使用ODBC開發(fā)時一個重要的問題就是數(shù)據(jù)轉(zhuǎn)換的問題,在ODBC中存在下面的幾類數(shù)據(jù):
l 數(shù)據(jù)庫中SQL語言表達(dá)數(shù)據(jù)的類型
l ODBC中表達(dá)數(shù)據(jù)的類型
l C語言中表達(dá)數(shù)據(jù)的類型
在程序運(yùn)行過程中數(shù)據(jù)需要經(jīng)歷兩次轉(zhuǎn)換:C語言的數(shù)據(jù)或結(jié)構(gòu)類型與ODBC的數(shù)據(jù)類型的轉(zhuǎn)換,ODBC與SQL間數(shù)據(jù)類型的轉(zhuǎn)換。所以O(shè)DBC所定義的數(shù)據(jù)類型起到了中間橋梁的作用,在ODBC的驅(qū)動程序調(diào)用自己的DBMS數(shù)據(jù)庫訪問接口時就需要對數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換。我們所需要關(guān)注的是C語言的數(shù)據(jù)類型和ODBC數(shù)據(jù)類型間的轉(zhuǎn)換關(guān)系。
從下圖中可以看到ODBC中定義的數(shù)據(jù)類型和SQL語言中數(shù)據(jù)類型的對應(yīng)關(guān)系,所以通過下表我們可以將ODBC和SQL語言間的數(shù)據(jù)一一對應(yīng),在后面的文字中我們不再區(qū)分ODBC數(shù)據(jù)類型和SQL語言數(shù)據(jù)類型。
ODBC數(shù)據(jù)類型名稱 |
SQL語言數(shù)據(jù)類型名稱 |
SQL_CHAR |
CHAR(n) |
SQL_VARCHAR |
VARCHAR(n) |
SQL_LONGVARCHAR |
LONG VARCHAR |
SQL_WCHAR |
WCHAR(n) |
SQL_WVARCHAR |
VARWCHAR(n) |
SQL_WLONGVARCHAR |
LONGWVARCHAR |
SQL_DECIMAL |
DECIMAL(p,s) |
SQL_NUMERIC |
NUMERIC(p,s) |
SQL_SMALLINT |
SMALLINT |
SQL_INTEGER |
INTEGER |
SQL_REAL |
REAL |
SQL_FLOAT |
FLOAT(p) |
SQL_DOUBLE |
DOUBLE PRECISION |
SQL_BIT |
BIT |
SQL_TINYINT |
TINYINT |
SQL_BIGINT |
BIGINT |
SQL_BINARY |
BINARY(n) |
SQL_VARBINARY |
VARBINARY(n) |
SQL_LONGVARBINARY |
LONG VARBINARY |
SQL_TYPE_DATE[6] |
DATE |
SQL_TYPE_TIME[6] |
TIME(p) |
SQL_TYPE_TIMESTAMP[6] |
TIMESTAMP(p) |
SQL_GUID |
GUID |
圖2.5
使用C/C++語言開發(fā),那么必定會在與ODBC語言間存在數(shù)據(jù)的轉(zhuǎn)換的問題,因為ODBC所存在的一些數(shù)據(jù)類型在C語言中是不存在的。在ODBC以宏定義的方式定義了C語言和ODBC中使用的數(shù)據(jù)類型:
C語言數(shù)據(jù)類型名稱 |
ODBC 數(shù)據(jù)類型定義 |
C語言實際類型 |
SQL_C_CHAR |
SQLCHAR * |
unsigned char * |
SQL_C_SSHORT[j] |
SQLSMALLINT |
short int |
SQL_C_USHORT[j] |
SQLUSMALLINT |
unsigned short int |
SQL_C_SLONG[j] |
SQLINTEGER |
long int |
SQL_C_ULONG[j] |
SQLUINTEGER |
unsigned long int |
SQL_C_FLOAT |
SQLREAL |
float |
SQL_C_DOUBLE |
SQLDOUBLE, SQLFLOAT |
double |
SQL_C_BIT |
SQLCHAR |
unsigned char |
SQL_C_STINYINT[j] |
SQLSCHAR |
signed char |
SQL_C_UTINYINT[j] |
SQLCHAR |
unsigned char |
SQL_C_SBIGINT |
SQLBIGINT |
_int64[h] |
SQL_C_UBIGINT |
SQLUBIGINT |
unsigned _int64[h] |
SQL_C_BINARY |
SQLCHAR * |
unsigned char * |
SQL_C_BOOKMARK[i] |
BOOKMARK |
unsigned long int[d] |
SQL_C_VARBOOKMARK |
SQLCHAR * |
unsigned char * |
SQL_C_TYPE_DATE[c] |
SQL_DATE_STRUCT |
struct tagDATE_STRUCT { |
SQL_C_TYPE_TIME[c] |
SQL_TIME_STRUCT |
struct tagTIME_STRUCT { |
SQL_C_TYPE_TIMESTAMP[c] |
SQL_TIMESTAMP_STRUCT |
struct tagTIMESTAMP_STRUCT { |
SQL_C_NUMERIC |
SQL_NUMERIC_STRUCT |
struct tagSQL_NUMERIC_STRUCT { |
SQL_C_GUID |
SQLGUID |
struct tagSQLGUID { |
圖2.6
所以在ODBC的開發(fā)過程中不要使用int , float 之類的C語言的實際類型來定義變量而應(yīng)該使用ODBC定義的數(shù)據(jù)類型來定義變量,如:SQLINTEGER,SQLFLOAT。