惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
Forbes - Security
Forbes - Security
雷峰网
雷峰网
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
V
Visual Studio Blog
月光博客
月光博客
博客园 - Franky
有赞技术团队
有赞技术团队
宝玉的分享
宝玉的分享
博客园 - 三生石上(FineUI控件)
酷 壳 – CoolShell
酷 壳 – CoolShell
Apple Machine Learning Research
Apple Machine Learning Research
The Register - Security
The Register - Security
S
SegmentFault 最新的问题
博客园 - 司徒正美
P
Proofpoint News Feed
Know Your Adversary
Know Your Adversary
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
A
Arctic Wolf
Cyberwarzone
Cyberwarzone
Simon Willison's Weblog
Simon Willison's Weblog
U
Unit 42
P
Proofpoint News Feed
Scott Helme
Scott Helme
MyScale Blog
MyScale Blog
T
Tenable Blog
Hugging Face - Blog
Hugging Face - Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
小众软件
小众软件
C
CERT Recently Published Vulnerability Notes
P
Palo Alto Networks Blog
V
V2EX
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tailwind CSS Blog
V
Vulnerabilities – Threatpost
Latest news
Latest news
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
Intezer
Microsoft Azure Blog
Microsoft Azure Blog
爱范儿
爱范儿
博客园 - 【当耐特】
B
Blog RSS Feed
N
Netflix TechBlog - Medium
Recent Announcements
Recent Announcements
NISL@THU
NISL@THU
C
Cisco Blogs
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Schneier on Security

博客园 - 黑武士

此处已被废弃 悲惨的开发工程师人生之路(转载) 中国企业为什么不需要软件 试析J2EE与.NET时代的商业利润 J2EE还是.NET,这是一个问题 三十岁:程序员的职业发展 程序员:迫在眉睫的职业规划 新手宝典 J2EE专家起步图解(转载) 谁为企业信息化损失买单? 非专业程序员谈程序员修炼之路 搭建系统框架发现的三个Web.Config问题 在ASP.Net中应用Javascript 星球大战:一场与我无关的童话 中国软件---技术篇 软件项目的“管理之痒” Petshop项目的数据库 几个开源项目配置信息的存储和处理的方式 正则表达式 C#编码标准--编码习惯
用C#实现的数据库抽象工厂
黑武士 · 2005-06-21 · via 博客园 - 黑武士

最近学习了一下设计模式,便尝试用C#对数据库的访问操作采用抽象工厂的模式实现一下,其中与标准的模式略有不同,加入了一些自己的想法,希望大家批评指正,代码共分为6个类:

(1)AbstractDbFactory.cs

using System;
using System.Data;

namespace DbService
{
/// <summary>
/// 数据库抽象工厂接口
/// </summary>
public interface AbstractDbFactory
{
  /// <summary>
  /// 建立默认连接
  /// </summary>
  /// <returns>数据库连接</returns>
  IDbConnection CreateConnection();

  /// <summary>
  /// 根据连接字符串建立Connection对象
  /// </summary>
  /// <param name="strConn">连接字符串</param>
  /// <returns>Connection对象</returns>
  IDbConnection CreateConnection(string strConn);

  /// <summary>
  /// 建立Command对象
  /// </summary>
  /// <returns>Command对象</returns>
  IDbCommand CreateCommand();

  /// <summary>
  /// 建立DataAdapter对象
  /// </summary>
  /// <returns>DataAdapter对象</returns>
  IDbDataAdapter CreateDataAdapter();

  /// <summary>
  /// 根据Connection建立Transaction
  /// </summary>
  /// <param name="myDbConnection">Connection对象</param>
  /// <returns>Transaction对象</returns>
  IDbTransaction CreateTransaction(IDbConnection myDbConnection);

  /// <summary>
  /// 根据Command建立DataReader
  /// </summary>
  /// <param name="myDbCommand">Command对象</param>
  /// <returns>DataReader对象</returns>
  IDataReader CreateDataReader(IDbCommand myDbCommand);

