Сопоставление типов данных (ODBC)

Драйвер ODBC для собственного клиента SQL Server сопоставляет типы данных SQL Server SQL и типы данных ODBC SQL. В последующих разделах обсуждаются типы данных SQL Server SQL с типами данных ODBC SQL, с которыми они сопоставляются. В разделах также обсуждаются типы данных ODBC SQL и соответствующие им типы данных ODBC C, а также поддерживаемые преобразования и преобразования по умолчанию.

ПримечаниеПримечание

Тип данных SQL Server timestamp сопоставим с типом данных 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, кроме типов больших объектов, таких как 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, выполните следующие шаги.

  1. Вызовите функцию SQLFetch, чтобы перейти к получаемой строке.

  2. Вызовите функцию SQLGetData, указав тип SQL_C_BINARY и длину данных 0. Это заставит драйвер считать заголовок sql_variant. Заголовок предоставляет тип данных этого экземпляра в столбце sql_variant . Функция SQLGetData возвращает размер значения (в байтах).

  3. Вызовите функцию 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 имя_таблицы VALUES (?,?)), функция SQLBindParameter используется, чтобы задать сведения о параметре, в том числе тип C и соответствующий тип SQL Server. Драйвер ODBC для собственного клиента SQL Server преобразует тип C в один из соответствующих подтипов sql_variant.

См. также

Основные понятия

Обработка результатов (ODBC)