gpt4 book ai didi

sql-server - 将 sql-server datetime2 与 TADOQuery.open 结合使用

转载 作者:行者123 更新时间:2023-12-03 15:54:01 25 4
gpt4 key购买 nike

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

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

id integer identity(1,1) not null

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

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

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

这适用于我的所有表格,但现在当我添加 datetime2time 列时,我收到错误:

Project "Foo.exe raised exception class EOleException with message 'Conversion failed when converting date and/or time from character string".

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

最佳答案

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

adDBTimeStamp (135)

Indicates a date/time stamp (yyyymmddhhmmss plus a fraction in billionths) (DBTYPE_DBTIMESTAMP).

相反,它会以 unicode 字符串的形式返回 ( adVarWChar ):

adVarWChar (202)

Indicates a null-terminated Unicode character string.

  • 2016-11-03 12:06:01.0000000

SQL Server native 客户端 (SQLNCLI)

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

  • SQL Server Native 客户端不随操作系统一起提供(您必须自己在客户端 PC 上安装)
  • the SQL Server Native Client is derpricated
  • SQLNCLI 提供程序将 XML 列公开为不受支持的 ADO DataTypeEnum 值(141、DBTYPE_XML)
  • SQLNCLI 提供程序将 TIME 列公开为不受支持的 ADO DataTypeEnum 值 (145)
  • SQLNCLI 提供程序将 UDT 列公开为不受支持的 ADO DataTypeEnum 值 (132)

您可以使用DataTypeCompatibility=80连接字符串中的选项会导致 XML 列返回为 adLongVarWChar(就像在 SQLOLEDB 中一样),然后返回 datetime2datetime 以字符串形式返回

使用DataTypeCompatibility=80的问题是 native 客户端驱动程序中存在错误。它错误地将 SQL Server DATE 列从 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 |

SQL Native Client Provider 中的此错误 was documented on MS Connect 。但微软的人不明白他被告知的内容,将其关闭为不会修复

因此,如果您确实想要使用 ADO 中的datetime2,则必须将其作为字符串读取,并解析它你自己。

奖励阅读

关于sql-server - 将 sql-server datetime2 与 TADOQuery.open 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38662438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com