【问题标题】:absolute database batch move绝对数据库批量移动
【发布时间】:2012-06-05 23:15:06
【问题描述】:

我想使用批处理组件来归档表中的一些旧记录。我查看了 Ace components 网站上的示例,但不确定如何使用它。命令是:

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

对于我打算使用两个日期时间选择器的任务。所以查询会像参数一样:

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 命令合并?我希望所有检索到的记录都从我的源表移动到目标表。

【问题讨论】:

  • 为什么这个标签有这么多的 Delphi 版本?

标签: delphi


【解决方案1】:

Absolute Database 的 BatchMove 似乎是仿照旧的 BDE TBatchMove 建模的,它需要两个 TTable 组件; IIRC,它不适用于TQuery,但我可能记错了。 (BDE 已经弃用十多年了,我从 Delphi 1 开始就没有使用过。)

不过,您不需要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中的更多信息

我没有使用过 Absolute Database,但如果他们的 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;

【讨论】:

  • 对不起。这是一个空格字符。使用它比在其中放置空间更容易;字符串末尾的空格太容易漏掉,如果你把它漏掉,那就是语法错误。 #32 是空格,#9 是制表符,#13 是回车(CR),#10 是换行;它们是常用字符(您可能会发现另一个有用的字符是#34,它是一个双引号)。例如,#13#10 是 Windows 系统的行尾字符,它们位于 IDE 代码编辑器中每一行源代码的末尾。您可以查看任何 ASCII 图表; # 表示 character
猜你喜欢
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 2013-05-18
相关资源
最近更新 更多