  /// <summary>
  /// 获得连接字符串
  /// </summary>
  /// <returns>连接字符串</returns>
  string GetConnectionString();
}
}

(2)Factory.cs

using System;
using System.Configuration;

namespace DbService
{
/// <summary>
/// Factory类
/// </summary>
public sealed class Factory
{
  private static volatile Factory singleFactory = null;
  private static object syncObj = new object();
  /// <summary>
  /// Factory类构造函数
  /// </summary>
  private Factory()
  {
  }

  /// <summary>
  /// 获得Factory类的实例
  /// </summary>
  /// <returns>Factory类实例</returns>
  public static Factory GetInstance()
  {
   if(singleFactory == null)
   {
    lock(syncObj)
    {
     if(singleFactory == null)
     {
      singleFactory = new Factory();
     }
    }
   }
   return singleFactory;
  }

  /// <summary>
  /// 建立Factory类实例
  /// </summary>
  /// <returns>Factory类实例</returns>
  public AbstractDbFactory CreateInstance()
  {
   AbstractDbFactory abstractDbFactory = null;
   switch(ConfigurationSettings.AppSettings["DatabaseType"].ToLower())
   {
    case "sqlserver":
    {
     abstractDbFactory = new SqlFactory();
     break;
    }
    case "oledb":
    {
     abstractDbFactory = new OleDbFactory();
     break;
    }
    case "odbc":
    {
     abstractDbFactory = new OdbcFactory();
     break;
    }
   }  
   return abstractDbFactory;
  }
}
}
(3)SqlFactory.cs

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace DbService
{
/// <summary>
/// 针对SqlServer专用连接的工厂
/// </summary>
public class SqlFactory : AbstractDbFactory
{
  /// <summary>
  /// 构造函数
  /// </summary>
  public SqlFactory()
  {
  }

  /// <summary>
  /// 建立默认Connection对象
  /// </summary>
  /// <returns>Connection对象</returns>
  public IDbConnection CreateConnection()
  {
   return new SqlConnection();
  }

  /// <summary>
  /// 根据连接字符串建立Connection对象
  /// </summary>
  /// <param name="strConn">连接字符串</param>
  /// <returns>Connection对象</returns>
  public IDbConnection CreateConnection(string strConn)
  {
   return new SqlConnection(strConn);
  }

  /// <summary>
  /// 建立Command对象
  /// </summary>
  /// <returns>Command对象</returns>
  public IDbCommand CreateCommand()
  {
   return new SqlCommand();
  }

  /// <summary>
  /// 建立DataAdapter对象
  /// </summary>
  /// <returns>DataAdapter对象</returns>
  public IDbDataAdapter CreateDataAdapter()
  {
   return new SqlDataAdapter();
  }

  /// <summary>
  /// 根据Connection建立Transaction
  /// </summary>
  /// <param name="myDbConnection">Connection对象</param>
  /// <returns>Transaction对象</returns>
  public IDbTransaction CreateTransaction(IDbConnection myDbConnection)
  {
   return myDbConnection.BeginTransaction();
  }

  /// <summary>
  /// 根据Command建立DataReader
  /// </summary>
  /// <param name="myDbCommand">Command对象</param>
  /// <returns>DataReader对象</returns>
  public IDataReader CreateDataReader(IDbCommand myDbCommand)
  {
   return myDbCommand.ExecuteReader();
  }

  /// <summary>
  /// 获得连接字符串
  /// </summary>
  /// <returns>连接字符串</returns>
  public string GetConnectionString()
  {
   string strServer = ConfigurationSettings.AppSettings["SqlServerServer"];
   string strDatabase = ConfigurationSettings.AppSettings["SqlServerDatabase"];
   string strUid = ConfigurationSettings.AppSettings["SqlServerUid"];
   string strPwd = ConfigurationSettings.AppSettings["SqlServerPwd"];
   string strConnectionString = "Server = " + strServer + "; Database = " + strDatabase + "; Uid = " + strUid + "; Pwd = " + strPwd + ";";
   return strConnectionString;
  }

}
}

