我正在尝试过滤从数据库加载到 DBGrid 中的产品。当我尝试过滤时,无法执行查询。它返回给我一个空白
sql.Text
。我不知道为什么会出现这种情况?
这是我的代码
procedure TProizvodiForm.PronadjiButtonClick(Sender: TObject);
var Filter: string;
begin
Filter := 'SELECT productid as ID, name as Proizvod, code as Kod, manufname as Proizvodjac, unitname as Pakovanje FROM product WHERE ';
if prizvodFilterTEdit.Text <> '' then
begin
Filter := Filter + '`name` LIKE ' + QuotedStr(prizvodFilterTEdit.Text+'%');
end;
if kodFilterTEdit.Text <> '' then
begin
Filter := Filter + ' AND code LIKE ' + QuotedStr(kodFilterTEdit.Text+'%');
end;
if proizvodjacFilterTEdit.Text <> '' then
begin
Filter := Filter + ' AND manufname LIKE ' + QuotedStr(proizvodjacFilterTEdit.Text+'%');
end;
with DB.ZQuerySelect do
begin
Active := false;
sql.Clear;
sql.Text := Filter;
Active := true;
ShowMessage(sql.Text); // debug
end;
end;
但是,这个工作 当我直接将查询放入
sql.Text
时,它可以工作,但是当设置为变量时,则不起作用。
with DB.ZQuerySelect do
begin
Active := false;
sql.Clear;
sql.Text := 'SELECT productid as ID, name as Proizvod, code as Kod, manufname as Proizvodjac, unitname as Pakovanje FROM product WHERE `name` LIKE ' + QuotedStr(prizvodFilterTEdit.Text+'%');
Active := true;
ShowMessage(sql.Text);
end;
不确定这是否是问题所在,但我在你的代码中看到的一个问题是,如果任何
TEdit
控件为空,那么你的 Filter
将是一个 malformed SQL 语句(并且你应该得到一个运行时错误关于那个)。您没有足够准确地处理 WHERE
和 AND
子句,以至于无法忽略任何过滤子句。
试试这个:
procedure TProizvodiForm.PronadjiButtonClick(Sender: TObject);
var
FullSQL, Filter: string;
begin
FullSQL := 'SELECT productid as ID, name as Proizvod, code as Kod, manufname as Proizvodjac, unitname as Pakovanje FROM product';
if prizvodFilterTEdit.Text <> '' then
begin
Filter := '`name` LIKE ' + QuotedStr(prizvodFilterTEdit.Text+'%');
end;
if kodFilterTEdit.Text <> '' then
begin
if Filter <> '' then
begin
Filter := Filter + ' AND ';
end;
Filter := Filter + 'code LIKE ' + QuotedStr(kodFilterTEdit.Text+'%');
end;
if proizvodjacFilterTEdit.Text <> '' then
begin
if Filter <> '' then
begin
Filter := Filter + ' AND ';
end;
Filter := Filter + 'manufname LIKE ' + QuotedStr(proizvodjacFilterTEdit.Text+'%');
end;
if Filter <> '' then
begin
FullSQL := FullSQL + ' WHERE ' + Filter;
end;
with DB.ZQuerySelect do
begin
Active := false;
SQL.Clear;
SQL.Text := FullSQL;
Active := true;
ShowMessage(SQL.Text); // debug
end;
end;