DataImporter,一个用于轻松从文件读取数据的组件
用于从文件或数据库连接加载数据的组件,异步获取数据并在完成后触发事件。所有读取的数据都加载到 DataTable 中

目录
引言
首先,请允许我自我介绍一下。我是一名墨西哥程序员(所以如果我的英语不够流利,我提前道歉),我喜欢使用“Visual Studio”或“Sharp Develop”进行“C#”编程。
自从我发现这个网站(“CodeProject”)以来,已经有两年多了,它在我的几个项目中都非常有帮助,所以我想为这个社区贡献一些东西。
背景
几周前,我为一个已投入生产的系统接到了一个新的需求。这个新需求涉及到读取一个 XLS 文件。在以前的项目中,我已经实现过读取 XLS 文件的模块。所以我找到了我的代码,复制并修改它以适应这个新需求。但我意识到这并不像预期的那么容易(我的意思是很容易,但可以更简单),所以它成为了一个新组件的绝佳候选,而且因为它有点简单,所以也成为了我在“CodeProject”上发表第一篇文章的绝佳候选。
考虑到这一点,我决定创建一个组件来从文件读取信息,并将信息保存在“DataTable
”中以备后续使用,但不想将组件限制为只读取一种文件类型。该组件应该是可配置的,以接受读取某些文件类型。
最初的文件类型是
- XLS 文件
- 纯文本文件
- 固定长度字段
- 字符分隔字段
- 字符分隔符:制表符(方便起见)
- 字符分隔符:任意
完成此控件后,并满足上述要求,我认为添加另一项功能会很好,即,我不仅可以从文件获取信息,还可以从数据库获取信息(我将在后面的部分解释原因)。所以我又增加了一个选项。
数据库
然后,在最后一次改进之后,我认为还有一个非常好的主意是,集成一个进度窗口到组件中,并在不同的线程中进行整个读取过程。
Using the Code
此控件可以像其他控件一样使用,也就是说,如果您将引用添加到工具箱,您应该会看到该组件已准备好拖放到您的窗口上。一旦进入您的窗口,您就可以使用“PropertyGrid
” Visual Studio 来配置它。
组件属性
-
public bool FileHeader
布尔属性,定义要读取的文件是否包含标题行。
-
public bool FileHeader
布尔属性,定义要读取的文件是否包含标题行。
-
public string FileName
源文件的路径和名称。
-
public char FillerChar
用于填充字段的
Char
,当数据小于该字段的固定长度时使用。 -
public DbConnection LoadConnection
只读属性,用于从数据库检索数据的连接组件。
-
public bool PercentAdvance
定义进度窗口是否只显示百分比。
-
public string Query
要执行的 SQL 查询,用于从数据库检索数据。
-
public string ReadingString
在读取文件时,进度窗口中显示的文本。
-
public string ReadingTitleString
在读取文件时,进度窗口中显示的标题文本。常量“
@FileName
”始终被替换为正在读取的文件名。 -
public bool Running
只读布尔属性,如果组件正在工作(即,正在读取文件/加载数据),则为
true
。 -
public bool RunningAndVisible
只读布尔属性,如果组件正在工作(即,正在读取文件/加载数据)且进度窗口可见,则为
true
。 -
public Delimiter Separator
Enum
属性,定义文件将具有的分隔符类型。 -
public char SeparatorChar
文件中用作分隔符的字符。
-
public ImportType Source
Enum
属性,定义将从哪个源检索数据。 -
public int XLS_PageNumber
定义要读取的页码,如果是 .xls 文件(零基索引)。
组件事件
该组件有 3 个事件,它们是
-
void StartLoad(DateTime StartTime, int Rows)
在读取文件或数据库之前触发。
-
void EndLoad(DateTime StartTime, int Rows)
在读取文件或数据库之后触发。
-
void PercentChange(Currow int, int TtRow)
在读取当前记录改变读取的总百分比时触发(整数)。
注意: 如果是从 XLS 文件读取,组件不知道行数,则此事件永远不会触发,就像从数据库读取也不会触发一样。
关注点
XLS 文件的读取是通过 Excel 自动化完成的,因此读取速度不是很好。
连接到数据库是通过 System.Data.Common.DbConnection
完成的,有两种方法可以在控件中设置它
-
SetLoadConnection(System.Data.Common.DbConnection Conx)
“手动”设置连接,即,将连接传递给组件。
-
SetLoadConnection()
提示用户使用 Microsoft 提供的免费连接对话框进行设置(http://code.msdn.microsoft.com/Connection)。
将数据库读取到 DataTable
的选项乍一看似乎不那么吸引人,但我包含了它,因为我正在考虑开发另一个组件作为此组件的补充,一个 DataExporter
,即,将信息从 DataTable
导出到文件或上传到数据库。
结论
这篇文章可能有点短,因为我英语不好,而且这是我第一次发帖,但我希望这里展示的组件有用,并且示例足够明确,可以澄清您的所有疑问。
历史
- 2010 年 10 月 29 日:首次发布