我正在通过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必须关闭并打开以查看更改,因为某些奇怪的原因 - 我尝试刷新无效...
修改
//按要求包含表格结构......
在Absolute Database Utils目录中有一个DatabaseManager.exe,我用它来创建实际的表,在这里我现在还设置了一个类型的主键:
类型 - 主要 名称 - ID
索引的字段:
ColumnName - ID CaseInsensitive - 错误 ASC - 真的 MaxIndexSize - 20
答案 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。