2015-07-11 44 views
1

如何警告用戶(帶有確認對話框)他要執行的查詢會刪除多條記錄?查詢執行:警告用戶是否要刪除多個記錄

'DELETE FROM ... WHERE ...'可以包含一個或多個記錄,所以我想知道如何警告用戶他將刪除多個記錄。

+0

您將進程封裝在單個用戶操作中並將該操作包裝在提示中。這是非常平凡的編程習慣。我們不知道「多個記錄」究竟意味着什麼 - 有無數的方法可以識別這些信息。 –

+0

我所要求的是告訴用戶刪除的記錄將不止一個。 – user3181689

+1

你的問題很糟糕。你問如何警告用戶。但是你要問的是如何找到有多少條記錄被刪除。所以你可以在查詢中加入這個'SELECT @@ DELETED',然後從你的查詢中讀取這個值。當然,我們不知道您使用的是什麼SQL風格,它是如何被打包的等等。如果用戶不想刪除,請回滾。 –

回答

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; 
+0

上面的代碼不告訴用戶是否有一個或多個記錄。一個記錄 - 它的好。但是,如果它的倍數,那麼警告。 – user3181689

+0

@ user3181689好吧,你還沒有告訴我們足夠的信息來知道你真正期待什麼。什麼類型的數據庫?你使用什麼數據庫?什麼驅動?我們可以看到一些代碼來理解你想要做什麼嗎? –

+0

我想警告用戶該查詢即將刪除多個記錄。如果查詢可以首先對待我要刪除的記錄進行計數,但這是可選的,那將會很不錯...希望首先學習基本知識。 – user3181689

1

這是解決你的「這是爲什麼不工作:程序TDataModule.MYTABLEBeforeDelete(DataSe t: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; 
0

有兩種方法可以做到這一點;

  1. way;刪除前獲取記錄數;

    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. way;使用橫斷如果您所使用的數據庫支持

    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; 
    

對於第一種方式,請記住,如果用戶等待很長一段時間後會出現消息,如果數據庫被多個用戶使用的總記錄數可能會改變。

我沒有德爾福在這臺電腦上,所以可能會出現語法錯誤。