BatchMove1导记录?欢迎大家讨论!

Chimae 2002-04-24 09:33:47
编程的时候经常会碰到从表1中导记录到表2,表1和表2字段列表是一样的,可能某些字段的类型发生了变化,经高手指点,用BatchMove1到记录非常方便,不敢独享!希望大家一起讨论、进步!
BatchMove1->Destination(目标表Table);
BatchMove1->Source(数据源Query or Table);
BatchMove1->Mode(导记录模式:Delete、Update、Copy等等)
例子如下:
TStringList *theRecord = new TStringList();
Session->GetTableNames(ExtractFilePath(Application->ExeName),"*.db",false,false,theRecord);
for(int i=0; i<theRecord->Count; i++){
Query2->SQL->Clear();
Query2->SQL->Add("Select * from " + theRecord->Strings[i]);
Table1->TableName = theRecord->Strings[i];
BatchMove1->Execute();
}
delete theRecord;
Session、GetTableNames在BCB的帮助中已经注明:
Session, that is automatically created for all database applications. To assign a database component to a different session in a multi-threaded application;
GetTableNames(const AnsiString DatabaseName, const AnsiString Pattern, bool Extensions, bool SystemTables, Classes::TStrings* List);
...全文
99 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dragonki 2002-04-26
  • 打赏
  • 举报
回复
同意 wt_sanlian(雷电) 和benwg(浪子) 的看法,用BatchMove真的太浪了,如果不是在本机的话,500条记录就可能出错了。
呵呵
wt_sanlian 2002-04-25
  • 打赏
  • 举报
回复
可能用两个Query 组件

Query1 -> SQL -> Add("SELECT * FROM 表1")
char SQL[1024];
while(Query1 -> Eof == false)
{
...
形成Insert字符串,放到SQL 中
...
Query2 -> SQL -> Add(SQL);
Query1 -> Next();
}
try
{
Query2 -> ExecSQL();
}
catch(...)
{
}

具体实现时可将Quer2分批提交,即每100 条记录提交一次
虽然麻烦了点,但程序将完全在控制之中!
「已注销」 2002-04-25
  • 打赏
  • 举报
回复
对wt_sanlian(雷电) 回答的一点补充:
你可以将形成的sql语句保存在文件中,在开始加入建立表单的sql语句,各条语句用分隔符分开,用的时候通过该文件还原,这就是一个完整的数据库备份还原过程,注意blob和字符串字段,保存前需要将特殊字符进行转换,主要有:单引号,双引号,回车,换行,以及0、\、032。
Chimae 2002-04-25
  • 打赏
  • 举报
回复
to:lovebcb(京华)
你好!感谢你的参与!
我用的是BDE连接,所以目标表在Table1中的DataBasename中设定了!至于你说的问题二,因为离子所用的是Paradox数据库,“ExtractFilePath(Application->ExeName)”制定路径,"*.db"制定后缀名,所以这样做是完全可以的Table1->TableName = theRecord->Strings[i];问题一有待于求证?还有就是大家所说的数据量大的操作问题,我再做个例子看看!非常感谢大家的参与!
lovebcb 2002-04-24
  • 打赏
  • 举报
回复
to Chimae (齐藤)
我有几个问题
1、TBatchmove有两个特性 AbortOnKeyViol和AbortOnProblem

AbortOnKeyViol设为true,则只要遇到一个违反主索引定义的记录,就停止操作。
什么是“违反主索引定义的记录”?是不是与目标表中的某个记录的主索引值相同?

AbortOnProblem设为true,则只要遇到一个数据类型转换有问题的记录,就停止操作。
什么是“数据类型转换有问题”?能举例说明吗?

这两个和ChangeTableName特性都是可选步骤,就是说可以不设置,如果不设,是不是有不良后果?

2、你的例子中有
Table1->TableName = theRecord->Strings[i];
可你并没有对theRecord->Strings[i];付值?WHY?

3、目标表是否要在设计期先建立好,还是可以在运行期建立?
目标表是否要建立别名?


to wt_sanlian(雷电) benwg(浪子)

你们有什么更好的解决办法,整个表的备份还可以用copy,但如果将表中的一部分拿出来放到另一个表中,除了batchmove外还可以怎样?
「已注销」 2002-04-24
  • 打赏
  • 举报
回复
你的高手太面了,他有没有告诉过你,用这种方式有时会丢失数据,尤其在数据量很大时,让你找都没处找去。
superaf 2002-04-24
  • 打赏
  • 举报
回复
收藏~~~先

wt_sanlian 2002-04-24
  • 打赏
  • 举报
回复
不是很好,当数据量增多时,BatchMove会失败.
本人以前也用这种方法,后来发生莫名其妙的错误,便不再用了,
lovebcb 2002-04-24
  • 打赏
  • 举报
回复
学习!
Chimae 2002-04-24
  • 打赏
  • 举报
回复
学习心得,交流!
kingsnation 2002-04-24
  • 打赏
  • 举报
回复
你要干什么

13,874

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