映射数据类型 (ODBC)

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics 平台系统(PDW)

SQL Server Native Client ODBC 驱动程序将 SQL Server SQL 数据类型映射到 ODBC SQL 数据类型。 以下各节讨论 SQL Server SQL 数据类型及其映射到的 ODBC SQL 数据类型。 此外,还讨论 ODBC SQL 数据类型和它们对应的 ODBC C 数据类型,以及支持的和默认的转换。

注意

SQL Server时间戳数据类型映射到SQL_BINARY或SQL_VARBINARY ODBC 数据类型,因为时间戳列中的值不是日期时间,而是指示行上 SQL Server 活动的序列的 binary(8)varbinary(8) 值。 如果 SQL Server Native Client ODBC 驱动程序遇到一个SQL_C_WCHAR(Unicode)值,即奇数字节数,则会截断尾随的奇数字节。

在 ODBC 中处理 sql_variant 数据类型

sql_variant数据类型列可以包含 SQL Server 中除大型对象(LOB)以外的任何数据类型,例如文本ntext图像。 例如,该列可以包含 某些行的小型 值、 其他行的浮点 值和 余数中的 char/nchar 值。

sql_variant数据类型类似于 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. 通过将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)