Delphi 在运行时更改数据库查询

Delphi 在运行时更改数据库查询,delphi,filtering,delphi-2010,firebird2.5,dbgrid,Delphi,Filtering,Delphi 2010,Firebird2.5,Dbgrid,我试图通过TEdit过滤TDBGrid,处理TEditonChange事件。 我有一个TIBQuery来列出网格中的所有记录: SELECT id,obra,cliente,fecha,nro_estudio,sondeo FROM proyecto; 当用户在TEdit中插入字符时,必须通过Cliente字段刷新网格 我的代码尝试这样做,但是当它执行处理程序时,查询返回一个空的resultset。我正在使用Firebird 2.5和IB组件 相关代码: query := Self.qryTo

我试图通过
TEdit
过滤
TDBGrid
,处理
TEdit
onChange
事件。 我有一个
TIBQuery
来列出网格中的所有记录:

SELECT id,obra,cliente,fecha,nro_estudio,sondeo FROM proyecto;
当用户在
TEdit
中插入字符时,必须通过
Cliente
字段刷新网格

我的代码尝试这样做,但是当它执行处理程序时,查询返回一个空的resultset。我正在使用Firebird 2.5和IB组件

相关代码:

query := Self.qryTodos;
query.Close();
query.SQL.Clear();
query.SQL.Add('SELECT id,obra,cliente,fecha,nro_estudio,sondeo FROM proyecto WHERE cliente LIKE :Cliente');
query.ParamByName('Cliente').AsString := QuotedStr('%'+Self.busqueda.Text+'%');
query.Open();
DMConnect.Transaction.Commit();

在提供字符串参数时,不需要QuotedStr。通过使用它,您可以使其不再匹配(例如,“String”变为“'%String%”)

如果您将搜索词包围在%I中,我将使用containing子句,因此您可以编写如下查询:

query := Self.qryTodos;
query.Close();
query.SQL.Clear();
query.SQL.Add('SELECT id,obra,cliente,fecha,nro_estudio,sondeo FROM proyecto WHERE cliente CONTAINING :Cliente');
query.ParamByName('Cliente').AsString := Self.busqueda.Text;
query.Open();

并删除Commit语句,如@lightbull所述。如果您出于任何原因希望在搜索词中包含%。

我尝试使用此
…例如'+'%''''+Self.busqueda.Text+'%''''''
。但是,程序崩溃了?有了这条消息:“尝试执行一个未准备好的动态SQL语句”就会出现两个问题:如果仍然有参数referent(:Cliente),则需要在执行之前为查询分配参数值。此外,在上面的表达式中,在字符串的开头引号之前添加了通配符:这将无法正确解析。另外,作为旁注,如果字符串值有任何嵌入的单引号,则该方法将中断--最好使用参数来构造查询字符串。请删除/注释最后一行(
DMConnect.Transaction.Commit();
),然后重试。通过提交事务,您将隐式关闭所有连接的数据集。