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