(4)OleDbFactory.cs

using System;
using System.Data;
using System.Data.OleDb;
using System.Configuration;

namespace DbService
{
/// <summary>
/// 针对OleDb连接的工厂
/// </summary>
public class OleDbFactory : AbstractDbFactory
{
  /// <summary>
  /// 构造函数
  /// </summary>
  public OleDbFactory()
  {
  }

  /// <summary>
  /// 建立默认Connection对象
  /// </summary>
  /// <returns>Connection对象</returns>
  public IDbConnection CreateConnection()
  {
   return new OleDbConnection();
  }

  /// <summary>
  /// 根据连接字符串建立Connection对象
  /// </summary>
  /// <param name="strConn">连接字符串</param>
  /// <returns>Connection对象</returns>
  public IDbConnection CreateConnection(string strConn)
  {
   return new OleDbConnection(strConn);
  }

  /// <summary>
  /// 建立Command对象
  /// </summary>
  /// <returns>Command对象</returns>
  public IDbCommand CreateCommand()
  {
   return new OleDbCommand();
  }

  /// <summary>
  /// 建立DataAdapter对象
  /// </summary>
  /// <returns>DataAdapter对象</returns>
  public IDbDataAdapter CreateDataAdapter()
  {
   return new OleDbDataAdapter();
  }

  /// <summary>
  /// 根据Connection建立Transaction
  /// </summary>
  /// <param name="myDbConnection">Connection对象</param>
  /// <returns>Transaction对象</returns>
  public IDbTransaction CreateTransaction(IDbConnection myDbConnection)
  {
   return myDbConnection.BeginTransaction();  
  }

  /// <summary>
  /// 根据Command建立DataReader
  /// </summary>
  /// <param name="myDbCommand">Command对象</param>
  /// <returns>DataReader对象</returns>
  public IDataReader CreateDataReader(IDbCommand myDbCommand)
  {
   return myDbCommand.ExecuteReader();
  }

  /// <summary>
  /// 获得连接字符串
  /// </summary>
  /// <returns>连接字符串</returns>
  public string GetConnectionString()
  {
   string strProvider = ConfigurationSettings.AppSettings["OleDbProvider"];
   string strDataSource = ConfigurationSettings.AppSettings["OleDbDataSource"];
   string strConnectionString = "Provider = " + strProvider + ";Data Source = " + strDataSource + ";";
   return strConnectionString;
  }

}
}

(5)OdbcFactory.cs

using System;
using System.Data;
using System.Data.Odbc;
using System.Configuration;

namespace DbService
{
/// <summary>
/// 针对Odbc连接的工厂
/// </summary>
public class OdbcFactory : AbstractDbFactory
{
  /// <summary>
  /// 构造函数
  /// </summary>
  public OdbcFactory()
  {
  }

  /// <summary>
  /// 建立默认Connection对象
  /// </summary>
  /// <returns>Connection对象</returns>
  public IDbConnection CreateConnection()
  {
   return new OdbcConnection();
  }

  /// <summary>
  /// 根据连接字符串建立Connection对象
  /// </summary>
  /// <param name="strConn">连接字符串</param>
  /// <returns>Connection对象</returns>
  public IDbConnection CreateConnection(string strConn)
  {
   return new OdbcConnection(strConn);
  }

  /// <summary>
  /// 建立Command对象
  /// </summary>
  /// <returns>Command对象</returns>
  public IDbCommand CreateCommand()
  {
   return new OdbcCommand();
  }

  /// <summary>
  /// 建立DataAdapter对象
  /// </summary>
  /// <returns>DataAdapter对象</returns>
  public IDbDataAdapter CreateDataAdapter()
  {
   return new OdbcDataAdapter();
  }

