在datetime参数中添加1:操作数类型clash:datetime2与int不兼容。修复代码,而不是SQL?

时间:2018-05-09 13:30:42

标签: sql-server delphi firedac delphi-10.2-tokyo

1 - 在SQL Server中创建一个测试表:

CREATE TABLE dbo.TESTCAL
 (
  TT_CALENDAR_ID INTEGER  NOT NULL,
  TT_START DATETIME NULL,
  TT_FINISH DATETIME NULL,
  TT_EMP_ID INTEGER NULL,
  TT_CAPTION VARCHAR(50) NULL
)

2 - 使用SQL命令在表单上放置TFDQuery

INSERT INTO TESTCAL
 (TT_CALENDAR_ID
 ,TT_START
 ,TT_FINISH
 ,TT_EMP_ID
)
VALUES
(:ID
 , :TTX_DATUM
 , :TTX_DATUM2  + 1
 , :TTX_EMP_ID
)

3 - 定义类型为ftIntegerftdateTimeftdateTimeftInteger的4个ptInput参数。

4 - 执行查询:

with FDQuery1 do
begin
  Params[0].AsInteger  := Random(100);
  Params[1].AsDateTime := Now;
  Params[2].AsDateTime := Now;
  Params[3].AsInteger  := Random(100)+100;
  ExecSQL;
end;

这似乎将参数#2转换为datetime2类型并提供错误Operand type clash: datetime2 is incompatible with int。那是not an unknown error here ;-)。我可以用例如

INSERT INTO TESTCAL
 (TT_CALENDAR_ID
 ,TT_START
 ,TT_FINISH
 ,TT_EMP_ID
)
VALUES
(:ID
 , :TTX_DATUM
 , DATEADD(dd,1,:TTX_DATUM2)
 , :TTX_EMP_ID
)

但是:我可以在不更改SQL命令的情况下阻止错误吗? 因为:这种代码在许多客户端计算机上运行的不同(自定义)脚本中。切换到FireDAC后,错误现在开始出现。

1 个答案:

答案 0 :(得分:0)

Bad Habits to Kick : Using shorthand with date/time operations中,Aaron Bertrand显示了几个日期计算的坏习惯,并建议(像一些评论者所做的那样)停止进行这些整数/日期计算:

  

因此,这一部分的道德只是始终明确说明您正在做什么,并停止使用花哨的速记,这种速记不会像您在代码可能最终出现的所有系统中所期望的那样流畅地工作。您可以输入更多内容,但您的代码也可以更好地与日期类型更改隔离。

我们将遵循这个建议,咬紧牙关,并开始使用DATEADD()更新这些脚本(因此在问题中删除需求而不更改SQL命令)。