使用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。例如,为了填补一个带参数的存储过程的结果数据集,你可以使用下面的代码里面的数据访问类的方法:
通常情况下,你会声明在类级别providerfactory变量的数据访问类的构造函数实例化。此外,它的构造函数将填充从一个配置文件,而不是硬编码读取的供应商,如下所示。你可以想像,providerfactory将是一个伟大的除了你的DAL基类,然后可以在大会和分发给其他开发人员。
你可以选择采取了一步,封装共同ado.net代码,开发人员编写一遍又一遍。事实上,微软已经发布执行此功能为SQL
Server数据访问应用程序块。
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; } }
相关文章推荐
- 分别使用ADO.Net Entity Data Model 和Linq to Sql 建立数据访问层
- c#数据库操作DataGridView控件的使用,ADO.NET
- 使用Ado.net获取数据库架构信息
- 使用ADO.NET访问数据库,类和对象概述
- 使用ADO.NET操纵数据库
- 使用ADO.NET设计数据库应用程序
- Sybase ASE数据库使用ADO.net访问存储过程方法详解
- 浅谈如何使用ADO.NET操作数据库
- ADO.NET 更新数据库的2种方式::(1)使用DataSet对象更新数据集;(2)使用SqlCommand对象更新单条记录
- ado.net连接模式访问数据库中datareader的返回多个结果集和mars的使用
- 使用Ado.net获取数据库架构信息
- 使用ADO.NET提取数据库架构(元数据)
- 『转载』使用ADO.NET轻松操纵数据库
- 如何使用ADO.Net助手生成C#数据库代码
- .NET数据库编程求索之路--4.使用ADO.NET实现(三层架构篇-使用Table传递数据)(5)
- Sybase ASE数据库使用ADO.net访问存储过程方法详解
- [z]使用 ADO.NET 开发 数据库无关 的 应用程序
- 使用ADO.Net获取Sql Server数据库系统中所有数据库的名字
- NDatabase 入门,简单使用 增删改查。让NDatabase带你脱离ADO.net,各种SQL 语句,各种DBMS,各种CRM,IOC之类的烦恼。我们也不需要仓库设计模式了,你妹的。不要表了,不要设计数据库字段了。就这样!
- 使用ADO.NET的体系架构形成统一的数据库