  /// <summary>
  /// 根据Connection建立Transaction
  /// </summary>
  /// <param name="myDbConnection">Connection对象</param>
  /// <returns>Transaction对象</returns>
  public IDbTransaction CreateTransaction(IDbConnection myDbConnection)
  {
   return myDbConnection.BeginTransaction();
  }

  /// <summary>
  /// 根据Command建立DataReader
  /// </summary>
  /// <param name="myDbCommand">Command对象</param>
  /// <returns>DataReader对象</returns>
  public IDataReader CreateDataReader(IDbCommand myDbCommand)
  {
   return myDbCommand.ExecuteReader();
  }

  /// <summary>
  /// 获得连接字符串
  /// </summary>
  /// <returns></returns>
  public string GetConnectionString()
  {
   string strDriver = ConfigurationSettings.AppSettings["OdbcDriver"];
   string strDBQ = ConfigurationSettings.AppSettings["OdbcDBQ"];
   string strConnectionString = "Driver={" + strDriver + "}; DBQ=" + strDBQ + ";";
   return strConnectionString;  
  }

}
}
以下是在应用时真正要调用到的类:

(6)DbAccess.cs

using System;
using System.Data;

namespace DbService
{
/// <summary>
/// DbAccess类,即进行数据库访问时需要调用的类
/// </summary>
public sealed class DbAccess
{
  /// <summary>
  /// DbAccess构造函数
  /// </summary>
  private DbAccess()
  {
  }

  /// <summary>
  /// 无条件查询操作,即查询表中所有记录
  /// </summary>
  /// <param name="strTableName">表名</param>
  /// <param name="strColumn">列名组</param>
  /// <returns>无条件查询结果</returns>
  public static DataSet SelectAll(string strTableName, string[] strColumn)
  {
   DataSet ds = new DataSet();
   Factory factory = Factory.GetInstance();
   AbstractDbFactory abstractDbFactory = factory.CreateInstance();
   IDbConnection concreteDbConn = abstractDbFactory.CreateConnection();
   concreteDbConn.ConnectionString = abstractDbFactory.GetConnectionString();
   concreteDbConn.Open();
   IDbCommand concreteDbCommand = abstractDbFactory.CreateCommand();
   IDbTransaction concreteDbTrans = abstractDbFactory.CreateTransaction(concreteDbConn);
   concreteDbCommand.Connection = concreteDbConn;
   concreteDbCommand.Transaction = concreteDbTrans;
   IDbDataAdapter concreteDbAdapter = abstractDbFactory.CreateDataAdapter();
   try
   {
    string strSql = "SELECT ";
    for(int i = 0; i < strColumn.Length - 1; i++)
    {
     strSql += (strColumn[i] + ", ");
    }
    strSql += (strColumn[strColumn.Length - 1] + " FROM " + strTableName);
    concreteDbCommand.CommandText = strSql;
    concreteDbAdapter.SelectCommand = concreteDbCommand;    
    concreteDbAdapter.Fill(ds);
    concreteDbTrans.Commit();
   }
   catch
   {
    concreteDbTrans.Rollback();
    ds.Clear();
    throw;
   }
   finally
   {
    concreteDbConn.Close();
   }  
   return ds;
  }

