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


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

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

При обновлении с компонентов доступа к данным MDAC к собственному клиенту SQL Server могут возникнуть определенные изменения в работе. Дополнительные сведения см. в разделе Обновление приложения с переходом от компонентов MDAC к собственному клиенту SQL Server.

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

Изменения в поведении собственного клиента SQL Server, начиная с версии SQL Server 2005

Описание

OLE DB дополняет данные только до заданного масштаба.

Что касается преобразований, при которых преобразованные данные передаются на сервер, то собственный клиент SQL Server (начиная с версии 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 версии 10.0 (SQL Server 2008), хранимая процедура sp_columns теперь возвращает значение "NO" вместо значения "NO " применительно к столбцу IS_NULLABLE.

Функции SQLSetDescRec, SQLBindParameter и SQLBindCol теперь обеспечивают проверку согласованности.

До появления собственного клиента версии 10.0 для SQL Server установка параметра SQL_DESC_DATA_PTR не приводила к выполнению проверки согласованности функциями SQLSetDescRec, SQLBindParameter или SQLBindCol.

Теперь функция SQLCopyDesc проверяет согласованность дескрипторов.

До появления собственного клиента версии 10.0 для SQL Server функция SQLCopyDesc не проводила проверку согласованности данных, если для конкретной записи был задан параметр SQL_DESC_DATA_PTR.

Функция SQLGetDescRec больше не проверяет согласованность дескрипторов.

До появления собственного клиента версии 10.0 для SQL Server функция SQLGetDescRec проводила проверку согласованности данных, если был задан параметр SQL_DESC_DATA_PTR. Этого не требовалось по спецификации ODBC, и собственный клиент SQL Server версии 10.0 (SQL Server 2008) и более поздних версий уже не проводит эту проверку согласованности.

При выходе значения даты за пределы диапазона теперь происходит возврат другого значения ошибки.

Что касается типа datetime, то при выходе даты за пределы диапазона допустимых значений собственный клиент SQL Server (начиная с версии SQL Server 2008) возвращает номер ошибки, отличный от возвращаемого в предыдущих версиях.

В частности, собственный клиент SQL Server версии 9.0 возвращал ошибку 22007 для всех выходящих за пределы диапазона значений года при преобразовании строки в тип datetime, а собственный клиент SQL Server версии 10.0 (начиная с версии SQL Server 2008) возвращает ошибку 22008, если дата находится в пределах допустимого диапазона для типа datetime2, но за пределами диапазона, поддерживаемого типами datetime и smalldatetime.

В значении datetime усекаются доли секунды, а округление не происходит, если при округлении изменится значение дня.

До появления собственного клиента версии 10.0 для SQL Server клиент, передавая данные типа datetime на сервер, округлял их до ближайшей 1/300-й доли секунды. Начиная с собственного клиента SQL Server версии 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 больше не вызывает изменения значения дня.

До появления собственного клиента версии 10.0 для SQL Server, если часть времени для значения DBTYPE_DATE отстояла от полуночи не более чем на полсекунды, то применение кода преобразования OLE DB приводило к изменению дня. Начиная с собственного клиента SQL Server версии 10.0, день не изменяется (доли секунды усекаются, а не округляются).

Изменения преобразования IBCPSession::BCColFmt.

Начиная с собственного клиента SQL Server версии 10.0, при использовании метода IBCPSession::BCOColFmt для преобразования типа SQLDATETIME или SQLDATETIME в строковый тип происходит экспорт дробной части. Например, при преобразовании типа SQLDATETIME в тип SQLNVARCHARMAX более ранние версии собственного клиента для SQL Server возвращали следующее:

1989-02-01 00:00:00. Собственный клиент SQL Server версии 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, привязанный как тип даты и времени, вызывает ошибку.

В собственном клиенте версии 9.0 для SQL Server вставка пустой строки в объект типа sql_variant, привязанный как тип даты и времени, не вызывала ошибки. Собственный клиент SQL Server версии 10.0 (или более поздних версий) в этом случае совершенно обоснованно возвращает ошибку.

Более строгая проверка параметров типа SQL_C_TYPE _TIMESTAMP и DBTYPE_DBTIMESTAMP.

До появления собственного клиента для SQL Server 2008 происходило округление значений datetime для соответствия масштабу столбцов datetime и smalldatetime в SQL Server. Теперь в собственном клиенте SQL Server 2008 (и более поздних версиях) применяются более строгие правила проверки, определенные в базовой спецификации ODBC для долей секунды. Если значение параметра не удается преобразовать в тип SQL с помощью масштаба, заданного или подразумеваемого клиентской привязкой, без усечения конечных разрядов, то возвращается ошибка.

SQL Server может возвращать различные результаты при выполнении триггера.

Изменения, внесенные в SQL Server 2008, могут привести к тому, что приложение получит другие результаты при выполнении инструкции, вызвавшей выполнение триггера при действующем параметре NOCOUNT OFF. В такой ситуации в приложении может возникнуть ошибка. Чтобы устранить ошибку, задайте в триггере параметр NOCOUNT ON или вызовите метод SQLMoreResults, чтобы перейти к следующему результату.

См. также

Другие ресурсы

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