Delphi SQL查询参数

Delphi SQL查询参数,delphi,Delphi,这很好: Query = 'SELECT * from table_1 where code = :value; '; 但是,我尝试使用LIKE语句,它表示在本例中找不到参数值: Query = 'SELECT * from table_1 where code LIKE ''%:value;%'''; Param := ADOQuery1.Parameters.ParamByName('value'); Param.DataType := ftString; Param.Value :=

这很好:

Query  = 'SELECT * from table_1 where code = :value; ';
但是,我尝试使用LIKE语句,它表示在本例中找不到参数值:

Query = 'SELECT * from table_1 where code LIKE ''%:value;%''';

Param := ADOQuery1.Parameters.ParamByName('value');
Param.DataType := ftString;
Param.Value := 'bob';

我想使用反斜杠来忽略引号,因为它在大多数语言中都有效,但在Delphi中似乎不起作用。

参数会自动将引号放在字符串周围。因此,不能在SQL查询中包含此类引号。因此,您也无法在查询中传递
%
语法

相反,将您的语句保留为原始语句(将
=
替换为
LIKE
),并将
%
传递给实际值

Query = 'SELECT * from table_1 where code LIKE :value';
Param := ADOQuery1.Parameters.ParamByName('value');
Param.DataType := ftString;
Param.Value := '%bob%';

另一方面,这段代码有点优雅

ADOQuery1.Parameters.ParamValues['value']:= '%bob%';

不用说,这是一根绳子。它将自动检测。

参数会自动为您在字符串周围加引号。因此,不能在SQL查询中包含此类引号。因此,您也无法在查询中传递
%
语法

相反,将您的语句保留为原始语句(将
=
替换为
LIKE
),并将
%
传递给实际值

Query = 'SELECT * from table_1 where code LIKE :value';
Param := ADOQuery1.Parameters.ParamByName('value');
Param.DataType := ftString;
Param.Value := '%bob%';

另一方面,这段代码有点优雅

ADOQuery1.Parameters.ParamValues['value']:= '%bob%';

不用说,这是一根绳子。它将自动检测。

“无需告诉它它是一个字符串(
Param.DataType
)。它将自动检测。”

总的来说,这是真的。 实际上,它取决于一些
t连接
属性,例如
.ParamCreate
.ResourceOptions.AssignedValue.rvParamCreate
.ResourceOptions.AssignedValue.rvDefaultParamType=false
,以及
defaultParamDataType
。如果这些属性没有改变,那么 它将自动检测到

所以在某些情况下,这是明确的

“不需要告诉它它是一个字符串(Param.DataType)。它会自动检测到。”

总的来说,这是真的。 实际上,它取决于一些
t连接
属性,例如
.ParamCreate
.ResourceOptions.AssignedValue.rvParamCreate
.ResourceOptions.AssignedValue.rvDefaultParamType=false
,以及
defaultParamDataType
。如果这些属性没有改变,那么 它将自动检测到


所以在某些情况下,这是明确的

如果删除
,会发生什么从值开始?很确定这就是为什么要扔它。我甚至认为这不是有效的SQL语法。事实上,我明白你的问题。不能在参数周围使用引号,但同时需要在其中使用
%
。相反,将
%
包含在传递给参数的实际值中,而不是包含在语句中。这很有效!感谢哪一部分起作用了?第二部分(在您编辑之后)我基本上包括了带有“bob”的
%
。@jerrydoge fyi
是ANSI SQL标准中的语句终止符。然而,在微软的TSQL中,它通常是可选的。我最需要它的地方是在使用非常强大的CTE时。以至于我习惯于在它们前面加上
以确保终止先前可能存在的任何语句。例如,
;使用CteAlias AS(选择…)
如果删除
,会发生什么从值开始?很确定这就是为什么要扔它。我甚至认为这不是有效的SQL语法。事实上,我明白你的问题。不能在参数周围使用引号,但同时需要在其中使用
%
。相反,将
%
包含在传递给参数的实际值中,而不是包含在语句中。这很有效!感谢哪一部分起作用了?第二部分(在您编辑之后)我基本上包括了带有“bob”的
%
。@jerrydoge fyi
是ANSI SQL标准中的语句终止符。然而,在微软的TSQL中,它通常是可选的。我最需要它的地方是在使用非常强大的CTE时。以至于我习惯于在它们前面加上
以确保终止先前可能存在的任何语句。例如,
;将CteAlias设置为(选择…)。