我有一份报告,我想选择要显示/打印的数据
我正在使用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;
答案 0 :(得分:2)
您应该使用参数进行查询(安全性和性能)。
使用OI定义qrydiary
组件的查询
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
中详细了解如何使用参数答案 1 :(得分:0)
qry.SQL.Text := 'SELECT * FROM table WHERE (someTextField = ' +
varSomeText +
')';
在这种通过代码发送sql命令的查询中,你应该引用文本/字符串变量,如:
qry.SQL.Text := 'SELECT * FROM table WHERE (someTextField = ' +
QuotedStr(varSomeText) +
')';
QuotedStr()
将参数封装为“'
”s