查询执行:如果要删除多个记录,则警告用户

时间:2015-07-11 05:14:39

标签: delphi

如何警告用户(使用确认对话框)他要执行的查询是否会删除多条记录?

' DELETE FROM ... WHERE ...'可以包含一个或多个记录,所以我想知道如何警告用户他将删除多个记录。

3 个答案:

答案 0 :(得分:1)

听起来你在问如何提示用户......

case MessageDlg('Are you sure you wish to delete multiple records?', mtWarning, [mbYes, mbNo], 0) of
  mrYes: begin
    //Continue
    DoWhatNeedsToBeDoneToDeleteMultipleRecords;
  end;
  mrNo: begin
    //Don't continue
  end;
end;

例如,您可以......

if ADOQuery1.RecordCount > 1 then begin
  PromptToDeleteMultipleRecords;
end;

总而言之,你的代码可能看起来像......

if ADOQuery1.RecordCount > 1 then begin
  case MessageDlg('Are you sure you wish to delete multiple records?', mtWarning, [mbYes, mbNo], 0) of
    mrYes: begin
      //Continue
      DoWhateverNeedsToBeDoneToDeleteMultipleRecords;
    end;
    mrNo: begin
      //Don't continue
    end;
  end;
end;

答案 1 :(得分:1)

这是为了解决你的“为什么这不起作用:程序TDataModule.MYTABLEBeforeDelete(DataSet:TDataSet)”?你评论中的问题,不是@JerryDodge给你的答案的替代品。问这样的问题,你需要解释与你的期望有什么不同的事情。

不要在BeforeDelete事件中尝试删除。在操作开始之前进行,例如如下所示(CDS1是我的数据集的名称)。

顺便说一句,如果您确实想要中断数据集操作,请调用Abort。

procedure TForm1.Button3Click(Sender: TObject);
var
  Res : Integer;
begin
  if CDS1.RecordCount < 1 then exit;
  if CDS1.RecordCount > 1 then begin
    Res := MessageDlg(Format('You are about to delete %d records.  Proceed?',
      [CDS1.RecordCount]),
      mtConfirmation,
      [mbYes, mbNo],
      0);
    if Res = mrYes then begin
      CDS1.First;
      while not CDS1.Eof do begin
        CDS1.Delete;
      end;
    end;
  end
  else begin
    CDS1.Delete;
  end;
end;

答案 2 :(得分:0)

有两种方法可以做到这一点;

  1. 方式;删除前获取记录计数;

    query.close;
    query.sql.text := ' Select Count(*) as recCount From Table Where tableId > 15 ';
    query.open;
    if messagedialog(query.fieldbyname('recCount').asstring + ' record will be deleted! Continue?', mtConfirmation, mbyesno, 0) = mrYes then
      Begin
        query.close;
        query.sql.text := ' Delete From Table Where tableId > 15 ';
        query.execsql;
      end;
    
  2. 方式;如果您使用的数据库支持

    ,请使用transections
    query.connection.BeginTrans;
    query.sql.text := ' Delete From Table Where tableId > 15 ';
    i := query.execsql;
    if messagedialog(inttostr(i) + ' record will be deleted! Continue?', mtConfirmation, mbyesno, 0) = mrYes then
      query.connection.CommitTrans
    else
      query.connection.RollbackTrans;
    
  3. 首先,请记住,如果用户在消息出现后等待很长时间,如果多个用户正在使用该数据库,则可能会更改总记录数。

    我在这台电脑上没有Delphi,因此可能存在语法错误。