在SQL中使用QuotedStr

在SQL中使用QuotedStr,sql,oracle,delphi,delphi-7,Sql,Oracle,Delphi,Delphi 7,我需要在下面的原因中添加另一个条件 SQL.Add('where (cmcl_bank_cleared is not null) AND ((cmcl_bank_cleared - check_date) >=:DaysParam)'); 我还需要补充一点 和cmcl_银行于2011年1月1日、年月日清算 问题是单引号 我能做以下事情吗 SQL.Add('where (cmcl_bank_cleared is not null) AND '); SQL.Add('(cmcl_bank_c

我需要在下面的原因中添加另一个条件

SQL.Add('where (cmcl_bank_cleared is not null) AND ((cmcl_bank_cleared - check_date) >=:DaysParam)');
我还需要补充一点

和cmcl_银行于2011年1月1日、年月日清算

问题是单引号

我能做以下事情吗

SQL.Add('where (cmcl_bank_cleared is not null) AND ');
SQL.Add('(cmcl_bank_cleared <> to_date(' + QuotedStr(01/01/2011) + ', ' + QuotedStr('mm/dd/yyyy') + ')');
SQL.Add('((cmcl_bank_cleared - check_date) >=:DaysParam)');

是的,那很好。请记住,QuotedStrS通过将引号加倍来逃避S中的任何引号。因为字符串中没有任何单引号,所以可以


我猜你的意思是引用STR'01/01/2011'而不是引用STR01/01/2011。你也错过了一个和。

是的,那很好。请记住,QuotedStrS通过将引号加倍来逃避S中的任何引号。因为字符串中没有任何单引号,所以可以


我猜你的意思是引用STR'01/01/2011'而不是引用STR01/01/2011。您也错过了AND。

您可以使用QuotedStr构建查询,但这不是最好的主意。如果任何输入来自用户,理论上他们都可以。这被称为SQL注入,对于许多网站来说是一个严重的安全问题


在这样的查询中间插入值的正确而安全的方法是使用参数化查询。查阅数据集Params属性的文档,了解其工作原理。

您可以使用QuotedStr构建查询,但这不是最好的方法。如果任何输入来自用户,理论上他们都可以。这被称为SQL注入,对于许多网站来说是一个严重的安全问题

在这样的查询中间插入值的正确而安全的方法是使用参数化查询。查阅数据集Params属性的文档,了解它是如何工作的。

QuotedStr只会使代码更加复杂,因为您建议使用它。相反,由于您要在SQL中硬编码日期,只需使用普通的Delphi语法,通过将撇号加倍,将撇号放在字符串文本中:

SQL.Add('(cmcl_bank_cleared <> to_date(''01/01/2011'', ''mm/dd/yyyy'')) AND');
QuotedStr只会使代码的使用方式更加复杂。相反,由于您要在SQL中硬编码日期,只需使用普通的Delphi语法,通过将撇号加倍,将撇号放在字符串文本中:

SQL.Add('(cmcl_bank_cleared <> to_date(''01/01/2011'', ''mm/dd/yyyy'')) AND');

是的,您可以这样做,但请再次检查SQL语法,因为您缺少AND,并且必须引用字符串文字或字符串变量。您使用参数的原因是:DaysParam,而不是日期范围?i、 e cmcl_银行已清算:DateParamName;ParamByName'DateParamName'。AsDateTime:=EncodeDate2011,01,01格里是对的。绑定变量使代码更安全,也可能使代码更快后者取决于SQL用法是的,您可以这样做,但请再次检查SQL语法,因为您缺少and,并且必须引用字符串文字或字符串变量。是否有任何原因要为:DaysParam而不是日期范围使用参数?i、 e cmcl_银行已清算:DateParamName;ParamByName'DateParamName'。AsDateTime:=EncodeDate2011,01,01格里是对的。绑定变量使代码更安全,也可能使代码更快——后者取决于SQL usageI自从学习如何使用参数以来就没有使用QuotedStr。这是一种更安全的方法,最终也更容易,而且您可以非常方便地使用AsString、AsInteger和AsDateTime等工具。有时不使用参数是有原因的。类似数据仓库的查询很复杂,执行时间长,并且不经常使用基于成本的优化器对数据库运行,因此在没有参数的情况下,优化器可以获得更好的执行计划,因为在硬解析SQL语句时,优化器有更多的数据要分析,并且可以避免重复使用对于给定参数可能变得低效的计划。当然,如果不使用参数,代码必须是安全的,以防注入。没有一刀切的解决方案。程序员必须了解自己的应用程序环境和数据。@在设计良好的数据库引擎上,在请求解析和执行步骤中都应考虑参数。像您描述的没有参数的更好执行的DB应该使用错误的设计。或者需要修改SQL查询。我很确定现代数据库优化器在优化方面比您预期的要好。自从学习如何使用参数后,我就没有使用过QuotedStr。这是一种更安全的方法,最终也更容易,而且您可以非常方便地使用AsString、AsInteger和AsDateTime等工具。有时不使用参数是有原因的。类似数据仓库的查询很复杂,执行时间长,并且不经常使用基于成本的优化器对数据库运行,因此在没有参数的情况下,优化器可以获得更好的执行计划,因为在硬解析SQL语句时,优化器有更多的数据要分析,并且可以避免重复使用对于给定参数可能变得低效的计划。当然,如果不使用参数,代码必须是安全的,以防注入。没有一刀切的解决方案。程序员必须了解自己的应用程序环境和数据。@ldsanson一个设计良好的数据库引擎应该考虑bot中的参数 h请求解析和执行步骤。像您描述的没有参数的更好执行的DB应该使用错误的设计。或者需要修改SQL查询。我确信现代数据库优化器在优化方面比您预期的要好。