使用sql-server datetime2和TADOQuery.open

时间:2016-07-29 15:27:35

标签: sql-server delphi ado delphi-xe

我想在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引发了异常类EOleException并显示消息'从字符串"转换日期和/或时间时转换失败。

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

1 个答案:

答案 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

SQL Server Native Client(SQLNCLI)

可以尝试切换到其中一个“原生” 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的问题是本机客户端驱动程序中存在错误。它错误地将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>

奖金阅读