您的位置:首页 > 数据库

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

2011-12-19 20:57 344 查看
抽象的.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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息