65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 ATL 的快速 CSV 编写器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (3投票s)

2007年6月7日

3分钟阅读

viewsIcon

43785

downloadIcon

1352

使用 ATL 的快速 CSV 编写器

引言

在某些情况下,需要将数据库中的表数据导出为 CSV 文件格式。通常实现起来似乎很简单。但当需要高效率导出时,我们就必须考虑采用何种技术以及如何实现。本文向您展示了一种构建此类程序的方法。如您所知,ATL 的主要目标之一是提供一种构建小型、高效组件的良好方式。我将向您展示的 ATL 组件就是用 ATL 编写的。与用其他语言编写的相同程序相比,ATL CSV 写入器提供了更高的效率。

支持的特性

此 CSV 写入器支持 CSV 文件格式。在 ATL CSV 写入器中,ADO被用来访问数据库,使您可以轻松访问不同的数据库。该写入器还实现了一个简单的事件接收器,您可以在客户端程序中接收与数据操作相关的事件通知。此外,为了考虑性能,CSV 写入器还提供了许多优化参数,您可以在客户端程序中指定这些参数来提高性能。上面的演示项目向您展示了如何使用这些参数。

使用代码

为了使用 ATLCSV 组件,您需要先使用以下命令注册该组件:

> regsvr32 /c atlcsv.dll

我在下表中列出了接口方法和属性。

ATLCSV 方法

方法 描述
BlindFetchCSVData 从一个或多个表中获取数据并写入 CSV 文件。文件名与表名相同
FetchCsvData 将数据按 SQL 查询获取到指定的缓存中
WriteToCSV 将缓存数据写入 CSV 文件。
GetConnectionStringFromCfg 从配置文件获取数据库连接信息
FetchAndWriteCsv 获取 SQL 指定的数据并写入 CSV 文件

ATLCSV 属性

属性 描述
ConnectionString 数据库连接字符串

FileSuffix

文件后缀。默认是 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 日:首次发布
© . All rights reserved.