使用ADO.NET 建立适应多种数据库的数据访问层接口

抽象的.NET Framework数据提供最终规则规定的原因,以及如何你应该抽象的。NET Framework数据提供者使用在你的DAL内部。正如我所提到的的,ADO.NET编程模型公开截然不同。NET Framework数据提供包括使用SqlClient,OLEDB和其他MSDN Online网站上上的。虽然在提高性能和供应商的能力这种设计的结果公开的数据源的特定功能(如SqlCommand对象的ExecuteXmlReader方法),它迫使你决定哪些供应商代码对。换句话说,开发人员通常选择使用SqlClient或OleDb,然后写入直接对在各自的命名空间的类的代码。

如果你想改变的。NET Framework数据提供程序,您需要重新编写数据访问方法。为了避免这种情况,你可以使用一个被称为抽象工厂设计模式。使用此模式,您可以构建一个简单的类,它暴露的方法来创建主。NET Framework数据提供者对象(命令,连接,数据适配器,和参数)基础上确定的.NET Framework数据提供程序传递到构造函数的信息。在图7中的代码显示了一个简单的C#类版本。

为了使用这个类,在您的数据访问类的代码需要进行编程。NET Framework数据提供程序实现的各种接口,包括IDbCommand的,IDbConnection,IDataAdapter,并IDataParameter。
例如,为了填补一个带参数的存储过程的结果数据集,你可以使用下面的代码里面的数据访问类的方法:

Dim _pf  As New ProviderFactory(ProviderType.SqlClient)
Dim cn As IDbConnection = _pf.CreateConnection(_connect)
Dim da As IDataAdapter = _pf.CreateDataAdapter("usp_GetBook", cn)

Dim db As IDbDataAdapter = CType(da, IDbDataAdapter)
db.SelectCommand.CommandType = CommandType.StoredProcedure
db.SelectCommand.Parameters.Add(_pf.CreateParameter("@productId", _
    DbType.Int32, id))

Dim ds As New DataSet("Books")
da.Fill(ds)



通常情况下,你会声明在类级别providerfactory变量的数据访问类的构造函数实例化。此外,它的构造函数将填充从一个配置文件,而不是硬编码读取的供应商,如下所示。你可以想像,providerfactory将是一个伟大的除了你的DAL基类,然后可以在大会和分发给其他开发人员。

你可以选择采取了一步,封装共同ado.net代码,开发人员编写一遍又一遍。事实上,微软已经发布执行此功能为SQL Server数据访问应用程序块。

public enum ProviderType :int {SqlClient = 0, OLEDB = 1}

public class ProviderFactory {

    public ProviderFactory(ProviderType provider) {
        _pType = provider;
        _initClass();
    }

    public ProviderFactory() {
        _initClass();
    }
        
    private ProviderType _pType = ProviderType.SqlClient;
    private bool _pTypeSet = false;
    private Type[] _conType, _comType, _parmType, _daType;


    private void _initClass() {
    _conType = new Type[2];
    _comType = new Type[2];
    _parmType = new Type[2];
    _daType = new Type[2];

       // Initialize the types for the providers
       _conType[(int)ProviderType.SqlClient] = typeof(SqlConnection);
       _conType[(int)ProviderType.OLEDB] = typeof(OleDbConnection);
       _comType[(int)ProviderType.SqlClient] = typeof(SqlCommand);
       _comType[(int)ProviderType.OLEDB] = typeof(OleDbCommand);
       _parmType[(int)ProviderType.SqlClient] = typeof(SqlParameter);
       _parmType[(int)ProviderType.OLEDB] = typeof(OleDbParameter);
       _daType[(int)ProviderType.SqlClient] = typeof(SqlDataAdapter);
       _daType[(int)ProviderType.OLEDB] = typeof(OleDbDataAdapter);
    }

    public ProviderType Provider {
        get {
            return _pType;
        }
        set {
           if (_pTypeSet) {
                throw new ReadOnlyException("Provider already set to " 
                    + _pType.ToString());                             
            }
            else {
                _pType = value;
                _pTypeSet = true;
            }
        }
    }
    public IDataAdapter CreateDataAdapter(string commandText,IDbConnection 
                                          connection) {
        IDataAdapter d;
        IDbDataAdapter da;
            
        d = (IDataAdapter)Activator.CreateInstance(_daType[(int)_pType], 
                                                   false);
        da = (IDbDataAdapter)d;
        da.SelectCommand = this.CreateCommand(commandText, connection);
        return d; }
        
    public IDataParameter CreateParameter(string paramName, DbType 
                                          paramType) {
        IDataParameter p;
        p = (IDataParameter)Activator.CreateInstance(_parmType[(int)_pType], 
                                                    false);
        p.ParameterName = paramName;
        p.DbType = paramType;
        return p; 
    }
        
    public IDataParameter CreateParameter(string paramName, DbType 
                                          paramType, Object value) {
        IDataParameter p;
        p = (IDataParameter)Activator.CreateInstance(_parmType[(int)_pType], 
                                                    false);
        p.ParameterName = paramName;
        p.DbType = paramType;
        p.Value = value;
        return p;
    }
        
    public IDbConnection CreateConnection(string  connect) {
        IDbConnection c;
        c = (IDbConnection)Activator.CreateInstance(_conType[(int)_pType], 
                                                    false);
        c.ConnectionString = connect;
        return c;
    }
        
    public IDbCommand CreateCommand(string cmdText, IDbConnection 
                                    connection) {
        IDbCommand c;
        c = (IDbCommand)Activator.CreateInstance(_comType[(int)_pType], 
                                                 false);
        c.CommandText = cmdText;
        c.Connection = connection;
        return c;
    }
}


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值