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


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

В этом разделе рассматриваются критические изменения в собственном клиенте SQL Server, так как собственный клиент SQL Server в SQL Server 2005.

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

SQL Server Native Client 9.0 поставляется с SQL Server 2005. SQL Server Native Client 10.0 поставляется с SQL Server 2008. SQL Server Native Client 10.5 поставляется с SQL Server 2008 R2. SQL Server Native Client 11.0 поставляется с SQL Server 2012 и SQL Server 2014.

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

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

См. также

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