使用 ATL 的快速 CSV 编写器






4.50/5 (3投票s)
2007年6月7日
3分钟阅读

43785

1352
使用 ATL 的快速 CSV 编写器
引言
在某些情况下,需要将数据库中的表数据导出为 CSV 文件格式。通常实现起来似乎很简单。但当需要高效率导出时,我们就必须考虑采用何种技术以及如何实现。本文向您展示了一种构建此类程序的方法。如您所知,ATL 的主要目标之一是提供一种构建小型、高效组件的良好方式。我将向您展示的 ATL 组件就是用 ATL 编写的。与用其他语言编写的相同程序相比,ATL CSV 写入器提供了更高的效率。
支持的特性
此 CSV 写入器支持 CSV 文件格式。在 ATL CSV 写入器中,
使用代码
为了使用 ATLCSV 组件,您需要先使用以下命令注册该组件:
> regsvr32 /c atlcsv.dll
我在下表中列出了接口方法和属性。
ATLCSV 方法
方法 | 描述 |
BlindFetchCSVData |
从一个或多个表中获取数据并写入 CSV 文件。文件名与表名相同 |
FetchCsvData |
将数据按 SQL 查询获取到指定的缓存中 |
WriteToCSV |
将缓存数据写入 CSV 文件。 |
GetConnectionStringFromCfg |
从配置文件获取数据库连接信息 |
FetchAndWriteCsv |
获取 SQL 指定的数据并写入 CSV 文件 |
ATLCSV 属性
属性 | 描述 |
ConnectionString |
数据库连接字符串 |
文件后缀。默认是 CSV | |
FieldsDelimiter |
字段之间的分隔符 |
RecordsDelimiter |
行之间的分隔符 |
标题 |
指定是否需要标题。默认是需要 |
NumOfTables |
要查询的表数量 |
TableName |
要查询的表名 |
在注册 CSV 写入器后,您可以在命令行运行演示程序
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 =
D:\>atlclient user=system/Helpdesk1@test table="vehicle|van" opt="2|1|10000"
编写客户端代码
由于 ATL CSV 写入器实现了双接口,因此可以轻松地在 C#.NET、VB.NET 等解释型语言中使用。如果您选择 Visual C++,上面的演示项目正是您所需要的。下面是一个 Visual C++ 的示例,为了简单测试,您可以选择创建一个简单的 Win32 控制台应用程序,然后将以下代码添加到适当的位置:
// Include header files
#include "..\ATLCSV\ATLCSV\ATLCSV.h"
#include "..\ATLCSV\ATLCSV\ATLCSV_i.c"
// Initialize COM library
::CoInitialize(NULL);
// Get Interface
IComCsvSrv* pIComCsv = NULL;
HRESULT hr = ::CoCreateInstance(CLSID_ComCsvSrv,NULL,CLSCTX_INPROC_SERVER,
IID_IComCsvSrv,(void**)&pIComCsv);
// Set Database connection
BSTR bstrString = ::SysAllocString(getWCHAR(string));
pIComCsv->put_ConnectionString(bstrString);
::SysFreeString(bstrString);
// Set Field Separator
bstrString = ::SysAllocString(getWCHAR(field));
pIComCsv->put_FieldsDelimiter(bstrString);
::SysFreeString(bstrString);
// Set tables you want to retrieve
pIComCsv->put_NumOfTables(i);
for(int j=0;j<i;j++)
{
bstrString = ::SysAllocString(_T("tabName[j]"));
pIComCsv->put_bstrTableName(j,bstrString);
::SysFreeString(bstrString);
}
// Fetch Data from database and write to CSV file
pIComCsv->BlindFetchCSVData(2,1,10000);
}
// Unload COM Library
::CoUninitialize();
下面是一个 C# 的示例。在这种编程语言中使用 ATL 组件似乎更容易。首先,在 Visual Studio.NET 中导入此 COM 组件,然后添加以下示例代码:
using ATLCSVLib;
namespace CSharpClient
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
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.OnConnectDbOk +=
new _IComCsvSrvEvents_OnConnectDbOkEventHandler(bb_OnConnectDbOk);
bb.OnDataFechFinished +=
new _IComCsvSrvEvents_OnDataFechFinishedEventHandler
(bb_OnDataFechFinished);
bb.OnWriteCSV +=
new _IComCsvSrvEvents_OnWriteCSVEventHandler(bb_OnWriteCSV);
bb.set_bstrTableName(0, "vehicle");
bb.set_bstrTableName(1, "van");
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!");
}
}
}
性能
为了保持高性能,除了使用 ATL 之外,该写入器还提供了一些优化参数,可以在处理包含大量记录的表时节省写入 CSV 文件的时间。
Bug
这绝非生产级别的代码。我已经测试了代码,包括我找到的所有示例。如果存在特定的规范/文档不起作用,请发布它,我会查看。当然,您也可以自己尝试修复!
历史
- 2007 年 6 月 8 日:首次发布