Chr*_*s J 6 vb6 vbscript ado sqlncli
在切换到使用 SQL Native Client (SQLNCLI) 作为 ADO 提供程序时,我们的旧应用程序遇到了问题。
我们原来的连接字符串是:
Provider=SQLOLEDB; Server=host; Database=bob; Integrated Security=SSPI;
Run Code Online (Sandbox Code Playgroud)
我们将其更改为:
Provider=SQLNCLI11; Server=host; Database=bob; Integrated Security=SSPI; DataTypeCompatibility=80;
Run Code Online (Sandbox Code Playgroud)
我们发现,在调用存储过程时,使用 adDBTimeStamp 参数,Native Client 似乎将时间戳视为 smalldatetime,而不是 datetime。这给我们带来了问题,因为我们在某些比较中使用 9999 年 12 月 31 日作为“最高端”日期,而 Native Client 因“无效日期格式”错误而失败,而 SQLOLEDB 没有问题。
现在看起来我们可能只能在创建参数时将 adDBTimeStamp 更改为 adDate 作为数据类型,但是我想知道在我们继续进行代码更改之前,连接字符串中是否缺少某些内容。
VBScript 代码重现如下。为免生疑问,在有人建议我们应该使用 12/31/9999 之前,日期格式是 UK (dd/mm/yyyy) :-) 但还要确认一下,CDate 不会失败。
Set db = CreateObject("ADODB.Command")
' If Provider=SQLOLEDB then there is no error.
db.ActiveConnection = "Provider=SQLNCLI11; Server=host; Database=bob; Integrated Security=SSPI; DataTypeCompatibility=80;"
db.CommandText = "usp_FetchData"
db.CommandType = &H0004
' 135 is adDBTimeStamp
db.Parameters.Append db.CreateParameter("@screenDate", 135, 1, 20, CDate("31/12/9999"))
Set rs = CreateOBject("ADODB.RecordSet")
' Then this line fails with "Invalid date format" from SQLNCLI
rs.Open db
WScript.Echo rs.RecordCount
Run Code Online (Sandbox Code Playgroud)
将日期时间回溯到 2078(在 smalldatetime 的日期范围内)会使错误消失。
如前所述,如果可以找到非代码更改修复,那么在我们必须将 adDBTimeStamp 更改为 adDate 之前,这就是我们更喜欢的。我希望 DataTypeCompatiblity=80 表现得像 SQLOLEDB;不幸的是,我的 Google-fu 在找出 SQLNCLI 使用的类型映射时失败了。
可能终于找到了解决方案:通过 MSDN 页面Data Type Support for OLE DB Date and Time Improvements,最后有这样的代码片段:
ITableDefinition::CreateTable 中的数据类型映射
以下类型映射与 ITableDefinition::CreateTable 使用的 DBCOLUMNDESC 结构一起使用:
[...换算表...]
当应用程序在 wType 中指定 DBTYPE_DBTIMESTAMP 时,它可以通过在 pwszTypeName 中提供类型名称来覆盖到 datetime2 的映射。如果指定了datetime,则bScale必须为3。如果指定了smalldatetime,则bScale必须为0。如果bScale与wType和pwszTypeName不一致,则返回DB_E_BADSCALE。
在测试中,设置比例的需要似乎适用于 SELECT 和命令以及 CreateTable 的参数。因此,如果我们将上面的脚本更改为:
Set param = db.CreateParameter("@screenDate", 135, 1, 20, CDate("31/12/9999"))
param.NumericScale = 3
db.Parameters.Append param
Run Code Online (Sandbox Code Playgroud)
...然后错误消失并且存储过程被执行。我们正处于测试的早期阶段,但是如果这引起了问题,欢迎其他人提供反馈。
| 归档时间: |
|
| 查看次数: |
2057 次 |
| 最近记录: |