Posted on 2009-04-02 17:45
Prayer 閱讀(4885)
評論(2) 編輯 收藏 引用 所屬分類:
數據庫,SQL 、
C/C++ 、
DB2
在使用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語言數據類型名稱
|
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++語言開發,那么必定會在與ODBC語言間存在數據的轉換的問題,因為ODBC所存在的一些數據類型在C語言中是不存在的。在ODBC以宏定義的方式定義了C語言和ODBC中使用的數據類型:
C語言數據類型名稱
|
ODBC 數據類型定義
|
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 { SQLSMALLINT year; SQLUSMALLINT month; SQLUSMALLINT day; } DATE_STRUCT;[a]
|
SQL_C_TYPE_TIME[c]
|
SQL_TIME_STRUCT
|
struct tagTIME_STRUCT { SQLUSMALLINT hour; SQLUSMALLINT minute; SQLUSMALLINT second; } TIME_STRUCT;[a]
|
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_C_NUMERIC
|
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;
|
SQL_C_GUID
|
SQLGUID
|
struct tagSQLGUID { DWORD Data1; WORD Data2; WORD Data3; BYTE Data4[8]; } SQLGUID;[k]
|
圖2.6
所以在ODBC的開發過程中不要使用int , float 之類的C語言的實際類型來定義變量而應該使用ODBC定義的數據類型來定義變量,如:SQLINTEGER,SQLFLOAT。