  /// <summary>
  /// 条件查询操作
  /// </summary>
  /// <param name="strTableName">表名</param>
  /// <param name="strColumn">列名组</param>
  /// <param name="strCondition">条件</param>
  /// <returns>条件查询结果</returns>
  public static DataSet Select(string strTableName, string[] strColumn, string strCondition)
  {
   DataSet ds = new DataSet();
   Factory factory = Factory.GetInstance();
   AbstractDbFactory abstractDbFactory = factory.CreateInstance();
   IDbConnection concreteDbConn = abstractDbFactory.CreateConnection();
   concreteDbConn.ConnectionString = abstractDbFactory.GetConnectionString();
   concreteDbConn.Open();
   IDbCommand concreteDbCommand = abstractDbFactory.CreateCommand();
   IDbTransaction concreteDbTrans = abstractDbFactory.CreateTransaction(concreteDbConn);
   concreteDbCommand.Connection = concreteDbConn;
   concreteDbCommand.Transaction = concreteDbTrans;
   IDbDataAdapter concreteDbAdapter = abstractDbFactory.CreateDataAdapter();
   try
   {
    string strSql = "SELECT ";
    for(int i = 0; i < strColumn.Length - 1; i++)
    {
     strSql += (strColumn[i] + ", ");
    }
    strSql += (strColumn[strColumn.Length - 1] + " FROM " + strTableName + " WHERE " + strCondition);
    concreteDbCommand.CommandText = strSql;
    concreteDbAdapter.SelectCommand = concreteDbCommand;    
    concreteDbAdapter.Fill(ds);
    concreteDbTrans.Commit();
   }
   catch
   {
    concreteDbTrans.Rollback();
    ds.Clear();
    throw;
   }
   finally
   {
    concreteDbConn.Close();
   }
   return ds;
  }

  /// <summary>
  /// 单条记录的插入操作
  /// </summary>
  /// <param name="strTableName">表名</param>
  /// <param name="strColumn">列名组</param>
  /// <param name="strvalue">值组</param>
  public static void Insert(string strTableName, string[] strColumn, object[] strvalue)
  {
   Factory factory = Factory.GetInstance();
   AbstractDbFactory abstractDbFactory = factory.CreateInstance();
   IDbConnection concreteDbConn = abstractDbFactory.CreateConnection();
   concreteDbConn.ConnectionString = abstractDbFactory.GetConnectionString();  
   concreteDbConn.Open();
   IDbCommand concreteDbCommand = abstractDbFactory.CreateCommand();
   IDbTransaction concreteDbTrans = abstractDbFactory.CreateTransaction(concreteDbConn);
   concreteDbCommand.Connection = concreteDbConn;
   concreteDbCommand.Transaction = concreteDbTrans;
   try
   {
    string strSql = "INSERT INTO " + strTableName + " (";
    for(int i = 0; i < strColumn.Length - 1; i++)
    {
     strSql += (strColumn[i] + ", ");
    }
    strSql += (strColumn[strColumn.Length - 1] + ") valueS (’");
    for(int i = 0; i < strvalue.Length - 1; i++)
    {
     strSql += (strvalue[i] + "’, ’");
    }
    strSql += (strvalue[strvalue.Length - 1] + "’)");
    concreteDbCommand.CommandText = strSql;
    concreteDbCommand.ExecuteNonQuery();
    concreteDbTrans.Commit();
   }
   catch
   {
    concreteDbTrans.Rollback();
    throw;
   }
   finally
   {
    concreteDbConn.Close();
   }  
  }

