我正在测试 ComponentAce 的绝对数据库
我的表单上有一个 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 字符串 20
- ISBN-10 字符串 20
在 Absolute Database Utils 目录中,有一个 DatabaseManager.exe,我用它来创建实际的表,在这里我现在还设置了以下类型的主键:
类型 - 主要 姓名 - ID
索引字段:
列名称 - ID 不区分大小写 - False ASC-真 最大索引大小 - 20
最佳答案
如果你知道所有要删除的记录的主键,那么你可以使用一条SQL查询语句来一次性删除所有选定的记录 -
delete from table
where id in (1, 7, 15, 23, 45);
您必须手动构建此查询,即创建保存 ID 号的字符串。
关于database - 如何从 TDBAdvListView 中删除选定的数据库记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12939283/