Обновление приложений с переходом от SQL Server 2005 Native Client

Применимо к: SQL Server Azure SQL DatabaseУправляемый экземпляр SQL AzureAzure Synapse Analytics AnalyticsPlatform System (PDW)

Скачать драйвер OLE DB

В этой статье рассматриваются критические изменения в OLE DB Driver for SQL Server в сравнении с SQL Server Native Client в SQL Server 2005 (9.x).

При обновлении с компонентов доступа к данным MDAC до драйвера OLE DB для SQL Server могут возникнуть определенные изменения в работе. Дополнительные сведения см. в статье Updating an Application to OLE DB Driver for SQL Server from MDAC (Обновление приложения с переходом с MDAC на драйвер OLE DB для SQL Server).

SQL Server Native Client 9.0 поставляется в составе SQL Server 2005 (9.x). SQL Server Native Client 10.0 поставляется с SQL Server 2008 (10.0.x). SQL Server Native Client 10.5 поставляется с SQL Server 2008 R2 (10.50.x). Клиент SQL Server Native Client 11.0 поставляется в составе SQL Server 2012 (11.x) и SQL Server 2014 (12.x).

Измененное поведение в Microsoft OLE DB Driver for SQL Server по сравнению с SQL Server 2005 (9.x) Native Client Description
OLE DB дополняет данные только до заданного масштаба. Что касается преобразований, при которых преобразованные данные передаются на сервер, Microsoft OLE DB Driver for SQL Server дополняет данные завершающими нулями только до максимальной длины значений datetime. Собственный клиент SQL Server версии 9.0 дополнял данные до 9 разрядов.
Проверьте DBTYPE_DBTIMESTAMP для ICommandWithParameter::SetParameterInfo. Microsoft OLE DB Driver for SQL Server реализует требование OLE DB для bScale в ICommandWithParameter::SetParameterInfo на задание точности в долях секунды для DBTYPE_DBTIMESTAMP.
Хранимая процедура sp_columns теперь возвращает значение "NO" вместо значения "NO" для столбца IS_NULLABLE. В OLE DB Driver for SQL Server хранимая процедура sp_columns теперь возвращает значение "NO" вместо значения "NO" для столбца IS_NULLABLE.
При выходе значения даты за пределы диапазона теперь происходит возврат другого значения ошибки. Что касается типа datetime, то при выходе даты за пределы диапазона допустимых значений Microsoft OLE DB Driver for SQL Server возвращает номер ошибки, отличный от возвращаемого в предыдущих версиях.

В частности, SQL Server Native Client 9.0 возвращал ошибку 22007 для всех выходящих за пределы диапазона значений года, при преобразовании строки в тип datetime, а OLE DB Driver for SQL Server возвращает ошибку 22008, если дата находится в пределах допустимого диапазона для типа datetime 2, но за пределами диапазона, поддерживаемого типами datetime и smalldatetime.
В значении datetime усекаются доли секунды, а округление не происходит, если при округлении изменится значение дня. До появления SQL Server Native Client 10.0 клиент, передавая данные типа datetime на сервер, округлял их до ближайшей 1/300-й доли секунды. В OLE DB Driver for SQL Server, в этой ситуации происходит усечение долей секунды, если округление приводит к изменению значения дня.
Возможно усечение секунд в значении datetime. В приложении, созданном с помощью драйвера OLE DB для SQL Server, при подключении к серверу 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 приводило к изменению дня. В OLE DB Driver for SQL Server день не изменяется (доли секунды усекаются, а не округляются).
Изменения преобразования IBCPSession::BCColFmt. В OLE DB Driver for SQL Server при использовании IBCPSession::BCOColFmt для преобразования SQLDATETIME или SQLDATETIME в строковый тип экспортируется дробное значение. Например, при преобразовании типа SQLDATETIME в тип SQLNVARCHARMAX версии до SQL Server Native Client 10.0 возвращали следующее:
1989-02-01 00:00:00.
Драйвер OLE DB для SQL Server возвращает следующее:
1989-02-01 00:00:00.0000000.
В пользовательских приложениях, в которых используется API BCP, теперь могут обнаруживаться предупреждающие сообщения. API BCP выдает предупреждающее сообщение, если длина данных превышает заданную длину для полей всех типов. Раньше это предупреждение выдавалось только для символьных типов, но не для всех типов.
Вставка пустой строки в объект типа sql_variant, привязанный как тип даты и времени, вызывает ошибку. В SQL Server Native Client 9.0 вставка пустой строки в объект типа sql_variant, привязанный как тип даты и времени, не вызывала ошибки. OLE DB Driver for SQL Server в этом случае совершенно обоснованно возвращает ошибку.
SQL Server может возвращать различные результаты при выполнении триггера. Изменения, внесенные в SQL Server 2008 (10.0.x), могут привести к тому, что приложение будет иметь разные результаты, возвращаемые из инструкции, которая приводила к запуску триггера при действии NOCOUNT OFF. В такой ситуации в приложении может возникнуть ошибка. Чтобы устранить эту ошибку, задайте для триггера параметр NOCOUNT ON.

См. также раздел

Драйвер OLE DB для SQL Server