  /// <summary>
  /// 批量记录的插入操作,即可一次向多张表中插入不同的批量记录
  /// </summary>
  /// <param name="ds">批量记录组成的DataSet,DataSet中的各个DataTable名为表名,各DataTable中的DataColumn名为列名</param>
  public static void InsertSet(ref DataSet ds)
  {
   Factory factory = Factory.GetInstance();
   AbstractDbFactory abstractDbFactory = factory.CreateInstance();
   IDbConnection concreteDbConn = abstractDbFactory.CreateConnection();
   concreteDbConn.ConnectionString = abstractDbFactory.GetConnectionString();  
   concreteDbConn.Open();
   IDbCommand concreteDbCommand = abstractDbFactory.CreateCommand();
   IDbTransaction concreteDbTrans = abstractDbFactory.CreateTransaction(concreteDbConn);
   concreteDbCommand.Connection = concreteDbConn;
   concreteDbCommand.Transaction = concreteDbTrans;
   try
   {
    foreach(DataTable dt in ds.Tables)
    {
     foreach(DataRow dr in dt.Rows)
     {
      string strSql = "INSERT INTO " + dt.TableName + " (";
      for(int i = 0; i < dt.Columns.Count - 1; i++)
      {
       strSql += (dt.Columns[i].Caption + ", ");
      }
      strSql += (dt.Columns[dt.Columns.Count - 1].Caption + ") valueS (’");
      for(int i = 0; i < dt.Columns.Count - 1; i++)
      {
       strSql += (dr[i] + "’, ’");
      }
      strSql += (dr[dt.Columns.Count - 1] + "’)");
      concreteDbCommand.CommandText = strSql;
      concreteDbCommand.ExecuteNonQuery();
     }
    }
    concreteDbTrans.Commit();
   }
   catch
   {
    concreteDbTrans.Rollback();
    throw;
   }

   finally
   {
    concreteDbConn.Close();
   }  
  }

  /// <summary>
  /// 无条件删除操作,即删除表中所有记录
  /// </summary>
  /// <param name="strTableName">表名</param>
  public static void DeleteAll(string strTableName)
  {
   Factory factory = Factory.GetInstance();
   AbstractDbFactory abstractDbFactory = factory.CreateInstance();
   IDbConnection concreteDbConn = abstractDbFactory.CreateConnection();
   concreteDbConn.ConnectionString = abstractDbFactory.GetConnectionString();
   concreteDbConn.Open();
   IDbCommand concreteDbCommand = abstractDbFactory.CreateCommand();
   IDbTransaction concreteDbTrans = abstractDbFactory.CreateTransaction(concreteDbConn);
   concreteDbCommand.Connection = concreteDbConn;
   concreteDbCommand.Transaction = concreteDbTrans;
   try
   {
    string strSql = "DELETE FROM " + strTableName;
    concreteDbCommand.CommandText = strSql;
    concreteDbCommand.ExecuteNonQuery();
    concreteDbTrans.Commit();
   }
   catch
   {
    concreteDbTrans.Rollback();
    throw;
   }
   finally
   {
    concreteDbConn.Close();
   }  
  }

  /// <summary>
  /// 条件删除操作
  /// </summary>
  /// <param name="strTableName">表名</param>
  /// <param name="strCondition">条件</param>
  public static void Delete(string strTableName, string strCondition)
  {
   Factory factory = Factory.GetInstance();
   AbstractDbFactory abstractDbFactory = factory.CreateInstance();
   IDbConnection concreteDbConn = abstractDbFactory.CreateConnection();
   concreteDbConn.ConnectionString = abstractDbFactory.GetConnectionString();
   concreteDbConn.Open();
   IDbCommand concreteDbCommand = abstractDbFactory.CreateCommand();
   IDbTransaction concreteDbTrans = abstractDbFactory.CreateTransaction(concreteDbConn);
   concreteDbCommand.Connection = concreteDbConn;
   concreteDbCommand.Transaction = concreteDbTrans;
   try
   {
    string strSql = "DELETE FROM " + strTableName + " WHERE " + strCondition;
    concreteDbCommand.CommandText = strSql;
    concreteDbCommand.ExecuteNonQuery();
    concreteDbTrans.Commit();
   }
   catch
   {
    concreteDbTrans.Rollback();
    throw;
   }
   finally
   {
    concreteDbConn.Close();
   }  
  }

