【问题标题】:Convert SQL server query to Delphi syntax将 SQL 服务器查询转换为 Delphi 语法
【发布时间】:2011-06-25 03:00:24
【问题描述】:

这是有效的原始 SQL 服务器查询:

use HIS

SELECT
room_type,rate_start_date,rate_end_date,rate
, DATEDIFF(DAY,case when rate_end_date < '2011.08.21'
then '2011.08.19'
else rate_start_date
end,
case when rate_start_date > '2011.08.19'
then '2011.08.21'
else rate_end_date
end
) AS days FROM room_rates
WHERE room_type = 'DBLMS' AND rate_start_date <= '2011.08.21'
AND rate_end_date > '2011.08.19'

我将它转换为 Delphi SQL:

procedure TForm1.Button1Click(Sender: TObject);
begin
uniQuery1.Close;
uniQuery1.SQL.Clear;
uniQuery1.SQL.Add('SELECT room_type,rate_start_date,rate_end_date,rate,');
uniQuery1.SQL.Add('DATEDIFF(DAY,case when rate_end_date < 2011.08.21 then 2011.08.19 else rate_start_date end,');
uniQuery1.SQL.Add('case when rate_start_date > 2011.08.19');
uniQuery1.SQL.Add('then 2011.08.21 else rate_end_date end) AS days FROM room_rates');
uniQuery1.SQL.Add('WHERE room_type = DBLMS AND rate_start_date <= 2011.08.21');
uniQuery1.SQL.Add('AND rate_end_date > 2011.08.19');
uniQuery1.Open;
end;

但是我收到“无效的列名 'DBLMS'”

我在这里缺少什么? DBLMS 不是列。

【问题讨论】:

    标签: delphi delphi-2010 delphi-xe


    【解决方案1】:

    您没有引用 sql 语句中的字符串尝试将您的代码重写为:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      uniQuery1.Close;
      uniQuery1.SQL.Clear;
      uniQuery1.SQL.Add('SELECT room_type,rate_start_date,rate_end_date,rate,');
      uniQuery1.SQL.Add('DATEDIFF(DAY,case when rate_end_date < ''2011.08.21'' then ''2011.08.19'' else rate_start_date end,');
      uniQuery1.SQL.Add('case when rate_start_date > ''2011.08.19''');
      uniQuery1.SQL.Add('then ''2011.08.21'' else rate_end_date end) AS days FROM room_rates');
      uniQuery1.SQL.Add('WHERE room_type = ''DBLMS'' AND rate_start_date <= ''2011.08.21''');
      uniQuery1.SQL.Add('AND rate_end_date > ''2011.08.19''');
      uniQuery1.Open;
    end;
    

    作为附加建议,请尝试使用参数而不是字符串文字,这样除了其他优势外,您还可以保护您的代码免受 sql 注入。查看这篇文章Using Parameters in Queries

    【讨论】:

    • 我使用了你的建议并用参数替换了日期,room_types 但仍然没有显示 DAYS。有趣...SQL 服务器显示天数没有问题...这是为什么?
    • 似乎 TMS 网格以及 cxGrid 不想显示“天”字段,而 Delphi 8standard 内置网格的字段则显示。这确实很奇怪......
    猜你喜欢
    • 2020-10-06
    • 2020-12-02
    • 2020-06-14
    • 2021-11-12
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多