在 TADOQuery.open 中使用 sql-server datetime2

Skú*_*son 4 sql-server delphi ado delphi-xe

我想开始datetime2在 SQL Server 中使用字段,我需要通过 Delphi XE5 中的 ADO 插入到表中。我正在使用TADOQuery.ExecSQL插入,一切正常。

但是,我的大多数表都有标识列,例如

id integer identity(1,1) not null
Run Code Online (Sandbox Code Playgroud)

为了保存到服务器的往返,我通常Open在查询文本中使用两个命令。

  • 第一个命令是插入
  • 第二个命令是“选择 scope_identity() 作为 scope_id”

所以我可以在同一次往返中检索新插入的id

这对我的所有表都有效,但现在当我添加datetime2time列时无效- 我收到错误:

项目“Foo.exe 引发异常类 EOleException,并带有消息‘从字符串转换日期和/或时间时转换失败”。

如果这很重要,我正在使用 SQL Server 2008。有谁知道可能是什么问题?

Ian*_*oyd 5

问题是datetime2不会回到使用 SQLOLEDB 提供程序作为正确 ADO 数据类型 ( adDBTimestamp ) 的ADO 客户端:

adDBTimeStamp (135)

表示日期/时间戳 (yyyymmddhhmmss 加上十亿分之一的分数) (DBTYPE_DBTIMESTAMP)。

相反,它作为 unicode 字符串(adVarWChar)返回:

adVarWChar (202)

表示以空字符结尾的 Unicode 字符串。

  • 2016-11-03 12:06:01.0000000

SQL Server 本机客户端 (SQLNCLI)

可以尝试切换到“本机” OLEDB 提供程序之一(例如 SQLNCLI、SQLNCLI10、SQLNCLI11)。问题在于:

  • SQL Server Native 客户端不附带操作系统(您必须在客户端 PC 上自行安装)
  • SQL Server Native Client 被降级
  • SQLNCLI 提供程序将 XML 列公开为不受支持的 ADO DataTypeEnum 值(141,DBTYPE_XML)
  • SQLNCLI 提供程序将 TIME 列公开为不受支持的 ADO DataTypeEnum 值 (145)
  • SQLNCLI 提供程序将 UDT 列公开为不受支持的 ADO DataTypeEnum 值 (132)

您可以使用该DataTypeCompatibility=80选项在连接字符串原因XML列返回的adLongVarWChar(因为他们在SQLOLEDB那样),但后来datetime2date以及time作为字符串返回

使用的问题DataTypeCompatibility=80是本机客户端驱动程序中存在错误。它错误地将 SQL ServerDATE列从adDBDate转换为adVarWChar

 | SQL Server data type | SQLOLEDB        | SQLNCLI            | SQLNCLI w/DataTypeCompatibilyt=80 |
 |----------------------|-----------------|--------------------|-----------------------------------|
 | Xml                  | adLongVarWChar  | 141 (DBTYPE_XML)   | adLongVarChar                     |
 | datetime             | adDBTimeStamp   | adDBTimeStamp      | adDBTimeStamp                     |
 | datetime2            | adVarWChar      | adDBTimeStamp      | adVarWChar                        |
 | date                 | adVarWChar      | adDBDate           | adVarWChar                        |
 | time                 | adVarWChar      | 145 (unknown)      | adVarWChar                        |
 | UDT                  |                 | 132 (DBTYPE_UDT)   | adVarBinary (documented,untested) |
 | varchar(max)         | adLongVarChar   | adLongVarChar      | adLongVarChar                     |
 | nvarchar(max)        | adLongVarWChar  | adLongVarWChar     | adLongVarWChar                    |
 | varbinary(max)       | adLongVarBinary | adLongVarBinary    | adLongVarBinary                   |
 | timestamp            | adBinary        | adBinary           | adBinary                          |
Run Code Online (Sandbox Code Playgroud)

SQL Native Client Provider 中的这个错误记录在 MS Connect 上。但是微软的人不明白他被告知的内容,将其关闭为Won't fix

因此,如果您真的想使用datetime2来自 ADO 的 a,则必须将其作为string读取,然后自己解析。

奖励阅读