Поделиться через


Обновление приложения с переходом от собственного клиента SQL Server 2005

В этом разделе рассматриваются критические изменения в SQL Server Native Client с момента SQL Server Native Client в SQL Server 2005 г.

При обновлении компонентов доступа к данным Майкрософт (MDAC) до SQL Server Native Client также могут наблюдаться некоторые различия в поведении. Дополнительные сведения см. в статье Обновление приложения для SQL Server Native Client из MDAC.

SQL Server Native Client 9.0 поставляется с SQL Server 2005. SQL Server Native Client 10.0 поставляется в составе SQL Server 2008. Собственный клиент SQL Server 10.5 поставляется в составе SQL Server 2008 R2. SQL Server Native Client 11.0 поставляется с SQL Server 2012 и SQL Server 2014 годах.

Изменено поведение в SQL Server Native Client с SQL Server 2005 г. Description
OLE DB дополняет данные только до заданного масштаба. Для преобразований, в которых преобразованные данные отправляются на сервер, SQL Server Native Client (начиная с SQL Server 2008 г.) заполняет конечные нули данных только до максимальной длины значенийdatetime. Собственный клиент SQL Server версии 9.0 дополнял данные до 9 разрядов.
Проверьте DBTYPE_DBTIMESTAMP для ICommandWithParameter::SetParameterInfo. SQL Server Native Client (начиная с SQL Server 2008 г.) реализует требование OLE DB для bScale в ICommandWithParameter::SetParameterInfo, чтобы задать точность доли секунды для DBTYPE_DBTIMESTAMP.
Теперь хранимая sp_columns процедура возвращает значение "NO" вместо "NO" для столбца IS_NULLABLE. Начиная с SQL Server Native Client 10.0 (SQL Server 2008) sp_columns хранимая процедура теперь возвращает значение "NO" вместо "NO" для столбца IS_NULLABLE.
SQLSetDescRec, SQLBindParameter и SQLBindCol теперь выполняют проверку согласованности. До SQL Server Native Client 10.0 установка SQL_DESC_DATA_PTR не вызывала проверка согласованности для любого типа дескриптора в SQLSetDescRec, SQLBindParameter или SQLBindCol.
SQLCopyDesc теперь выполняет проверку согласованности дескриптора. До SQL Server Native Client 10.0 SQLCopyDesc не выполнял согласованность проверка, когда поле SQL_DESC_DATA_PTR было задано для определенной записи.
SQLGetDescRec больше не выполняет проверка согласованности дескриптора. До SQL Server Native Client 10.0 SQLGetDescRec выполнял согласованность дескриптора проверка при установке поля SQL_DESC_DATA_PTR. Это не требовалось для спецификации ODBC, и в SQL Server Native Client 10.0 (SQL Server 2008) и более поздних версиях эта согласованность проверка больше не выполняется.
При выходе значения даты за пределы диапазона теперь происходит возврат другого значения ошибки. datetime Для типа SQL Server Native Client (начиная с SQL Server 2008 г.) возвращает другой номер ошибки, чем в более ранних версиях.

В частности, SQL Server Native Client 9.0 вернул 22007 для всех значений года вне диапазона при преобразовании datetimeстрок в , а SQL Server Native Client начиная с версии 10.0 (SQL Server 2008) возвращает 22008, если дата находится в пределах диапазона, поддерживаемого datetime2 , но за пределами диапазона, поддерживаемого datetime или smalldatetime.
В значении datetime усекаются доли секунды, а округление не происходит, если при округлении изменится значение дня. До SQL Server Native Client 10.0 поведение клиента для datetime значений, отправленных на сервер, было округление их до ближайшей 1/300 секунды. Начиная с SQL Server Native Client 10.0, этот сценарий приводит к усечению доли секунды, если округление изменяет день.
Возможно усечение секунд в значениях типа datetime. Приложение, созданное с помощью SQL Server 2008 Native Client (или более поздней версии), которое подключается к серверу SQL Server 2005, усекает секунды и доли секунды для временной части данных, отправляемых на сервер, при привязке к столбцу datetime с идентификатором типа DBTYPE_DBTIMESTAMP (OLE DB) или SQL_TIMESTAMP (ODBC) и масштабом 0.

Пример:

Входные данные: 1994-08-21 21:21:36.000

Вставляемые данные: 1994-08-21 21:21:00.000
Преобразование данных OLE DB из типа DBTYPE_DBTIME в DBTYPE_DATE больше не вызывает изменения значения дня. До появления собственного клиента версии 10.0 для SQL Server, если часть времени для значения DBTYPE_DATE отстояла от полуночи не более чем на полсекунды, то применение кода преобразования OLE DB приводило к изменению дня. Начиная с SQL Server Native Client 10,0 день не изменяется (доли секунд усекаются и не округляются).
Изменения преобразования IBCPSession::BCColFmt. Начиная с SQL Server Native Client 10.0 при использовании IBCPSession::BCOColFmt для преобразования SQLDATETIME или SQLDATETIME в строковый тип экспортируется дробное значение. Например, при преобразовании типа SQLDATETIME в тип SQLNVARCHARMAX возвращаются более ранние версии SQL Server Native Client

1989-02-01 00:00:00. SQL Server Native Client 10.0 и более поздних версий возвращается 1989-02-01 00:00:00.0000000.
Размер пересылаемых данных должен соответствовать длине, заданной параметром SQL_LEN_DATA_AT_EXEC. При использовании параметра SQL_LEN_DATA_AT_EXEC размер данных должен соответствовать длине, заданной параметром SQL_LEN_DATA_AT_EXEC. Можно использовать параметр SQL_DATA_AT_EXEC, но SQL_LEN_DATA_AT_EXEC дает некоторый выигрыш в производительности.
В пользовательских приложениях, в которых используется API BCP, теперь могут обнаруживаться предупреждающие сообщения. API BCP выдает предупреждающее сообщение, если длина данных превышает заданную длину для полей всех типов. Раньше это предупреждение выдавалось только для символьных типов, но не для всех типов.
Вставка пустой строки в объект типа sql_variant, привязанный как тип даты и времени, вызывает ошибку. В SQL Server Native Client 9.0 при вставке пустой строки в привязанный sql_variant тип даты и времени ошибка не возникает. SQL Server Native Client 10.0 (и более поздних версий) в этой ситуации правильно создает ошибку.
Более строгая проверка параметров типа SQL_C_TYPE _TIMESTAMP и DBTYPE_DBTIMESTAMP. До SQL Server 2008 datetime года значения округлялись в соответствии с масштабом столбцов datetime и smalldatetime SQL Server. SQL Server 2008 Native Client (и более поздних версий) применяет более строгие правила проверки, определенные в спецификации ядра ODBC для доли секунд. Если значение параметра не удается преобразовать в тип SQL с помощью масштаба, заданного или подразумеваемого клиентской привязкой, без усечения конечных разрядов, то возвращается ошибка.
SQL Server может возвращать различные результаты при выполнении триггера. Изменения, внесенные в SQL Server 2008 г., могут привести к тому, что приложение будет возвращать разные результаты из инструкции, которая приводила к запуску NOCOUNT OFF триггера при действии. В такой ситуации в приложении может возникнуть ошибка. Чтобы устранить эту ошибку, задайте NOCOUNT ON в триггере или вызовите SQLMoreResults, чтобы перейти к следующему результату.

См. также:

Программирование собственного клиента SQL Server