在数据库 table 中筛选多个记录会引发语法 error/access 违规
Filtering more than one record in database table throws up syntax error/access violation
使用 Delphi XE2。
我有一个数据库软件包,可以将 table 中的记录显示到 cxgrid 中。我已经实现了一个过滤器按钮,点击它允许用户使用特定记录搜索结果。 At the moment it only works when 1 of the records is selected, it doesn't like it when more than one of the filter records is selected, it displays the following error....'syntax error or access violation: near 'and' 在...[和]'。以下代码是我在单击过滤器按钮时所做的。
如有任何帮助,我们将不胜感激。
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;
您的代码只有在包含第一个过滤器 (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;
使用 Delphi XE2。
我有一个数据库软件包,可以将 table 中的记录显示到 cxgrid 中。我已经实现了一个过滤器按钮,点击它允许用户使用特定记录搜索结果。 At the moment it only works when 1 of the records is selected, it doesn't like it when more than one of the filter records is selected, it displays the following error....'syntax error or access violation: near 'and' 在...[和]'。以下代码是我在单击过滤器按钮时所做的。
如有任何帮助,我们将不胜感激。
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;
您的代码只有在包含第一个过滤器 (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;