2012-06-05 33 views
3

我想使用批量組件來歸檔表中的一些舊記錄。我查看了Ace組件網站上的示例,但我不確定如何使用它。命令是:絕對數據庫批量移動

DestinationTable.BatchMove(SourceTable,TABSBatchMoveType(bmtAppend)); 

對於我打算使用兩個datetimepickers的任務。所以一個查詢會像參數一樣:

SELECT * from MYTABLE where DATE BETWEEN :a1 and :a2 
ABSTQuery1.Parameters.ParamByName ('a1').AsDate := DateTimePicker1.Date; 
ABSTQuery1.Parameters.ParamByName ('a2').AsDate := DateTimePicker2.Date; 
ABSQuery.ExecSql; 

如何將查詢與batchmove命令結合?我希望所有檢索到的記錄都從我的源表移動到目標表。

+1

爲什麼這個標籤有這麼多的Delphi版本? –

回答

3

絕對數據庫的BatchMove似乎仿照舊的BDE TBatchMove,其中需要兩個TTable組件; IIRC,它不適用於TQuery,但我可能記得錯誤。 (這個BDE已經被棄用了十多年了,自從Delphi1以後我就沒有使用它了。)

不過你不需要BatchMove。您可以使用單一的查詢做這一切(略去了異常處理):

// Copy rows into destination 
ABSTQuery1.SQL.Text := 'INSERT INTO DestTable'#32 + 
    '(SELECT * from MYTABLE where DATE BETWEEN :a1 and :a2)'; 
ABSTQuery1.Parameters.ParamByName ('a1').AsDate := DateTimePicker1.Date; 
ABSTQuery1.Parameters.ParamByName ('a2').AsDate := DateTimePicker2.Date; 
ABSTQuery1.ExecSql; 
ABSTQuery1.Close; 

// Remove them from source (you said "move", after all) 
ABSTQuery1.SQL.Text := 'DELETE FROM MyTable'#32 + 
    `WHERE Date BETWEEN :a1 and :a2'; 
ABSTQuery1.Parameters.ParamByName ('a1').AsDate := DateTimePicker1.Date; 
ABSTQuery1.Parameters.ParamByName ('a2').AsDate := DateTimePicker2.Date; 
ABSTQuery1.ExecSql; 
ABSTQuery1.Close; 

替換DestTable在第一個SQL語句的目標表的名稱。

on-line manual

我沒有用絕對的數據庫,但如果他們的SQL支持包括腳本(我會離開,研究由你 - 文檔上面的鏈接)的絕對數據庫更多信息和多條語句,你可以一次完成:

// Note addition of `;` at end of each SQL statement 
// and change in param names for second statement. 
// Some DBs will allow you to just use one pair, and 
// set the value for each once. Some require setting 
// each twice, and some require unique param names. 
// Check the documentation for Absolute DB. 
// 
ABSTQuery1.SQL.Text := 'INSERT INTO DestTable'#32 + 
    '(SELECT * from MYTABLE where DATE BETWEEN :a1 and :a2);' 
    'DELETE FROM MyTable WHERE Date BETWEEN :d1 and :d2;'; 
ABSTQuery1.Parameters.ParamByName ('a1').AsDate := DateTimePicker1.Date; 
ABSTQuery1.Parameters.ParamByName ('a2').AsDate := DateTimePicker2.Date; 

// New param names for second pass 
ABSTQuery1.Parameters.ParamByName ('d1').AsDate := DateTimePicker1.Date; 
ABSTQuery1.Parameters.ParamByName ('d2').AsDate := DateTimePicker2.Date; 
ABSTQuery1.ExecSQL; 
ABSTQuery1.Close; 
+0

查詢中#32是什麼? – user763539

+0

對不起。這是一個空間角色。使用它比放置空間更容易;在字符串末尾太空間太容易錯過了,如果你把它放在外面,這是一個語法錯誤。 #32是空格,#9是標籤,#13是回車(CR),#10是換行,他們是常用的字符(另一個你可能會覺得有用的是#34,這是一個雙引號)。例如'#13#10'是Windows系統的行尾字符,它們位於IDE代碼編輯器中每行代碼的末尾。你可以看任何ASCII圖表; #表示'字符'。 –