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在查询文本中使用两个命令。
所以我可以在同一次往返中检索新插入的id。
这对我的所有表都有效,但现在当我添加datetime2或time列时无效- 我收到错误:
项目“Foo.exe 引发异常类 EOleException,并带有消息‘从字符串转换日期和/或时间时转换失败”。
如果这很重要,我正在使用 SQL Server 2008。有谁知道可能是什么问题?
问题是datetime2不会回到使用 SQLOLEDB 提供程序作为正确 ADO 数据类型 ( adDBTimestamp ) 的ADO 客户端:
adDBTimeStamp (135)
表示日期/时间戳 (yyyymmddhhmmss 加上十亿分之一的分数) (DBTYPE_DBTIMESTAMP)。
相反,它作为 unicode 字符串(adVarWChar)返回:
adVarWChar (202)
表示以空字符结尾的 Unicode 字符串。
2016-11-03 12:06:01.0000000您可以尝试切换到“本机” OLEDB 提供程序之一(例如 SQLNCLI、SQLNCLI10、SQLNCLI11)。问题在于:
您可以使用该DataTypeCompatibility=80选项在连接字符串原因XML列返回的adLongVarWChar(因为他们在SQLOLEDB那样),但后来datetime2,date以及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读取,然后自己解析。