映射数据类型 (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) 之外的任何数据类型,例如 text、ntext 和 image。例如,该列中的某些行可能包含 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 数据,请按下列步骤进行操作。
调用 SQLFetch 以定位到要检索的行。
调用 SQLGetData,为类型指定 SQL_C_BINARY 并为数据长度指定 0。这会强制驱动程序读取 sql_variant 标头。该标头提供 sql_variant 列中的实例的数据类型。SQLGetData 返回该值的大小(以字节为单位)。
调用 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 子类型之一。