對應資料類型 (ODBC)

SQL Server Native Client ODBC 驅動程式會將 SQL Server SQL 資料類型對應至 ODBC SQL 資料類型。 下列章節討論 SQL Server SQL 資料類型和它們所對應的 ODBC SQL 資料類型。 這些章節也討論 ODBC SQL 資料類型及其對應的 ODBC C 資料類型,以及支援的和預設的轉換。

[!附註]

SQL Server timestamp 資料類型與 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) 除外),例如 textntextimage。 例如,資料行可以在某些資料列中包含 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 資料,請遵照下列步驟。

  1. 呼叫 SQLFetch 來定位到擷取的資料列。

  2. 呼叫 SQLGetData,針對類型指定 SQL_C_BINARY,並將資料長度指定為 0。 這會強制驅動程式讀取 sql_variant 標頭。 標頭提供該執行個體在 sql_variant 資料行中的資料類型。 SQLGetData 會傳回值的大小 (以位元組為單位)。

  3. 藉由將 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 子類型。

請參閱

概念

處理結果 (ODBC)