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

Применимо к:SQL ServerAzure SQL DatabaseAzure Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

Внимание

Собственный клиент SQL Server (часто сокращенный SNAC) был удален из SQL Server 2022 (16.x) и SQL Server Management Studio 19 (SSMS). Собственный клиент SQL Server (SQLNCLI или SQLNCLI11) и устаревший поставщик Microsoft OLE DB для SQL Server (SQLOLEDB) не рекомендуется для разработки новых приложений. Перейдите на новый драйвер Microsoft OLE DB (MSOLEDBSQL) для SQL Server или последний драйвер Microsoft ODBC для SQL Server . Сведения о SQLNCLI, которые поставляется в качестве компонента ядра СУБД SQL Server (версии 2012–2019), см. в этом исключении жизненного цикла поддержки.

В этом разделе рассматриваются критические изменения в собственном клиенте SQL Server с sql Server Native Client в SQL Server 2005 (9.x).

При обновлении компонентов Microsoft Data Access (MDAC) до собственного клиента SQL Server также могут возникнуть некоторые различия в поведении. Дополнительные сведения см. в статье об обновлении приложения до собственного клиента SQL Server из MDAC.

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).

Изменено поведение в собственном клиенте SQL Server с SQL Server 2005 (9.x) Description
OLE DB дополняет данные только до заданного масштаба. Для преобразований, в которых преобразованные данные отправляются на сервер, собственный клиент SQL Server (начиная с SQL Server 2008 (10.0.x)) заполняет конечные нули в данных только до максимальной длины значений даты и времени . Собственный клиент SQL Server версии 9.0 дополнял данные до 9 разрядов.
Проверьте DBTYPE_DBTIMESTAMP для ICommandWithParameter::SetParameterInfo. Собственный клиент SQL Server (начиная с SQL Server 2008 (10.0.x)) реализует требование OLE DB для bScale в ICommandWithParameter::SetParameterInfo, чтобы задать точность дробных секунд для DBTYPE_DBTIMESTAMP.
Хранимая процедура sp_columns теперь возвращает значение "NO" вместо значения "NO" для столбца IS_NULLABLE. Начиная с SQL Server Native Client 10.0 (SQL Server 2008 (10.0.x)), 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 (10.0.x)) и более поздних версиях эта проверка согласованности больше не выполняется.
При выходе значения даты за пределы диапазона теперь происходит возврат другого значения ошибки. Для типа datetime другое число ошибок будет возвращено собственным клиентом SQL Server (начиная с SQL Server 2008 (10.0.x)) для даты вне диапазона, чем возвращено в предыдущих версиях.

В частности, sql Server Native Client 9.0 вернул 22007 для всех значений года вне диапазона в строковых преобразованиях в datetime, а собственный клиент SQL Server начиная с версии 10.0 (SQL Server 2008 (10.0.x)) возвращает значение 22008, если дата находится в диапазоне, поддерживаемом datetime2, но за пределами диапазона, поддерживаемого datetime или smalldatetime.
В значении datetime усекаются доли секунды, а округление не происходит, если при округлении изменится значение дня. До SQL Server Native Client 10.0 поведение клиента для значений даты и времени , отправляемых серверу, округляет их до ближайшей 1/300 секунды. Начиная с SQL Server Native Client 10.0, этот сценарий приводит к усечению дробных секунд, если округление изменяет день.
Возможно усечение секунд в значениях типа datetime. Приложение, созданное с помощью собственного клиента SQL Server 2008 (10.0.x) (или более поздней версии), которое подключается к серверу 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 больше не вызывает изменения значения дня. До SQL Server Native Client 10.0, если часть времени 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:000000.
Размер пересылаемых данных должен соответствовать длине, заданной параметром 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 (10.0.x) Native Client значения даты и времени округлялись, чтобы соответствовать масштабу столбцов datetime и smalldatetime по SQL Server. Собственный клиент SQL Server 2008 (10.0.x) применяет более строгие правила проверки, определенные в спецификации ядра ODBC для дробных секунд. Если значение параметра не удается преобразовать в тип SQL с помощью масштаба, заданного или подразумеваемого клиентской привязкой, без усечения конечных разрядов, то возвращается ошибка.
SQL Server может возвращать разные результаты при запуске триггера. Изменения, внесенные в SQL Server 2008 (10.0.x), могут привести к тому, что приложение возвращает различные результаты из инструкции, которая вызвала запуск триггера при действии NOCOUNT OFF . В такой ситуации в приложении может возникнуть ошибка. Чтобы устранить эту ошибку, задайте NOCOUNT ON в триггере или вызове SQLMoreResults, чтобы перейти к следующему результату.

См. также

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