我想在SQL Server中开始使用datetime2
字段,我需要通过Delphi XE5中的ADO插入表中。我正在使用TADOQuery.ExecSQL
进行插入,一切正常。
但是我的大多数表都有标识列,例如
id integer identity(1,1) not null
为了保存到服务器的往返,我通常在查询文本中使用Open
和两个命令。
所以我可以在同一次往返中检索新插入的 id 。
这适用于我的所有表格,但现在我添加datetime2
或time
列时没有 - 我收到错误:
Project" Foo.exe引发了异常类EOleException并显示消息'从字符串"转换日期和/或时间时转换失败。
如果重要的话,我正在使用SQL Server 2008。有谁知道可能是什么问题?
答案 0 :(得分:1)
问题是datetime2
没有使用SQLOLEDB提供程序作为正确的ADO数据类型(adDBTimestamp)返回到ADO客户端:
adDBTimeStamp (135)
表示日期/时间戳(yyyymmddhhmmss加上十亿分之一的分数)(DBTYPE_DBTIMESTAMP)。
相反,它以unicode字符串(adVarWChar):
返回adVarWChar (202)
表示以null结尾的Unicode字符串。
2016-11-03 12:06:01.0000000
您可以尝试切换到其中一个“原生” OLEDB提供程序(例如SQLNCLI,SQLNCLI10,SQLNCLI11)。这些问题是:
您可以使用连接字符串中的DataTypeCompatibility=80
选项使XML列返回adLongVarWChar
(就像在SQLOLEDB中一样),然后datetime2
,date
,time
以字符串形式返回
使用DataTypeCompatibility=80
的问题是本机客户端驱动程序中存在错误。它错误地将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
,则必须将其读作字符串,并自行解析。< / p>