在现代软件开发中,数据库是存储和检索数据的关键组件。随着技术的发展,数据库的种类和数量不断增加,包括SQL Server、DB2、Oracle和MS-Access等。为了能够灵活地处理不同数据库,程序员需要一个统一的接口来访问这些数据库。这就是设计模式中的工厂模式发挥作用的地方。
工厂模式允许程序员编写自己的实现来访问数据库。这种模式提供了一个创建对象的接口,让子类决定实例化哪一个类。工厂模式使代码更加模块化,易于扩展和维护。
在.NET框架中,可以通过DbProviderFactory类来实现数据库访问的抽象层。DbProviderFactory是一个抽象类,它提供了一组方法来创建数据库连接、命令、适配器等。通过使用DbProviderFactory,可以编写一个通用的数据库访问类,而不需要关心底层数据库的具体实现。
首先,定义一个抽象类Database,它包含连接字符串、DbProviderFactory、模式和数据提供者等属性。这个类还包含一些方法,如GetConnection、CreateCommand、CreateDataAdapter等,用于创建数据库连接和执行数据库操作。
public abstract class Database
{
private string connectionString;
private DbProviderFactory dbProviderFactory;
private string schema;
private string dataProvider;
private bool status;
protected Database() { }
public DbProviderFactory DbProviderFactory
{
get { return dbProviderFactory; }
}
public string ConnectionString
{
get { return connectionString; }
set { connectionString = value; }
}
public string Schema
{
get { return schema; }
}
public string DataProvider
{
get { return dataProvider; }
}
public DbConnection GetConnection()
{
DbConnection newConnection = null;
try
{
try
{
ProviderFactory = DbProviderFactories.GetFactory(this.ProviderType);
dbConnection = ProviderFactory.CreateConnection();
dbConnection.ConnectionString = this.ConnectionString;
}
catch
{
throw;
}
}
catch
{
if (newConnection != null)
newConnection.Close();
throw;
}
return newConnection;
}
public DbCommand CreateCommand()
{
return dbProviderFactory.CreateCommand();
}
public DbCommand CreateCommand(string sQueryString, DbConnection connection)
{
try
{
// Create the DbCommand.
DbCommand command = this.CreateCommand();
command.CommandText = sQueryString;
command.Connection = connection;
return command;
}
catch
{
throw;
}
}
public DbDataAdapter CreateDataAdapter()
{
return dbProviderFactory.CreateDataAdapter();
}
public DbDataAdapter CreateDataAdapter(string sQueryString, DbConnection connection)
{
try
{
// Create the DbCommand.
DbCommand command = this.CreateCommand();
command.CommandText = sQueryString;
command.Connection = connection;
// Create the DbDataAdapter.
DbDataAdapter adapter = this.CreateDataAdapter();
adapter.SelectCommand = command;
return adapter;
}
catch
{
throw;
}
}
private DbCommandBuilder CreateCommandBuilder()
{
return dbProviderFactory.CreateCommandBuilder();
}
public DbCommandBuilder CreateCommandBuilder(DbDataAdapter dbDA)
{
DbCommandBuilder dbCB = this.CreateCommandBuilder();
dbCB.DataAdapter = dbDA;
return dbCB;
}
}
接下来,需要在web.config文件中配置数据库连接字符串和数据提供者。这允许在应用程序中灵活地切换不同的数据库。
<add key="Connectionstring" value="database=local;user id=sa;pwd=sa;initial catalog=northwind"/>
<add key="SQLProvider" value="System.Data.SqlClient"/>
<add key="OledbProvider" value="System.Data.OleDb"/>
<add key="Db2Provider" value="IBM.Data.DB2"/>
<add key="OracleProvider" value="System.Data.OracleClient"/>
最后,在ASP.NET页面的代码后台中使用这个数据库抽象层。从配置文件中读取连接字符串和数据提供者,然后创建数据库连接、数据适配器和命令构建器。
private Database DB;
private DbDataAdapter SQLDA;
private DbCommandBuilder SQLDB;
private DbConnection Conn;
private DBCommand cmd;
//pass the connection string and provider type to create database connection
DB.Connectionstring=Configuration.ConfigurationManager.AppSettings["Connectionstring"].ToString();
DB.DataProvider=Configuration.ConfigurationManager.AppSettings["SQLProvider"].ToString();
//create database connection
Conn = DB.GetConnection();
Conn.Open();
//creating Data Adapter
SQLDA=DB.CreateDataAdapter("select * from emp",Conn);
//Create Command Builder
SQLDB=DB.CreateCommandBuilder(SQLDA);
//Create Command
cmd=DB.CreateCommand("select * from emp",Conn);