【问题标题】:Selecting records to print using Fastreport使用 Fastreport 选择要打印的记录
【发布时间】:2014-12-25 11:56:46
【问题描述】:

我有一份报告,我想在其中选择要显示/打印的数据。
我正在使用 UniDAC 作为数据连接,当我不选择数据时它工作得很好,只需将其全部打印出来。
我的报告代码中有一个名为 varDiaryGuid 的变量,我分配了我想要过滤记录的值。
在我的测试中,此变量在打开报告之前被赋值为 {A13CE6A0-7EB0-469A-87D7-3518FB9F365A}。
当报告开始时,它会显示一个消息框开始报告:{A13CE6A0-7EB0-469A-87D7-3518FB9F365A},因此该变量应该是可用的。
但后来我收到一条错误消息,提示意外字符 - 经过一些测试后,它看起来像是 GUID 开头的 {。
有人对我接下来要测试的内容有一些想法吗?

procedure frxReport1OnStartReport(Sender: TfrxComponent);
begin
  ShowMessage('Start report: ' + varDiaryGuid);                                                          
  qryDiary.Close;                             
  qryDiary.SQL.Clear;
  qryDiary.SQL.Text := 'SELECT * FROM qrymd_diary WHERE (flddiary_guid = ' + varDiaryGuid + ')';
  qryDiary.Open;                  
end;

【问题讨论】:

    标签: sql delphi fastreport


    【解决方案1】:

    您应该为查询使用参数(安全性和性能)。

    qrydiary 组件的查询定义为OI 为

    SELECT
      *
    FROM
      qrymd_diary
    WHERE
      flddiary_guid = :diary_guid
    

    在您的代码中,您只需分配参数值

    procedure frxReport1OnStartReport(Sender: TfrxComponent);
    begin
      ShowMessage('Start report: ' + varDiaryGuid);                                                          
      qryDiary.Close;                             
      qryDiary.ParamByName( 'diary_guid' ).Value := varDiaryGuid;
      qryDiary.Open;                  
    end;
    

    根据您使用的 sql 组件,您还必须定义参数的数据类型。其中一些可以解析类型,而另一些则需要您的帮助。只需使用 OI 检查参数类型即可。

    您可以在documentation中阅读有关使用参数的更多信息

    【讨论】:

    • 感谢您的输入,我一直在尝试这样,但不同之处在于我使用 .AsSting 就像我在其他查询中一直所做的那样,但这在 FastReport 中不起作用 - 但 .很抱歉没有早点回答,但我已经住院了。
    • @OZ8HP 没问题,你已经在另一个问题中提到了原因。
    【解决方案2】:
    qry.SQL.Text := 'SELECT * FROM table WHERE (someTextField = ' + 
                     varSomeText + 
                    ')';
    

    在这种通过代码发送 sql 命令的查询中,您应该引用文本/字符串变量,例如:

    qry.SQL.Text := 'SELECT * FROM table WHERE (someTextField = ' + 
                    QuotedStr(varSomeText) + 
                    ')';
    

    QuotedStr()用“'”s封装参数

    【讨论】:

    • 这是错误的,原因有两个:1) 不,您不应该引用文本/字符串变量 - 您应该使用参数,然后使用参数的 AsString 属性分配值,以及 2)因为您不引用 GUID,所以引号或 QuotedStr 在这里不起作用。
    • 如果您使用“应该”,那么他应该使用存储过程。我不会争论报价。
    • 不,存储过程绝对不需要简单地选择几行,这样做也没有任何问题。不过,字符串连接从不是正确的解决方案。
    • 有什么问题吗?数据库的统计性能改进如何?发送纯 sql 语句时,该操作会对性能造成很大影响。比如说,一个普通的查询运行 5 秒,运行
    • 我不是在争论 SELECT 与存储过程的使用。这里的讨论是关于你的答案是否正确,而不是因为我在第一条评论中描述的原因。引用 GUID 并不能解决发布者的问题,也不能解决字符串。这里的解决方案是使用参数,因此您的答案实际上是不正确的。这也是最有可能单行的简单选择(通常使用 GUID,因为它们是不重复的不同值),因此您的“统计性能改进”与此处无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多