【问题标题】:delphi adoquery filter with listbox items [closed]带有列表框项目的delphi adoquery过滤器[关闭]
【发布时间】:2023-04-08 23:35:01
【问题描述】:

这是最终的,但已经不是过滤器
任何人都知道我的过滤器问题

begin
adoquery1.SQL.CLEAR;
adoquery1.SQL.Add('select * FROM gunsonu ');
adoquery1.SQL.Add('where TARIH like :TRH');
adoquery1.Parameters.ParamByName('TRH').Value:=(PlannerDatePicker1.text);

for i := 0 to form3.ListBox1.Items.Count-1 do
adoquery1.SQL.Add(' and VLIM <> '+QuotedStr(form3.ListBox1.items[i]));
end;
adoquery1.Open;
frxReport1.ShowReport(true);

【问题讨论】:

  • 当你说“不能”时,你的意思是你的代码执行了,但是 adoquery1 没有返回任何行?最相似的原因是您的列表框项目不包含任何 '%' 通配符。如果没有,它的工作原理是你有一个“=”符号而不是“like”。
  • 此外,如果您尝试与列表框项目匹配的列是字符列,则应将“form3.ListBox1.items[i]”用“QuotedStr()”括起来
  • 我喜欢它,但它已经过滤为空 :( begin adoquery1.SQL.CLEAR; adoquery1.SQL.Add('select * FROM gunsonu '); adoquery1.SQL.Add('where TARIH像 :TRH'); adoquery1.Parameters.ParamByName('TRH').Value:=(PlannerDatePicker1.text); for i := 0 to form3.ListBox1.Items.Count-1 做 adoquery1.SQL.Add(' 和VLIM = '+ QuotedStr(form3.ListBox1.items[i])); end; adoquery1.Open; frxReport1.ShowReport(true); end;
  • 请将该代码添加到您的问题中,它应该在其中,而不是在评论中。并且,在列表框中显示值,因为看起来您正在尝试将数据行与 VLIM 列中的几个不同值进行匹配(因为 ' 和 '),这可能不是您想要的。
  • 所以马丁娜!你有什么想法,我有问题,我无法解决它

标签: sql-server delphi filter listbox


【解决方案1】:

从 Delphi 应用程序针对 MS Sql Server 设置查询的最佳方法不是不断修改应用程序中构造查询的代码,直到运行它返回您希望的结果。 Delphi 快速编译/运行周期的问题之一是它鼓励反复试验,这是 无法替代让事情正常运行。

最好将 SQL 构建任务与编码任务分开,原因有两个:

  1. Sql Server 客户端实用程序(例如 Sql Server Management Studio 或旧的 ISql/W“查询分析器”)是更好的 Sql 构建任务工具,它们可以访问服务器的执行计划、分析器等等。但是,如果您没有其中一个可用,那么多年来,Delphi 已经包含了某种“数据资源管理器”实用程序来对各种服务器运行查询 - 在最近的 XE 版本中,@ 下有一个 Firedac 987654322@ 来自 IDE 菜单。

  2. 使用其中一种工具,您可以在您面前的屏幕上实际发送到服务器的 Sql 查询。尝试在 Delphi 代码中设置 Sql 时,特别是对于初学者来说,一个常见的错误来源是发送到服务器的 Sql 查询不一定是您认为的那样。从 SO 上 qs 中出现的示例来看,它们经常充满语法或语义错误,尤其是当 Sql 应该包含引号时(Delphi IDE 的 Watch 和 Evaluate 窗口不提供查看 Sql 的良好形式)。在 Sql 查询工具中创建查询,您有机会准确查看查询是什么,并从工具中获得有关语法错误等的反馈。

  3. 使用这些工具可以更轻松地试验参数化查询的最佳方法。

3 的意义何在?好吧,一件事是服务器对参数化查询的优化通常比临时查询更好,尽管不可否认,并非所有查询都可以以参数化形式表示(例如,您不能参数化您查询的列或表) .另一件事是它有助于最大限度地减少您对 Sql-Injection 的暴露(请参阅https://en.wikipedia.org/wiki/SQL_injection)。

一旦您的查询在上述客户端 Sql 工具中按预期工作,就可以编写代码从您的 Delphi 应用程序中执行它,而不是之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多