将应用程序从 SQL Server 2005 Native Client 更新到 SQL Server 2008 Native Client

SQL Server 2008 包括 SQL Server Native Client 10.0。 本主题介绍 SQL Server Native Client 的该版本与更早版本在行为方面的差异。

从 Microsoft 数据访问组件 (MDAC) 升级到 SQL Server Native Client 10.0 时,也会看到一些行为差异。 有关详细信息,请参阅将应用程序从 MDAC 更新到 SQL Server Native Client

SQL Server Native Client 10.0 中更改的行为

说明

OLE DB 仅填充到定义的小数位数。

对于要将转换的数据发送到服务器的转换操作,SQL Server Native Client 10.0 在填充数据中的尾随零时,最多仅填充到 datetime 值的最大长度。 SQL ServerNative Client 9.0 和更早版本则填充到 9 位数。

ICommandWithParameter::SetParameterInfo 验证 DBTYPE_DBTIMESTAMP。

SQL Server Native Client 10.0 实现以下 OLE DB 要求:将 ICommandWithParameter::SetParameterInfo 中的 bScale 设置为 DBTYPE_DBTIMESTAMP 的秒的小数精度。

sp_columns 存储过程现在为 IS_NULLABLE 列返回 "NO" 而不是 "NO "

在 SQL Server Native Client 10.0 中,sp_columns 存储过程现在为 IS_NULLABLE 列返回 "NO" 而不是 "NO "

SQLSetDescRecSQLBindParameterSQLBindCol 现在执行一致性检查。

在 SQL Server Native Client 10.0 之前,设置 SQL_DESC_DATA_PTR 不会导致对 SQLSetDescRecSQLBindParameterSQLBindCol 中的任何描述符类型进行一致性检查。

SQLCopyDesc 现在执行描述符一致性检查。

在 SQL Server Native Client 10.0 之前,在特定记录上设置 SQL_DESC_DATA_PTR 字段时,SQLCopyDesc 不执行一致性检查。

SQLGetDescRec 不再执行描述符一致性检查。

在 SQL Server Native Client 10.0 之前,设置 SQL_DESC_DATA_PTR 字段时,SQLGetDescRec 执行描述符一致性检查。 这不是 ODBC 规范和 SQL Server Native Client 10.0 所要求的,该一致性检查不再执行。

日期超出范围时返回其他错误。

对于 datetime 类型,SQL Server Native Client 10.0 将对超出范围的日期返回与更早版本返回错误号不同的错误号。

具体来说,SQL Server Native Client 9.0 对字符串转换到 datetime 时所有超出范围的年份值均返回 22007,而 SQL Server Native Client 10.0 则在日期处于 datetime2 支持的范围但不处于 datetime 或 smalldatetime 支持的范围时返回 22008。

如果舍入将更改日期,则 datetime 值将截断秒的小数部分,并且不舍入。

在 SQL Server Native Client 10.0 之前,对于发送到服务器的 datetime 值的客户端行为是将它们舍入到最接近 1/300 秒的值。 在 SQL Server Native Client 10.0 中,如果舍入会更改日期,则该方案会导致截断秒的小数部分。

对于 datetime 值的秒的可能截断。

如果您绑定到某一日期时间列并且其类型标识符为 DBTYPE_DBTIMESTAMP (OLE DB) 或 SQL_TIMESTAMP (ODBC)、小数位数为 0,则使用连接到 SQL Server 2005(或更早版本)服务器的 SQL Server 2008 Native Client(或更高版本)生成的应用程序将截断要发送到服务器的数据时间部分中的秒和秒的小数部分。

例如:

输入数据:1994-08-21 21:21:36.000

插入的数据:1994-08-21 21:21:00.000

从 DBTYPE_DBTIME 到 DBTYPE_DATE 的 OLE DB 数据转换不会再导致日期发生更改。

在 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: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 有潜在的性能好处。

使用 BCP API 的自定义应用程序现在可以看到警告。

对于所有类型,如果数据长度超过某字段的指定长度,则 BCP API 将生成警告消息。 以前,该警告仅针对字符类型,而不会针对所有类型发出。

将空字符串插入到绑定为日期/时间类型的 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 之前,SQL Server 会将 datetime 值舍入,以适合 datetime 和 smalldatetime 列的小数位数。 SQL Server 2008 Native Client 现在应用在 ODBC 核心规范中为秒的小数部分定义的更严格的验证规则。 如果无法通过使用由客户端绑定所指定或暗含的小数位数在不截断尾随数字的情况下将参数值转换到 SQL 类型,则返回错误。

当有触发器运行时,SQL Server 可能会返回不同的结果。

SQL Server 2008 中的变化可能会导致应用程序得到从 NOCOUNT OFF 有效时导致触发器运行的语句返回的不同的结果。 在这种情况下,您的应用程序可能会生成错误。 要解决此错误,请在触发器中设置 NOCOUNT ON,或调用 SQLMoreResults 以前进到下一条结果。

请参阅

其他资源

更改历史记录

更新的内容

添加了描述如何为 datetime 列截断秒的项。