【问题标题】:query execution : warn user if multiple records are to be deleted查询执行:如果要删除多条记录,则警告用户
【发布时间】:2015-07-11 05:14:38
【问题描述】:

您如何警告用户(通过确认对话框)他即将执行的查询将删除多个记录?

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

【问题讨论】:

  • 您将流程封装在单个用户操作中,并将该操作包装在提示中。这是极其微不足道的编程实践。我们不知道您所说的“多条记录”究竟是什么意思 - 有无数种方法可以识别此类信息。
  • 我的要求是告诉用户删除的记录将不止一条。
  • 您的问题措辞不当。你问如何警告用户。但是您要问的是如何找到删除了多少条记录。因此,您可以将 SELECT @@DELETED 添加到查询中,然后从您的查询中读取该值。当然我们不知道你使用什么 SQL 风格,它是如何包装的等等。如果用户不想删除,就回滚。
  • @David 这是一种可能性,因为这个问题有很多可能性。

标签: delphi


【解决方案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;

【讨论】:

  • 上面的代码没有告诉用户它是一个还是多个记录。一个记录 - 没关系。但如果它是多个,那么警告。
  • @user3181689 好吧,您没有告诉我们足够的信息来了解您的真正期望。什么类型的数据库?你用的是什么数据库?什么驱动?我们可以查看一些代码来了解您要做什么吗?
  • 我试图警告用户该查询将要删除多条记录。如果查询可以先让我计算一下即将被删除的记录,那就太好了,但这是可选的……想先学习基础知识。
  • @user3181689 您是否查看过您正在使用的任何库的文档?我们不知道你在用什么,我只是假设。你问的是非常基本的东西。
  • 顺便说一句,您不应该尝试在其 BeforeDelete 事件中从表中删除记录。这将导致 BeforeDelete 事件再次发生(一次又一次)。
【解决方案2】:

这是为了解决您的“为什么这不起作用:procedure 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;

【讨论】:

    【解决方案3】:

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

    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. 方式;如果您使用的数据库支持,请使用横断面

      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;
      

    对于第一种方法,请记住如果用户在消息出现后等待很长时间,如果数据库被多个用户使用,总记录数可能会改变。

    我的这台电脑上没有 Delphi,所以可能存在语法错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      • 2014-06-17
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多