介绍
在某些应用程序中,往往需要将数据库表中的数据取出来存为CSV文件。看起来是很容易的一件事情,但是如果要做到灵活,而且要在取大数据量的表时保证足够的性能,却需要认真考虑。本CSV文件生成器的设计考虑满足以下指标:
1、支持多种不同的数据库,如Oracle,SQL Server等
2、程序尺寸要小
3、足够的性能
在某些应用程序中,往往需要将数据库表中的数据取出来存为CSV文件。看起来是很容易的一件事情,但是如果要做到灵活,而且要在取大数据量的表时保证足够的性能,却需要认真考虑。本CSV文件生成器的设计考虑满足以下指标:
1、支持多种不同的数据库,如Oracle,SQL Server等
2、程序尺寸要小
3、足够的性能
程序的设计
基本的思路是采用C++通过ATL作出一个COM组件,然后用解释性语言如C#来调用。数据库访问采用ADO来实现,从本人的经验来说,我是不太愿意使用ADO的,虽然它很通用各种数据库都可以访问,微软也很推崇,但是它对多线程应用支持的却很差,而且一堆繁琐的智能指针,能把人给扎死。但是考虑到其通用性,而且现在好像比较时髦,还是勉为其难的采用了ADO.
基本的思路是采用C++通过ATL作出一个COM组件,然后用解释性语言如C#来调用。数据库访问采用ADO来实现,从本人的经验来说,我是不太愿意使用ADO的,虽然它很通用各种数据库都可以访问,微软也很推崇,但是它对多线程应用支持的却很差,而且一堆繁琐的智能指针,能把人给扎死。但是考虑到其通用性,而且现在好像比较时髦,还是勉为其难的采用了ADO.
CSV文件生成器说明
1. 支持不同数据库访问
2. 满足CSV文件格式的要求
3. 能支持指定多个表的CSV文件生成
4. 支持SQL语句的CSV文件生成
5. 可设置文件后缀、分隔符等
方法描述
1. 支持不同数据库访问
2. 满足CSV文件格式的要求
3. 能支持指定多个表的CSV文件生成
4. 支持SQL语句的CSV文件生成
5. 可设置文件后缀、分隔符等
方法描述
Methods
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
|
Description
|
BlindFetchCSVData
|
Fetch data from one or multiple tables and writes to CSV files. File name has same name as table name
|
FetchCsvData
|
Fetch data into cache specified by a SQL
|
WriteToCSV
|
Write Cache Data into a CSV file.
|
GetConnectionStringFromCfg
|
Get DB connection info from a profile file
|
FetchAndWriteCsv
|
Fetch data specified by a SQL and write to CSV file
|
属性描述
Properties
|
Description
|
ConnectionString
|
DB connection string.
|
File suffix.default is csv.
| |
Delimiter between fields.
| |
Delimiter between rows.
| |
Header
|
Specify header is required or not. default is required.
|
NumOfTables
|
Number of tables to be queried
|
TableName
|
Table name to be queried
|
怎样实验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 =
在提供的可执行文件包中包含了两个文件一个是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="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内存占用也不会那么多。
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;
{
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();
}
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!");
}
{
MessageBox.Show("Write!");
}
void bb_OnDataFechFinished(string theString)
{
MessageBox.Show("Fetch!");
}
{
MessageBox.Show("Fetch!");
}
void bb_OnConnectDbOk(string strDBInfo)
{
MessageBox.Show("Connection!");
}
{
MessageBox.Show("Connection!");
}
考虑到目前CSV组件我仍在改进中,所以只传了可行文件,和客户端程序,如果你要组件源码,发邮件到[email]thomas.x.wang@gmail.com[/email].
转载于:https://blog.51cto.com/thomas/29358