  /// <summary>
  /// 无条件更新操作,即更新表中所有记录
  /// </summary>
  /// <param name="strTableName">表名</param>
  /// <param name="strColumn">列名组</param>
  /// <param name="strvalue">值组</param>
  public static void UpdateAll(string strTableName, string[] strColumn, object[] strvalue)
  {
   Factory factory = Factory.GetInstance();
   AbstractDbFactory abstractDbFactory = factory.CreateInstance();  
   IDbConnection concreteDbConn = abstractDbFactory.CreateConnection();
   concreteDbConn.ConnectionString = abstractDbFactory.GetConnectionString();
   concreteDbConn.Open();
   IDbCommand concreteDbCommand = abstractDbFactory.CreateCommand();
   IDbTransaction concreteDbTrans = abstractDbFactory.CreateTransaction(concreteDbConn);
   concreteDbCommand.Connection = concreteDbConn;
   concreteDbCommand.Transaction = concreteDbTrans;
   try
   {
    string strSql = "UPDATE " + strTableName + " SET ";
    for(int i = 0; i < strColumn.Length - 1; i++)
    {
     strSql += (strColumn[i] + " = ’" + strvalue[i] + "’, ");
    }
    strSql += (strColumn[strColumn.Length - 1] + " = ’" + strvalue[strvalue.Length - 1] + "’ ");
    concreteDbCommand.CommandText = strSql;
    concreteDbCommand.ExecuteNonQuery();
    concreteDbTrans.Commit();
   }
   catch
   {
    concreteDbTrans.Rollback();
    throw;
   }
   finally
   {
    concreteDbConn.Close();
   }
  }

  /// <summary>
  /// 条件更新操作
  /// </summary>
  /// <param name="strTableName">表名</param>
  /// <param name="strColumn">列名组</param>
  /// <param name="strvalue">值组</param>
  /// <param name="strCondition">条件</param>
  public static void Update(string strTableName, string[] strColumn, object[] strvalue, string strCondition)
  {
   Factory factory = Factory.GetInstance();
   AbstractDbFactory abstractDbFactory = factory.CreateInstance();  
   IDbConnection concreteDbConn = abstractDbFactory.CreateConnection();
   concreteDbConn.ConnectionString = abstractDbFactory.GetConnectionString();
   concreteDbConn.Open();
   IDbCommand concreteDbCommand = abstractDbFactory.CreateCommand();
   IDbTransaction concreteDbTrans = abstractDbFactory.CreateTransaction(concreteDbConn);
   concreteDbCommand.Connection = concreteDbConn;
   concreteDbCommand.Transaction = concreteDbTrans;
   try
   {
    string strSql = "UPDATE " + strTableName + " SET ";
    for(int i = 0; i < strColumn.Length - 1; i++)
    {
     strSql += (strColumn[i] + " = ’" + strvalue[i] + "’, ");
    }
    strSql += (strColumn[strColumn.Length - 1] + " = ’" + strvalue[strvalue.Length - 1] + "’ " + " WHERE " + strCondition);
    concreteDbCommand.CommandText = strSql;
    concreteDbCommand.ExecuteNonQuery();
    concreteDbTrans.Commit();
   }
   catch
   {
    concreteDbTrans.Rollback();
    throw;
   }
   finally
   {
    concreteDbConn.Close();
   }
  }
}
}

最后一步,在Web.config中的根结点configuration下增加一些关于数据库连接字符串的变量:

<appSettings>

<add key="DatabaseType" value="SqlServer" />

<add key="SqlServerServer" value="Ricky" />
<add key="SqlServerDatabase" value="test" />
<add key="SqlServerUid" value="sa" />
<add key="SqlServerPwd" value="henhaoba" />

<add key="OleDbProvider" value="Microsoft.jet.oledb.4.0" />
<add key="OleDbDataSource" value="D:\test.mdb" />

<add key="OdbcDriver" value="Microsoft Access Driver (*.mdb)" />
<add key="OdbcDBQ" value="d:\test.mdb" />
      
</appSettings>

     现在一切OK,大家可以通过改变Web.config中的变量来使用不同的数据库连接方式(SqlServer专用连接、OleDb连接和Odbc连接)连接不同的数据库,同时整个使用仍通过DbAccess,不受任何影响。欢迎大家批评指正:)