如何从TDBAdvListView中删除选定的数据库记录?

时间:2012-10-17 16:48:27

标签: database delphi delphi-xe2

我正在通过ComponentAce测试绝对数据库

我在Form上有一个TABSTable,TABSDatabase和一个TDataSource,数据显示在TDBAdvListView中,MultiSelect和RowSelect为True。我只有一张桌子。

如果选择了TDBAdvListView中的一个或多个项目,我希望数据库删除所选记录。

我在下面的代码中尝试过这种方式:

procedure TMain.DeleteEntry2Click(Sender: TObject);
var
  i: Integer;
begin
  with DBAdvListView1.DataSource.DataSet do
  begin
    for i := DBAdvListView1.Items.Count - 1 downto 0 do begin
    if DBAdvListView1.Items[i].Selected then
    begin
      DBAdvListView1.DataSource.DataSet.GotoBookmark(Pointer(DBAdvListView1.Items[i]));
      DBAdvListView1.DataSource.DataSet.Delete;
      end;
    end;
  end;
end;

这总是会导致错误消息:

Cannot retrieve record - Native error: 10026

我对数据库编程的经验很少,我做错了什么?

修改

我在名为ID的数据库中添加了一个新字段作为从0开始的整数,希望我可以使用Locate方法引用它们并尝试使用下面的代码。这不会产生任何错误,但只会删除ListView中的顶级记录,如果我选择多个记录,它将删除不同于所选记录的记录。

我的新代码:

procedure TMain.DeleteEntry2Click(Sender: TObject);
var
  i: Integer;
begin
  with DBAdvListView1.DataSource.DataSet do
  begin
    DBAdvListView1.BeginUpdate;
    First;
    for i := DBAdvListView1.Items.Count - 1 downto 0 do begin
    if DBAdvListView1.Items[i].Selected then
    begin
      if dbTable.Locate('ID',DBAdvListView1.Items[i].Selected,[]) then
      dbTable.Delete;
      Next;
      end;
    end;
  dbTable.Close;
  dbTable.Open;
  DBAdvListView1.EndUpdate;
  end;
end;

dbTable必须关闭并打开以查看更改,因为某些奇怪的原因 - 我尝试刷新无效...

修改

//按要求包含表格结构......

  • ID整数0
  • 标题字符串200
  • 作者字符串100
  • 日期字符串20
  • 位置字符串60
  • 类别字符串100
  • ISBN-13 string 20
  • ISBN-10 string 20

在Absolute Database Utils目录中有一个DatabaseManager.exe,我用它来创建实际的表,在这里我现在还设置了一个类型的主键:

类型 - 主要 名称 - ID

索引的字段:

ColumnName - ID CaseInsensitive - 错误 ASC - 真的 MaxIndexSize - 20

3 个答案:

答案 0 :(得分:2)

如果您知道要删除的所有记录的主键,那么您可以使用一个SQL查询语句来一次删除所有选定的记录 -

delete from table
where id in (1, 7, 15, 23, 45);

您必须手动构建此查询,即创建包含ID号的字符串。

答案 1 :(得分:0)

回答自己的问题......我使用以下代码删除所选记录:

procedure TMain.Button5Click(Sender: TObject);
var
  i: Integer;
begin
  with DBAdvListView1 do
    for i := 0 to Items.Count - 1 do
      if Items[i].Selected then
      begin
        Memo1.Lines.Add(Items[i].Caption + ' - Selected!'); //Test for Correct ID's!
      if dbTable.Locate('ID', Items[i].Caption, []) then
      DBAdvListView1.Datasource.DataSet.Delete;
    end;
  dbTable.Close;
  dbTable.Open;
end;

答案 2 :(得分:0)

如果您只删除Next,第二个代码将起作用;来自if部分。因为你已经在'for'循环中,所以不需要使用Database.Next。