【问题标题】:'Open' or 'ExecSQL' detect query difference before executing'Open' 或 'ExecSQL' 在执行前检测查询差异
【发布时间】:2016-11-09 09:44:37
【问题描述】:

有些查询需要使用“Open”命令和一些“ExecSQL”。

我正在使用备忘录进行查询(第一次)

Query1.SQL.Text := ADVMemo1.Lines.Text;

并且无法弄清楚如何处理上述差异 点击按钮。

有没有办法在按下按钮时检查它,以便知道要应用什么? 比如...如果查询以插入或更新开头,则执行其他...

【问题讨论】:

  • 您的 Query1 是什么数据类型?
  • 不确定你的意思...
  • 试试 StartsText() 函数。但我认为你在做什么是个坏主意。您应该始终明确说明您从数据库中返回的内容,现在您有一个可以返回数据集的按钮。
  • 我的意思是,Query1 是什么 TDataSet 后代类型?查看它在表单或数据模块上的声明位置。另请参阅en.wikipedia.org/wiki/SQL_injection
  • 它是一个绝对数据库查询 ...ABSQuery1: TABSQuery;没什么...

标签: delphi absolute-db


【解决方案1】:

此例程将检查 SQL 是否以 select 语句开头,如果是,则打开它,否则将执行它。

procedure OpenOrExecute(Query: TABSQuery);
var Command: string;
begin
  Command := LowerCase(Copy(Trim(Query.Sql.Text), 1, 6));
  if Command = 'select' then
  begin
    Query.Open;
  end
  else
  begin
    Query.ExecSQL;
  end;   
end;

现在您可以随时使用它打开/执行查询。示例:

OpenOrExecute(Query1);

虽然这只适用于非常简单的查询,例如使用exec 命令调用的存储过程可能会或可能不会返回记录集。仅从 SQL 命令是无法知道的。

【讨论】:

  • @user3351050 您应该阅读this question 的答案。解析输入文本不是万无一失的。
  • 我会反过来,检查查询是否以 SELECT 开头(修剪 SQL 文本后)=> .Open。否则.ExecSQL。可能有更多的 SQL 语句可能会或可能不会返回记录集。这对于绝对数据库来说可能就足够了,但对于 MSSQL、Oracle、MySQL 等数据库来说会失败......
  • 如果你反转它并且只检查SELECT(或select,如果你愿意的话)会更容易(更快)。一个返回行集的存储过程呢?
  • “另一种方法”是检查SELECT。我没有提到EXEC 这当然是个问题。但我不认为 abs-db 支持 SP。 “您应该已经知道每个查询是命令还是选择...” - OP 正在从备忘录中获取查询文本 - 这可以是任何语句,包括 CREATE/ALTER/DROP/EXEC等等……
  • 实际上,我只是为了学习而使用它。我在 components ace 网站上看到了一些示例,他们使用备忘录进行查询。然后我遇到了一个问题,我需要告诉我的按钮我正在执行什么类型的查询。这就是我问的原因,因为我一生中从未使用过备忘录来进行查询。另外我认为答案非常好,所以我不明白有人怎么能拒绝它。它检查前 6 个非常独特的字符。这是简单的数据库,不是 sql server 或 oracle。 SELECT 命令也属于“打开”的东西,不是吗?
猜你喜欢
  • 2022-10-13
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 2019-12-27
  • 2015-08-29
  • 2014-10-14
相关资源
最近更新 更多