用c++Builder如何将txt文件中的数据(只有一列20万条记录)一次导入数据库 中

爱吃饼干的熊猫 2008-09-04 01:25:10
用c++Builder如何将txt文件中的数据(只有一列20万条记录)一次导入数据库 中 详细点。。。。谢谢
...全文
899 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jim@luckeeinc.com 2008-10-31
  • 打赏
  • 举报
回复
更正 以上方法 在Sql Server中似乎不能跑
在mySql裏是可以這樣寫的 把多句合併成一句
insert into table(field) values(value1)
insert into table(field) values(value2)
insert into table(field) values(value3)
insert into table(field) values(value4)
insert into table(field) values(value5)

合併成
insert into table(field) values(value1),(value2),(value3),(value4),(value5)
Jim@luckeeinc.com 2008-10-31
  • 打赏
  • 举报
回复
插入數據庫有個能提高效率的寫法
insert into table(field1,field2) values(value1, value2) values(value3,value4) values(value5,value6)....
現在程序裏把所有的value拼在一起 然後一起insert
這中間省去了很多時間 試一下看看
  • 打赏
  • 举报
回复
谢谢该结贴了
路过路人乙 2008-09-08
  • 打赏
  • 举报
回复
呃...僵哥说的很详细恶劣
勉励前行 2008-09-08
  • 打赏
  • 举报
回复
To unsigned :
在使用事務的情況下,我的實測結果是DBX比ADO快不少。
沒測試過不用事務的情況。(DBX4 + MSSQL)
(測試時,第一次遞交數據因為服務器要擴張表空間,這時間太多因素影響,所以要忽略。每次測試前清空表再插入數據。)
以下是偽代碼:
StartTransaction
delete table
for(int i = 0 ; i < 10*1000*1000 ++i)
Execute(SQL,...);
Commit

同樣過程,DBX優於ADO即:
SQLConnection->ExecuteDirect(SQL);
優於
ADOConnection->Execute(SQL,
cmdTex,TExecuteOptions() << eoExecuteNoRecords); //可能是我選擇的參數不對。沒測試其他參數。

不清楚DBX4的MSSQL驅動是什麼方式與MSSQL交互的?
僵哥 2008-09-08
  • 打赏
  • 举报
回复
晕,又打错...
僵哥 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 whomin 的回复:]
如果是mssql,用bulk insert肯定是最快的,应该不会不行的啊,你试试建个文本文档到d盘下的0.txt,里面输入几行字符,然后执行:
BULK INSERT test from 'e:\0.txt' WITH (FIRSTROW=1,ROWTERMINATOR = '\n');
(test表只有一列varchar类型)

你那个提示找不到txt文件应该是路径没写对
[/Quote]
1.buld insert如果没有记错的话,文件需要在数据库的本地磁盘;
2.输出到文件也是需要消耗时间的.
whomin 2008-09-08
  • 打赏
  • 举报
回复
如果是mssql,用bulk insert肯定是最快的,应该不会不行的啊,你试试建个文本文档到d盘下的0.txt,里面输入几行字符,然后执行:
BULK INSERT test from 'e:\0.txt' WITH (FIRSTROW=1,ROWTERMINATOR = '\n');
(test表只有一列varchar类型)

你那个提示找不到txt文件应该是路径没写对
xjq2003 2008-09-08
  • 打赏
  • 举报
回复
见识
lizhoulun 2008-09-08
  • 打赏
  • 举报
回复
不知道文本数据需要加工不?是不是规则的。
可以考虑如下方式:
给DTS包传递参数,支持的参数包括(环境变量、注册表值和参数字符)判断后,导入数据。用VBScript、JScript 编程,完成数据的判断和转换任务。
速度比较快。



whomin 2008-09-08
  • 打赏
  • 举报
回复
如果是远程共享的文件夹,用bulk insert并无问题,我已进行了测试,是可以的:
BULK INSERT test from '\\192.168.0.1\Share\0.txt' WITH (FIRSTROW=1,ROWTERMINATOR = '\n');
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 unsigned 的回复:]
引用 21 楼 whomin 的回复:
如果是mssql,用bulk insert肯定是最快的,应该不会不行的啊,你试试建个文本文档到d盘下的0.txt,里面输入几行字符,然后执行:
BULK INSERT test from 'e:\0.txt' WITH (FIRSTROW=1,ROWTERMINATOR = '\n');
(test表只有一列varchar类型)

