【发布时间】:2015-08-18 14:01:16
【问题描述】:
我们正在将我们的一个项目从 Delphi XE 升级到 XE8。我们的审计代码使用 MSSQL(在本例中为 2012)数据库中的 TIMESTAMP 字段,并使用此作为 WHERE 子句中的参数从表中进行选择。
我们现在不再得到运行以下代码的任何结果:
procedure TForm2.Button1Click(Sender: TObject);
begin
ADODataset1.CommandText := 'SELECT * FROM CURRENCYAUDIT';
ADODataset2.CommandText := 'SELECT * FROM CURRENCYAUDIT WHERE Audit_Timestamp = :Timestamp';
ADODataset2.Parameters.Refresh;
ADODataset1.Open;
if ADODataset1.FieldByName('audit_timestamp').IsNull or ADODataset1.IsEmpty then
begin
showmessage('nothing to compare');
end;
ADODataset2.Parameters[0].Value := ADODataset1.FieldByName('audit_timestamp').Value;
ADODataset2.Open;
caption := inttostr(ADODataset2.RecordCount);
end;
CurrencyAudit 是包含非空时间戳 audit_timestamp 字段的任何旧 MSSQL 表。
表单的标题为 0,不显示任何消息。
知道如何让它工作吗?尝试过 AsString(无意义字符串,0 个结果)、AsSQLTimestamp(参数不接受)和 AsBytes(0 个返回)。不幸的是,.Value 的返回仅评估为“字节的变体数组”,这对可视化/查看它是什么没有帮助。
编辑:将其作为 .AsBytes 运行并在调试器中查看,我可以看到 XE 版本返回 0,0,0,0,0,8,177,22 而 XE8 返回 17,32,0,0 ,0,0,0,0。检查(真实)数据库的其他字段显示记录是相同的。看起来像是从数据库中读取 TIMESTAMP 的错误
【问题讨论】:
-
你试过
.AsDateTime吗? -
@JerryDodge TIMESTAMP 用词不当——它不是 TDateTime,它更像是一个全局 autoinc 字段。只是快速检查一下,它不起作用,因为 TBytesField 无法转换。由于 TIMESTAMP 是一个 8 字节的数字,我也尝试了 AsLargeInt,它也不起作用
标签: sql-server delphi sql-server-2012 delphi-xe8