Delphi - 清除 ADO 表

问题描述

所以我在我的程序中创建了一个按钮,该按钮应该清除数据库中的所有表,但是在运行时单击该按钮时出现错误。如何消除该错误

我正在使用的代码

ClearDB 按钮的代码

procedure TfrmEntry.bmbClearDBClick(Sender: TObject);
var
  i:integer;
begin
  i:=MessageDlg('Are you sure you want to clear the Racers database? (all current data in the database will be lost.)',mtWarning,[mbOK,mbCancel],0);
  if i = mrOk then
  begin
    //clears entire database
    with dmRacers do
    begin
      tbl1660.DeleteRecords(arall);
      tblXKarts.DeleteRecords(arall);
      tblTwoPointOne.DeleteRecords(arall);
      tblMidB.DeleteRecords(arall);
      tblMidA.DeleteRecords(arall);
      tblLateModel.DeleteRecords(arall);
      tblSprints.DeleteRecords(arall);
      tblV8.DeleteRecords(arall);
      tblHeavyMetals.DeleteRecords(arall);
      tblHotrods.DeleteRecords(arall);
      tblPinkrods.DeleteRecords(arall);
      tblStockrods.DeleteRecords(arall);
      tblMinis.DeleteRecords(arall);
      tblDevelopment.DeleteRecords(arall);
    end;
  end
  else
  begin
    i:=MessageDlg('Clear aborted',mtinformation,[mbOk],0);
  end;
end;

输入按钮代码

procedure TfrmEntry.btnEntryClick(Sender: TObject);
  var
  sRacerName,sLicence,sCarNum:string;
  iNum:integer;
begin
//saves input (works perfectly)
  sCarNum:=edtCarNumber.Text;
  sRacerName:=edtRacerName.Text;
  sLicence:=edtLicenseNum.Text;

            //ifs for saving input to the db
    if cbxGridSelect.Items[cbxGridSelect.ItemIndex] = '1660s' then
    begin
       with dmRacers do
       begin
          tbl1660.insert;
          tbl1660['Car Number']:=sCarNum;
          tbl1660['Racer Name']:=sRacerName;
          tbl1660['Licence']:=sLicence;
          tbl1660.Post;
       end;
    end
    else if cbxGridSelect.Items[cbxGridSelect.ItemIndex] = '2.1s' then
    begin
              with dmRacers do
       begin
          tblTwoPointOne.insert;
          tblTwoPointOne['Car Number']:=sCarNum;
          tblTwoPointOne['Racer Name']:=sRacerName;
         tblTwoPointOne['Licence']:=sLicence;
          tblTwoPointOne.Post;
       end;
    end
    else if cbxGridSelect.Items[cbxGridSelect.ItemIndex] = 'Crosskarts' then
    begin
              with dmRacers do
       begin
           tblXKarts.insert;
          tblXKarts['Car Number']:=sCarNum;
         tblXKarts['Racer Name']:=sRacerName;
          tblXKarts['Licence']:=sLicence;
          tblXKarts.Post;
       end;
    end
    else if cbxGridSelect.Items[cbxGridSelect.ItemIndex] = 'Heavy Metals' then
    begin
              with dmRacers do
       begin
           tblHeavyMetals.insert;
          tblHeavyMetals['Car Number']:=sCarNum;
         tblHeavyMetals['Racer Name']:=sRacerName;
          tblHeavyMetals['Licence']:=sLicence;
         tblHeavyMetals.Post;
       end;
    end
    else if cbxGridSelect.Items[cbxGridSelect.ItemIndex] = 'Hotrods' then
    begin
              with dmRacers do
       begin
        tblHotrods.insert;
          tblHotrods['Car Number']:=sCarNum;
         tblHotrods['Racer Name']:=sRacerName;
          tblHotrods['Licence']:=sLicence;
         tblHotrods.Post;
       end;
    end
    else if cbxGridSelect.Items[cbxGridSelect.ItemIndex] = 'Midgets A' then
    begin
               with dmRacers do
       begin
        tblMidA.insert;
          tblMidA['Car Number']:=sCarNum;
         tblMidA['Racer Name']:=sRacerName;
          tblMidA['Licence']:=sLicence;
         tblMidA.Post;
       end;
    end
    else if cbxGridSelect.Items[cbxGridSelect.ItemIndex] = 'Midgets B' then
    begin
               with dmRacers do
       begin
        tblMidB.insert;
          tblMidB['Car Number']:=sCarNum;
         tblMidB['Racer Name']:=sRacerName;
          tblMidB['Licence']:=sLicence;
         tblMidB.Post;
       end;
    end
    else if cbxGridSelect.Items[cbxGridSelect.ItemIndex] = 'Minis' then
    begin
               with dmRacers do
       begin
           tblMinis.insert;
          tblMinis['Car Number']:=sCarNum;
         tblMinis['Racer Name']:=sRacerName;
          tblMinis['Licence']:=sLicence;
          tblMinis.Post;
       end;
    end
    else if cbxGridSelect.Items[cbxGridSelect.ItemIndex] = 'Pinkrods' then
    begin
               with dmRacers do
       begin
           tblPinkrods.insert;
          tblPinkrods['Car Number']:=sCarNum;
         tblPinkrods['Racer Name']:=sRacerName;
          tblPinkrods['Licence']:=sLicence;
          tblPinkrods.Post;
       end;
    end
    else if cbxGridSelect.Items[cbxGridSelect.ItemIndex] = 'Sprints' then
    begin
               with dmRacers do
       begin
           tblSprints.insert;
          tblSprints['Car Number']:=sCarNum;
          tblSprints['Racer Name']:=sRacerName;
          tblSprints['Licence']:=sLicence;
          tblSprints.Post;
       end;
    end
    else if cbxGridSelect.Items[cbxGridSelect.ItemIndex] = 'Stockrods' then
    begin
               with dmRacers do
       begin
           tblStockrods.insert;
          tblStockrods['Car Number']:=sCarNum;
          tblStockrods['Racer Name']:=sRacerName;
          tblStockrods['Licence']:=sLicence;
          tblStockrods.Post;
       end;
    end
    else if cbxGridSelect.Items[cbxGridSelect.ItemIndex] = 'SWD Development' then
    begin
                with dmRacers do
       begin
          tblDevelopment.insert;
          tblDevelopment['Car Number']:=sCarNum;
          tblDevelopment['Racer Name']:=sRacerName;
          tblDevelopment['Licence']:=sLicence;
          tblDevelopment.Post;
       end;
    end
    else if cbxGridSelect.Items[cbxGridSelect.ItemIndex] = 'V8s' then
    begin
               with dmRacers do
       begin
          tblV8.insert;
          tblV8['Car Number']:=sCarNum;
          tblV8['Racer Name']:=sRacerName;
          tblV8['Licence']:=sLicence;
          tblV8.Post;
       end;
    end
    else if cbxGridSelect.Items[cbxGridSelect.ItemIndex] = 'Late Models' then
         begin
                  with dmRacers do
       begin
          tblLateModel.insert;
          tblLateModel['Car Number']:=sCarNum;
          tblLateModel['Racer Name']:=sRacerName;
          tblLateModel['Licence']:=sLicence;
          tblLateModel.Post;
       end;
         end;
  end;