你那个提示找不到txt文件应该是路径没写对

1.buld insert如果没有记错的话,文件需要在数据库的本地磁盘;
2.输出到文件也是需要消耗时间的.
[/Quote]

对 用 buld insert 只有在本地磁盘 上可以操作

关键是 要解决 远程操作的问题 用的是 ms sql
僵哥 2008-09-07
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 dxkh 的回复:]
MySQL有专门的读取语句,可以把文本文件中的数据读入数据库,比用insert快太多了
[/Quote]
MSSQL也有类似的,关键看源数据的格式等等.为什么你会觉得比使用insert快,只是因为很多细节由数据库系统内部进行控制和优化过了.类似的数据库系统,内部仍然还是一条条insert.
僵哥 2008-09-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 changjuanfang 的回复:]
僵哥的测试二 是在理想状态下的测试(只有单纯的插入数据) 现实中数据的获取也要花费相当的时间 这样 总时间就会很长 如果获取数据的方式不对 会耗费大量的cpu时间片 这样会大大影响数据的插入
[/Quote]
需要获取数据,那是获取数据所消耗的时间,我所说的只是让数据库操作的时间尽可能少.

其实PPower说的使用DBX的TSQLConnection会比ADO操作快,这一点个人并不赞同.我没有做过实际的测试,所以无法下最终的结论.但是从理论上来讲,DBX也是需要通过ADO操作的,所以它的快只在于连接池的使用.对于单线程的程序来讲,可能在表面上看是会有所提升,但是这个并不能说明实质性的问题.

[Quote=引用 17 楼 changjuanfang 的回复:]
用事务 估计慢
[/Quote]
对于这种操作,个人建议是使用显示的事务,即强制每一批提交一个事务.对于支持事务的DBMS,并不会因为你没有显示使用事务,它就不会使用事务.只是这个事务是由DBMS自己去控制.
  • 打赏
  • 举报
回复
用事务 估计慢
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 liu1jian2 的回复:]
先將Txt文件轉爲Excel格式文件,然後將Excel導入數據庫。
[/Quote]

具体点
  • 打赏
  • 举报
回复
先谢了 我先试试!! 
勉励前行 2008-09-06
  • 打赏
  • 举报
回复
"测试二"使用ADOComand遞交數據, 比使用DBX的TSQLConnection慢.
String SQL ;
TSQLConnection *SQLConn;
//---------------
DWORD StartAt=GetTickCount();
SQLConn->StartTransaction(TransactionDesc);
try{
for(int i = 0 ; i< 10*1000*1000; ++i) { //共提交10M次
SQL.Clear();
for(int i = 0 ; i < 10 ; ++i) //每次插入 10 行
SQL += "insert into TableA(Field0) Values('test data')\n";
SQLConnection->ExecuteDirect(SQL);
}
SQLConn->Commit(TransactionDesc);
}
catch(Exception &E){
SQLConn->Rollback(TransactionDesc);
throw Exception(E.Message);
}
catch(...){
SQLConn->Rollback(TransactionDesc);
throw Exception(String("unknow error"));
}
DWORD EndTime=GetTickCount();
ShowMessage((int)(EndTime-StartTime));

改用TSQLConnection ,使用 並將 iCacheSize= 10 ~ 100 ; 速度估計至少提升 10% .
勉励前行 2008-09-06
  • 打赏
  • 举报
回复
BULK Insert
TXT 文件要上傳致到 SQL Server 服務器上。不要放在客戶端上。

僵哥写的 测试二 速度應該還是很快的。
BULK Insert 方案,因為要生成TXT文件並將文件上傳至服務器中,完成速度與"测试二"相比要看網絡情況與記錄數多少,一般情況下BULK Insert方案總體快些。"测试二"則為標准SQL語法,比BULK Insert 或(Insert into + OpenRowSet方式)通用。

先將Txt文件轉爲Excel格式文件,然後將Excel導入數據庫。這樣不如直接導入TXT文本。

liu1jian2 2008-09-06
  • 打赏
  • 举报
回复
先將Txt文件轉爲Excel格式文件,然後將Excel導入數據庫。
加载更多回复(12)

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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