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


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

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

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

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

Описание

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

Что касается преобразований, при которых преобразованные данные передаются на сервер, то собственный клиент версии 10.0 для SQL Server дополняет данные завершающими нулями только до максимальной длины значений datetime. Собственный клиент SQL Server версии 9.0 и более ранних версий дополнял данные до 9 разрядов.

Проверьте правильность типа DBTYPE_DBTIMESTAMP для вызова ICommandWithParameter::SetParameterInfo.

Собственный клиент версии 10.0 для SQL Server реализует требование OLE DB, согласно которому аргумент bScale функции ICommandWithParameter::SetParameterInfo должен быть задан с точностью до долей секунды для структуры DBTYPE_DBTIMESTAMP.

Хранимая процедура sp_columns теперь возвращает значение «NO» вместо значения «NO» применительно к столбцу IS_NULLABLE.

В собственном клиенте версии 10.0 для SQL Server хранимая процедура 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, и собственный клиент версии 10.0 для SQL Server уже не проводит эту проверку согласованности.

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

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

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

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

До появления собственного клиента версии 10.0 для SQL Server клиент, передавая данные типа datetime на сервер, округлял их до ближайшей 1/300-й доли секунды. В собственном клиенте версии 10.0 для SQL Server в этой ситуации происходит усечение долей секунды, если округление приводит к изменению значения дня.

Возможно усечение секунд в значениях типа 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 приводило к изменению дня. В собственном клиенте версии 10.0 для SQL Server день не изменяется (доли секунды усекаются, а не округляются).

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

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

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

Более строгая проверка параметров типа 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, чтобы перейти к следующему результату.