数据模块的代码

   const
  scConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%pathtomdb%racers.mdb;Mode=ReadWrite;Persist Security Info=False;';

procedure TdmRacers.DataModuleCreate(Sender: TObject);
var
path:string;
begin
  path:=ExtractFilePath(ParamStr(0));
  conToDB.ConnectionString := StringReplace(scConnectionString,'%pathtomdb%',path,[]);
  conToDB.Connected:=True;
  tbl1660.Active := True;
  tblXKarts.Active := True;
  tblTwoPointOne.Active := True;
  tblMidB.Active := True;
  tblMidA.Active := True;
  tblLateModel.Active := True;
  tblSprints.Active := True;
  tblV8.Active := True;
  tblHeavyMetals.Active := True;
  tblHotrods.Active := True;
  tblPinkrods.Active := True;
  tblStockrods.Active := True;
  tblMinis.Active := True;
  tblDevelopment.Active := True;
end;

我收到的错误

enter image description here

预先感谢所有帮助!
亲切的问候
PrimeBeat

解决方法

来自 borland.public.delphi.database.ado 中 2005 年的一个帖子:

http://www.devsuperpage.com/search/Articles.asp?ArtID=877427

问题:

我正在尝试从 TADOTable 中删除所有记录。我是 使用以下代码行:

tblInvoices.DeleteRecords(arAll);

但它给出了一个错误信息:“此操作是不允许的 上下文”。

知道是什么原因造成的吗?

原因:

不幸的是,Microsoft 从未为 DeleteRecords 实现该选项。 您将需要使用删除查询。

解决方案:

不要使用 DeleteRecords,而是使用如下例程:

    CabInfo.Active := true;

    MyCmd.CommandText := 'Delete * from CabInfo';
    MyCmd.Execute;

    CabInfo.Active := false;

其中 CabInfo 是您的表名。