【问题标题】:Return value using alias name使用别名返回值
【发布时间】:2017-11-30 03:32:41
【问题描述】:

我写了这样的代码:

sql1 :='select sum(jumlah) as debet from kasir_kas_transaksi where flag in (1,3) and tanggal = to_date('+quotedstr(after)+','+quotedstr('dd-mm-yyyy')+')';

with zquery1 do begin
  close;
  sql.clear;
  sql.Add(sql1);
  execSQL;
end;
edit1.Text:=zquery1.fieldbyname('debet').asstring;

然后发生错误,提示字段“debet”不存在。 代码有问题吗? 我使用delphi 7和zeos作为连接,以及oracle 11g作为db。谢谢!

【问题讨论】:

    标签: delphi oracle11g delphi-7 zeos


    【解决方案1】:

    使用Open,而不是ExecSQLExecSQL 用于不返回结果集的查询(INSERTDELETEUPDATE)。 Open 用于返回行的查询。 您也不需要使用SQL.Clear; 然后SQL.Add(); - 您可以直接设置SQL.Text

    (你应该停止使用with;这是一个不同的话题,但我把它留在这里,因为它是你的代码,而不是我的。)

    with ZQuery1 do
    begin
      SQL.Text := sql1;
      Open;
    end;
    Edit1.Text := ZQuery1.FieldByName('debet').AsString;
    

    请注意,停止连接 SQL 并改用参数。字符串与用户输入的连接让您对 SQL 注入敞开大门。谷歌 Little Bobby Tables 找出为什么这是一件坏事,如果你还不知道的话。您可以找到一个示例 here 使用参数来编写代码。

    【讨论】:

    • 非常感谢您的帮助。我在编码方面是超级新手,所以我缺乏很多基础知识。再次,谢谢!
    • 但是,你能告诉我一些关于 with 的知识吗?这将有助于我将要进行的未来编码。再次感谢您!
    • 是的。停止使用with。它可能会导致难以发现的错误。删除它并只输入多余的字符比浪费时间尝试解决由 with 语句的意外结果引起的问题要好得多。
    • 扩展@Ken 的评论:with 在旧的 Pascal 中非常有用,它可以用来提高某些代码段的效率。但那是在简单的、非优化的编译器时代,而且 Pascal 没有任何面向对象的扩展。这些天来,尤其是因为 OO 具有更复杂的范围,with 可能会成为一个大问题,应该避免。
    • @mizkyd 您在发布的代码中使用了with。你在不知道它的作用的情况下这样做了?
    猜你喜欢
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    相关资源
    最近更新 更多