过滤数据库表中的多个记录会引发语法错误/访问冲突

时间:2015-03-16 13:16:14

标签: delphi delphi-xe2 sybase-asa tcxgrid

使用Delphi XE2。

我有一个数据库软件包,它将表中的记录显示在cxgrid上。我已经实现了一个过滤按钮,只需点击它就可以让用户使用特定记录搜索结果。目前它仅在选择了其中一条记录时才有效,当选择了多条过滤记录时,它不会喜欢它,它会显示以下错误....'语法错误或访问违规行为:附近'和'在... [和]&#39 ;.以下代码是我点击过滤器按钮时所做的。

非常感谢任何帮助。

begin
  with dmData.aQry do
begin
  Close;
  SQL.Clear;
  SQL.Text:= ('select * from DBA.RECORDS');
  if dbluCaseCategory.Text <> '' then SQL.Add('where category_type like :category_type');
  if dbluSubCategory.Text <> '' then SQL.Add('and sub_cat_type like :sub_cat_type');
  if dbluCustomer.Text <> '' then SQL.Add('and customer_name like :customer_name');
  if dbluUsername.Text <> '' then SQL.Add('and created_by_user like :created_by_user');
  if cxStartDateEdit.Text <> '' then SQL.Add('and logged_dt like :logged_dt');

  if dbluCaseCategory.Text <> '' then ParamByName('category_type').Value := dbluCaseCategory.Text +'%';
  if dbluSubCategory.Text <> '' then ParamByName('sub_cat_type').Value := dbluSubCategory.Text +'%';
  if dbluCustomer.Text <> '' then ParamByName('customer_name').Value := dbluCustomer.Text +'%';
  if dbluUsername.Text <> '' then ParamByName('created_by_user').Value := dbluUsername.Text +'%';
  if cxStartDateEdit.Text <> '' then ParamByName('logged_dt').Value := cxStartDateEdit.Text +'%';
  Open;
end;
  Close;
end;

1 个答案:

答案 0 :(得分:1)

只有在包含第一个过滤器(dbluCaseCategory.Text)时,您的代码才有效,因为您只在该部分添加where句子。因此,如果您没有将任何值传递给dbluCaseCategory,则最终的SQL句子将无效。为了解决这个问题,只需在第一句中添加Where 1=1即可。像这样。

  with dmData.aQry do
  begin
    Close;
    SQL.Clear;
    SQL.Add('select * from DBA.RECORDS Where 1=1');
    if dbluCaseCategory.Text <> '' then SQL.Add('and category_type like :category_type');
    if dbluSubCategory.Text <> '' then SQL.Add('and sub_cat_type like :sub_cat_type');
    if dbluCustomer.Text <> '' then SQL.Add('and customer_name like :customer_name');
    if dbluUsername.Text <> '' then SQL.Add('and created_by_user like :created_by_user');
    if cxStartDateEdit.Text <> '' then SQL.Add('and logged_dt like :logged_dt');

    if dbluCaseCategory.Text <> '' then ParamByName('category_type').Value := dbluCaseCategory.Text +'%';
    if dbluSubCategory.Text <> '' then ParamByName('sub_cat_type').Value := dbluSubCategory.Text +'%';
    if dbluCustomer.Text <> '' then ParamByName('customer_name').Value := dbluCustomer.Text +'%';
    if dbluUsername.Text <> '' then ParamByName('created_by_user').Value := dbluUsername.Text +'%';
    if cxStartDateEdit.Text <> '' then ParamByName('logged_dt').Value := cxStartDateEdit.Text +'%';
    Open;