快速的CSV文件生成器
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://thomas.blog.51cto.com/177910/29358 | ||||||||||||||||||||||||||||
介绍
在某些应用程序中,往往需要将数据库表中的数据取出来存为CSV文件。看起来是很容易的一件事情,但是如果要做到灵活,而且要在取大数据量的表时保证足够的性能,却需要认真考虑。本CSV文件生成器的设计考虑满足以下指标: 1、支持多种不同的数据库,如Oracle,SQL Server等 2、程序尺寸要小 3、足够的性能 程序的设计
基本的思路是采用C++通过ATL作出一个COM组件,然后用解释性语言如C#来调用。数据库访问采用ADO来实现,从本人的经验来说,我是不太愿意使用ADO的,虽然它很通用各种数据库都可以访问,微软也很推崇,但是它对多线程应用支持的却很差,而且一堆繁琐的智能指针,能把人给扎死。但是考虑到其通用性,而且现在好像比较时髦,还是勉为其难的采用了ADO. CSV文件生成器说明
1. 支持不同数据库访问 2. 满足CSV文件格式的要求 3. 能支持指定多个表的CSV文件生成 4. 支持SQL语句的CSV文件生成 5. 可设置文件后缀、分隔符等 方法描述
属性描述
怎样实验CSV文件生成器
在提供的可执行文件包中包含了两个文件一个是ATLCSV.dll,一个是ATLV6Client.exe, 先用如下命令要注册一下组件 D:\> regsvr32 /c atlcsv.dll 然后敲一下atlv6client,看一下程序的使用说明, D:\>atlv6client Usage: atlv6client user=... table=... sql=... field=... row=... suffix=... (@) Copyright Thomas WANG 2007, all rights reserved. Parameters: user=username/password@tnsname.mandatory parameter table=table1|table2|...|tablen.mandatory parameter if not specify sql sql=SQL statement.mandatory parameter if not specify table opt=nMode|nStart|nDelta start position and Delta.optional.nMode can be 1,2or3. 1:default value 2:segmentation operations on a table 3:fetch to cache and write.if say 2, also speficy nStart,nDelta. field=seperator string between fields. default is "," row=seperator string between rows. default is "\n" suffix=file suffix. default is csv Notes: No space adjacent to = 这个程序是一个VC++ 6.0写的一个控制台程序,在正式运行前保证你已经有了一个数据源。例如我机器上有一个ODBC数据源TEST,我想取数据库中TAB这个表,可用如下命令:
D:\> atlv6client user=system/Helpdesk1@test table="tab" Parsing DB info Connect to DB ... Write CSV file spent: 0:2 Fetch Data and Write ... Write CSV file spent: 0:1 Finished 在目录下,会生成一个以表名命名的CSV文件。以上这种指定表主要用于在有很多表需要导出的场合或需要许多控制的时候使用。也可以用如下命令完成以上的功能 D:\>atlv6client user=system/Helpdesk1@test sql="select * from tab" Parsing DB info Connect to DB ... Write CSV file spent: 0:0 Fetch DB ... Write select * from tab to file Write CSV file spent: 0:0 Finished 当你在导出一个大表时,如这个表有一百万条记录,你可以用以下命令:
D:\> atlv6client user=system/Helpdesk1@test table="vehicle" opt="2|1|50000" Parsing DB info Connect to DB ... Write CSV file spent: 0:1 Fetch Data and Write ... 让它以5万条步长处理数据。这样机器的CPU内存占用也不会那么多。 如何编写C#客户端
以上提供的客户端是C++写的,如果你想在C#里调用那就太方便不过了,首先,在增加引用菜单里加入COM组件
![]() 然后增加如下代码即可
private void Form1_Load(object sender, EventArgs e)
{ ATLCSVLib.ComCsvSrvClass bb = new ComCsvSrvClass(); bb.ConnectionString = "dsn=test;user=system;pwd=Helpdesk1;"; bb.NumOfTables = 2; bb.set_bstrTableName(0, "vehicle");
bb.set_bstrTableName(1, "van"); bb.OnConnectDbOk += new _IComCsvSrvEvents_OnConnectDbOkEventHandler(bb_OnConnectDbOk); bb.OnDataFechFinished += new _IComCsvSrvEvents_OnDataFechFinishedEventHandler(bb_OnDataFechFinished); bb.OnWriteCSV += new _IComCsvSrvEvents_OnWriteCSVEventHandler(bb_OnWriteCSV); bb.BlindFetchCSVData(); } void bb_OnWriteCSV(string bstrFileInfo)
{ MessageBox.Show("Write!"); } void bb_OnDataFechFinished(string theString)
{ MessageBox.Show("Fetch!"); } void bb_OnConnectDbOk(string strDBInfo)
{ MessageBox.Show("Connection!"); } 考虑到目前CSV组件我仍在改进中,所以只传了可行文件,和客户端程序,如果你要组件源码,发邮件到thomas.x.wang@gmail.com. 本文出自 “静侯佳音” 博客,请务必保留此出处http://thomas.blog.51cto.com/177910/29358 本文出自 51CTO.COM技术博客 |



可执行文件
callme
博客统计信息
热门文章
最新评论
友情链接