對應資料類型 (ODBC)
SQL Server Native Client ODBC 驅動程式會將 SQL Server SQL 資料類型對應至 ODBC SQL 資料類型。下列章節討論 SQL Server SQL 資料類型和它們所對應的 ODBC SQL 資料類型。這些章節也討論 ODBC SQL 資料類型及其對應的 ODBC C 資料類型,以及支援的和預設的轉換。
[!附註]
SQL Servertimestamp 資料類型與 SQL_BINARY 或 SQL_VARBINARY ODBC 資料類型對應,因為 timestamp 資料行中的値不是 datetime 値,而是指出資料列上 SQL Server 活動順序的 binary(8) 或 varbinary(8) 値。如果 SQL Server Native Client ODBC 驅動程式遇到奇數位元組的 SQL_C_WCHAR (Unicode) 値,則尾端的奇數位元組會被截斷。
處理 ODBC 中的 sql_variant 資料類型
sql_variant 資料類型資料行可以包含 SQL Server 中的任何資料類型 (大型物件 (LOB) 除外),例如 text、ntext 和 image。例如,資料行可以在某些資料列中包含 smallint 値,在其他資料列中包含 float 値,而在剩餘的資料列中包含 char/nchar 値。
sql_variant 資料類型類似於 Microsoft Visual Basic® 中的 Variant 資料類型。
從伺服器擷取資料
ODBC 沒有變數類型的概念,因此在 SQL Server 中搭配 ODBC 驅動程式使用 sql_variant 資料類型就受到限制。在 SQL Server 中,如果指定了繫結,則 sql_variant 資料類型必須繫結至其中一個記錄的 ODBC 資料類型。SQL_CA_SS_VARIANT_TYPE 是 SQL Server Native Client ODBC 驅動程式特定的新屬性,會將執行個體在 sql_variant 資料行中的資料類型傳回給使用者。
如果沒有指定繫結,則 SQLGetData 函數可以用來判斷執行個體在 sql_variant 資料行中的資料類型。
若要擷取 sql_variant 資料,請遵照下列步驟。
呼叫 SQLFetch 來定位到擷取的資料列。
呼叫 SQLGetData,針對類型指定 SQL_C_BINARY,並將資料長度指定為 0。這會強制驅動程式讀取 sql_variant 標頭。標頭提供該執行個體在 sql_variant 資料行中的資料類型。SQLGetData 會傳回值的大小 (以位元組為單位)。
藉由將 SQL_CA_SS_VARIANT_TYPE 指定為其屬性值來呼叫 SQLColAttribute。此函數會將執行個體在 sql_variant 資料行中的 C 資料類型傳回給用戶端。
下列程式碼片段顯示前述的步驟。
while ((retcode = SQLFetch (hstmt))==SQL_SUCCESS)
{
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
{
SQLError (NULL, NULL, hstmt, NULL,
&lNativeError,szError,MAX_DATA,&sReturned);
printf_s ("%s\n",szError);
goto Exit;
}
retcode = SQLGetData (hstmt, 1, SQL_C_BINARY,
pBuff,0,&Indicator);//Figure out the length
if (retcode != SQL_SUCCESS_WITH_INFO && retcode != SQL_SUCCESS)
{
SQLError (NULL, NULL, hstmt, NULL, &lNativeError,
szError,MAX_DATA,&sReturned);
printf_s ("%s\n",szError);
goto Exit;
}
printf_s ("Byte length : %d ",Indicator); //Print out the byte length
int iValue = 0;
retcode = SQLColAttribute (hstmt, 1, SQL_CA_SS_VARIANT_TYPE, NULL,
NULL,NULL,&iValue); //Figure out the type
printf_s ("Sub type = %d ",iValue);//Print the type, the return is C_type of the column]
// Set up a new binding or do the SQLGetData on that column with
// the appropriate type
}
如果使用者使用 SQLBindCol 建立繫結,驅動程式會讀取中繼資料和資料。驅動程式會接著將資料轉換為繫結中指定的適當 ODBC 類型。
將資料傳送到伺服器
SQL_SS_VARIANT 是 SQL Server Native Client ODBC 驅動程式特定的新資料類型,會用於傳送給 sql_variant 資料行的資料。使用參數 (例如,INSERT INTO TableName VALUES (?,?)) 將資料傳送給伺服器時,SQLBindParameter 會用來指定包含 C 類型和對應 SQL Server 類型的參數資訊。SQL Server Native Client ODBC 驅動程式會將 C 資料類型轉換為其中一個適當的 sql_variant 子類型。