映射数据类型 (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 中将 sql_variant 数据类型用于 ODBC 驱动程序的可能。在 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. 调用 SQLColAttribute 并将 SQL_CA_SS_VARIANT_TYPE 指定为其属性值。此函数将向客户端返回 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 子类型之一。

请参阅

概念