在 DTS开发记录(2)-- 数据管道及插件 一文中,我们介绍了数据管道,IDataPipeFactory的CreateDataPipe方法需要一个IConnection参数,这个参数就表示一个连接。
IConnection的定义如下:
/// IConnection 用于表示到数据源或数据目标的连接
/// </summary>
public interface IConnection
{
ConnectionType ConnectionType { get ;}
string ConnectionText { get ;}
string PKeyName { get ; set ; }
}
public enum ConnectionType
{
DataBase ,File
}
无论该连接是指向数据库的一个表还是某个结构化的文件,都需要设定一个主键名称,设定该主键名称的作用在于两个方面:
(1)用于分页(有的数据库可能不需要知道主键就可以分页,比如Oracle)
(2)用于增量导出。
到目前为止,连接分为两种类型--数据库类型和文件类型。对于数据库类型的连接,可以用连接字符串来标志;对于文件类型的连接,可以使用文件路径来标志。
我们知道,数据库分为不同的类型,这是由DataBaseType标志的;那么,文件也有不同的类型,比如.Xml、.Txt等,怎么区分它们了?是的,使用文件的扩展名,因为同一类型的文件的扩展名是相同的。所以,我们看到FileConnection有个ExtendName属性。
ConnectionText属性,就像ToString()方法一样,这样当我们需要在UI上显示IConnection时,可以取用其ConnectionText属性的值。对于文件类型的连接,它将返回文件路径;对于数据库类型的连接,它将返回连接字符串及目标数据表的名字。
下面是FileConnection和DatabaseConnection的类图:
讲到这里,我可以大致说一下IDataPipeFactory创建数据管道的过程。首先,从IConnection中获取ConnectionType,如果是文件类型,则将之向下转换到FileConnection,然后得到ExtendName属性,最后在数据管道插件列表中寻找支持该ExtendName的数据管道插件。对于数据库类型的IConnection,过程也是相似,只不过,它是依据DataBaseType来寻找对应的数据管道插件。
如果和数据管道插件对照起来看,就更清楚了:
连接对(ConnectionPair),一个连接对包含了一个数据源和一个数据目标的连接信息。将连接对独立出来的好处是,当配置好一个连接对后,可以在不同的地方复用它,比如在编辑映射的时候、在数据验证的时候、在数据传送的时候等。
使用ConnectionPair可以使我们的程序结构非常的清晰,因为它抽象了底层的连接类型。但是,在通过界面来配置ConnectionPair时,就不那么容易了,你会迫不得已的遇到很多向下转换,我正在思考一种解决方案来避免这种向下转换。你有好的想法吗?
转到:DTS开发记录(序)