ComponentAce の Absolute Database をテストしています
フォームに TABSTable、TABSDatabase、TDataSource があり、データは TDBAdvListView に表示され、MultiSelect と RowSelect は True です。テーブルは 1 つしかありません。
TDBAdvListView 内の 1 つ以上のアイテムが選択されている場合、選択したレコードをデータベースに削除させたいと考えています。
以下のコードでこの方法を試しました。
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
インデックスのフィールド:
ColumnName - ID CaseInsensitive - False ASC - True MaxIndexSize - 20