Сопоставление типов данных (ODBC)
Драйвер ODBC для собственного клиента SQL Server сопоставляет типы данных SQL SQL Server и типы данных SQL ODBC. В разделах ниже обсуждаются типы данных SQL SQL Server и типы данных SQL ODBC, с которыми они сопоставляются. В разделах также обсуждаются типы данных SQL ODBC и соответствующие им типы данных C ODBC, а также поддерживаемые преобразования и преобразования по умолчанию.
Примечание |
|---|
Тип данных SQL Servertimestamp сопоставим с типом данных ODBC SQL_BINARY или SQL_VARBINARY, потому что значения в столбцах timestamp не являются значениями типа datetime, но являются значениями типа binary(8) или varbinary(8), которые показывают результат операций SQL Server на строке. Если драйвер ODBC для собственного клиента SQL Server встречает значение SQL_C_WCHAR (Юникод), что означает нечетное число байт, то последний нечетный байт усекается. |
Работа с типом данных sql_variant в ODBC
Столбец типа sql_variant может содержать любые типы данных SQL Server, кроме типов LOB, таких как text, ntext и image. Например, столбец может содержать для некоторых строк значения типа smallint, для других строк значения типа float и для оставшихся строк значения типа char/nchar.
Тип sql_variant подобен типу данных Variant в Microsoft Visual Basic®.
Получение данных с сервера
У ODBC отсутствует понятие типа variant, что ограничивает использование типа sql_variant с драйвером ODBC в SQL Server. Если в SQL Server задана привязка, то тип данных sql_variant должен быть привязан к одному из документированных типов данных ODBC. SQL_CA_SS_VARIANT_TYPE, новый атрибут, особый для драйвера ODBC для собственного поставщика SQL Server, возвращает тип данных экземпляра в столбец sql_variant пользователю.
Если привязка не задана, то можно использовать функцию SQLGetData, чтобы определить тип данных экземпляра в столбце sql_variant.
Чтобы получить данные sql_variant, выполните следующие шаги.
Вызовите метод SQLFetch, чтобы перейти к извлекаемой строке.
Вызовите метод SQLGetData, задав тип SQL_C_BINARY и длину данных 0. Это заставит драйвер считать заголовок sql_variant. Заголовок предоставляет тип данных этого экземпляра в столбце sql_variant . Метод SQLGetData возвращает размер значения (в байтах).
Вызовите метод SQLColAttribute, указав в качестве значения его атрибута SQL_CA_SS_VARIANT_TYPE. Эта функция возвратит клиенту тип данных C экземпляра в столбце sql_variant.
Вот фрагмент кода, демонстрирующий вышеуказанные шаги.
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, новый тип данных, особый для драйвера ODBC для собственного клиента SQL Server, используется для данных, отправленных в столбец sql_variant. При отправке данных на сервер с помощью параметров (например, INSERT INTO TableName VALUES (?,?)), SQLBindParameter используется, чтобы задать сведения о параметре, в том числе тип C и соответствующий тип SQL Server. Драйвер ODBC для собственного клиента SQL Server преобразует тип C к одному из соответствующих подтипов sql_variant.
Примечание