【问题标题】:How to correctly translate sql-code in Delphi如何在 Delphi 中正确翻译 sql 代码
【发布时间】:2018-12-12 21:14:51
【问题描述】:

在 sql-editor 中,这段代码可以正常工作:

Select *
from Journal
where status<>'D' 
order by JDate,J_ID

但无法在 Delphi 中编写正确的代码。

1)

dstJournal.Close;
dstJournal.SQL.Clear;
dstJournal.SQL.CommaText:='Select * from Journal  order by JDate,J_ID';

sql 错误代码=-104: Token Unknown J_ID

如果我只写 'order by JDate' 或只写 'oder by J_ID' 那么它可以工作。

2) 如果我写:

dstJournal.SQL.CommaText:='Select * from Journal where Status<>"D" ';

得到错误:sql 错误代码=-206:Column Unknown D.

我尝试了“D”,但 delphi 无法编译并显示“缺少运算符或分号”消息。

如何编写正确的delphi代码?

【问题讨论】:

  • D 的每一侧是一个双引号还是两个单引号?它应该是两个单引号,表示 D 是一个值而不是列名。
  • @J... 不,这是一个 SQL 的东西。
  • @RemyLebeau ...是的,我的错。我主要在 MySQL 中工作,双引号在那里很好,至少在 ANSI_QUOTES 关闭的情况下。

标签: sql delphi firebird


【解决方案1】:

不要使用CommaText。它用于将 SDF 格式(引号、逗号分隔)的文本解析到 TStrings 对象中或从中取出。这不是你正在做的,所以不要使用它。

改为设置Text

dstJournal.SQL.Text := 'SELECT * FROM Journal WHERE status <> ''D'' ORDER BY JDate, J_ID';

或者使用Add()方法:

dstJournal.SQL.Clear;
dstJournal.SQL.Add('SELECT * FROM Journal');
dstJournal.SQL.Add('WHERE status <> ''D''');
dstJournal.SQL.Add('ORDER BY JDate, J_ID');

我尝试了“D”,但 delphi 无法编译:缺少运算符或分号。

Delphi 字符串用单引号括起来,因此如果您打算将它们放入查询中,则必须使用两个单引号将它们转义。

  dstJournal.SQL.Add('WHERE status <> ''D''');

【讨论】:

  • @basti 在您提出问题后不要编辑您的问题 - 现在完全是一个不同的问题。如果您在第一个问题解决后有新问题,请提出新问题。
  • J... 我写:dstJournal.Sql.Add('Select * from Journal where STATUS"D" order by JDate,J_ID');错误:列未知 D
  • J..,我知道。字段名称为 STATUS。出于这个原因,我写了 STATUS 但我收到了同样的错误。
  • 因为'D' 数据最好不要插入到 SQL 代码中。使用 SQL 参数将程序和数据分开。 bobby-tables.comgithub.com/petdance/bobby-tables/issues/98
  • @J...Firebird is case sensitive [about table and column names] by default, I believe - 不,不是。如果您使用 SQL 方言 3(您应该在 1999 年之后使用),您可以通过将标识符放在双引号中来强制 FB 区分大小写,因此这些将是 3 个不同的列:Select ... "status", "Status", "STATUS" from... 但没有转义(或在方言 1 中没有转义)支持它)标识符全部大写变得不区分大小写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多