一个基于ADO.NET的数据访问层的实现

2010-08-28 10:47:16来源:西部e网作者:

1、IAdoNetBuilder.cs
-------------------------
using  System;

namespace  GeneralForums.Web
{
  /// 
  ///  帮助建立各种  ADO.NET  对象的处理器。
  /// 
  public  interface  IAdoNetBuilder
  {
    /// 
    ///  建立到数据存储的连接。
    /// 
    ///  返回已经创建的  System.Data.IDbConnection  对象引用。
    System.Data.IDbConnection  CreateConnection();

    /// 
    ///  创建一个  System.Data.IDbDataAdapter。
    /// 
    ///  返回已经创建的  System.Data.IDbDataAdapter  对象引用。
    System.Data.IDbDataAdapter  CreateDataAdapter();
  }
}


2、SqlBuilder.cs
-------------------------
using  System;

namespace  GeneralForums.Web
{
  /// 
  ///  定义基于  MS  SQL  Server  的  IAdoNetBuilder  的一个实现。
  /// 
  public  class  SqlBuilder  :  IAdoNetBuilder
  {
    /// 
    ///  配置文件中用于对连接字符串进行索引的键值。
    /// 
    public  static  string  ConnectionStringKey  =  "__SqlBuilder_ConnectionString";

    /// 
    ///  初始化  SqlBuilder  类的新实例。
    /// 
    public  SqlBuilder()
    {
    }

    /// 
    ///  返回数据库连接串。
    /// 
    /// 
    public  static  string  ConnectionString()
    {
      return  System.Configuration.ConfigurationSettings.AppSettings[ConnectionStringKey];
    }

    #region  IAdoNetBuilder  成员

    /// 
    ///  建立到MS  SQL  Server  数据库的连接。
    /// 
    ///  返回已经创建的  System.Data.IDbConnection  对象引用。
    ///  从当前配置文件(.config)中获取连接信息(索引键值为“__SqlBuilder_ConnectionString”),
并建立相应的连接。配置文件中的连接信息是明文的,没有经过任何加密,为了保证数据库的安全,
应该考虑对  SqlCreator  提供集成的数据库验证。
    public  System.Data.IDbConnection  CreateConnection()
    {
      return  new  System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationSettings.AppSettings[ConnectionStringKey]);
    }

    /// 
    ///  创建一个  System.Data.IDbDataAdapter。
    /// 
    ///  返回已经创建的  System.Data.IDbDataAdapter  对象引用。
    public  System.Data.IDbDataAdapter  CreateDataAdapter()
    {
      return  new  System.Data.SqlClient.SqlDataAdapter();
    }

    #endregion
  }
}


3、AdoNetHelper.cs
-------------------------
using  System;

namespace  GeneralForums.Web
{
  /// 
  ///  为加载当前的  IAdoNetBuilder  提供方法。不能继承该类。
  /// 
  public  sealed  class  AdoNetHelper
  {
    private  AdoNetHelper()
    {
    }

    private  static  IAdoNetBuilder  _builder  =  null;

    /// 
    ///  配置文件中表示当前正在使用的  IAdoNetBuilder  的配置键值。
    /// 
    public  static  string  AdoNetBuilderKey  =  "__AdoNetBuilder__";

    /// 
    ///  获取由当前配置确定的  IAdoNetBuilder  对象引用。
    /// 
    public  static  IAdoNetBuilder  AdoNetBuilder
    {
      get
      {
        if(_builder  ==  null)
        {
          string  v  =  System.Configuration.ConfigurationSettings.AppSettings[AdoNetBuilderKey];
          if(v  ==  null  ||  v.Trim()  ==  "")
          {
            _builder  =  new  SqlBuilder();
          }
          else
          {
            string  []  vv  =  v.Split(’,’);
            if(vv.Length  <  2)
              throw  new  ArgumentException("提供的数据操作配置项目的信息不够完整。");

            string  aname  =  vv[0].ToLower().Trim();
            System.Reflection.Assembly  assembly  =  System.Reflection.Assembly.GetExecutingAssembly();
            if(aname  !=  System.IO.Path.GetFileName(assembly.Location).ToLower())
            {
              assembly  =  System.Reflection.Assembly.LoadFrom(vv[0]);
            }

            _builder  =  (IAdoNetBuilder)assembly.CreateInstance(vv[1]);
          }
        }

        return  _builder;
      }
    }


    /// 
    ///  执行指定的数据操作。
    /// 
    ///  进行数据库操作的  SQL  语句。
    ///  返回操作影响的数据库的行数。
    public  static  int  Execute(string  sql)
    {
      if(sql  ==  null  ||  sql.Trim()  ==  "")
        throw  new  ArgumentNullException("sql",  "无效的数据操作语句。");

      System.Data.IDbConnection  conn  =  AdoNetBuilder.CreateConnection();
      conn.Open();
      try
      {
        System.Data.IDbCommand  cmd  =  conn.CreateCommand();
        cmd.CommandText  =  sql;
        return  cmd.ExecuteNonQuery();
      }
      finally
      {
        conn.Close();
      }
    }


    /// 
    ///  从当前数据源中获取一个单一的值。
    /// 
    ///  进行数据操作使用的  SQL  语句。
    ///  返回已经获取的值,如果没有相应的值,则可能返回空引用。
    public  static  object  QueryScalar(string  sql)
    {
      if(sql  ==  null  ||  sql.Trim()  ==  "")
        throw  new  ArgumentNullException("sql",  "无效的数据操作语句。");

      System.Data.IDbConnection  conn  =  AdoNetBuilder.CreateConnection();
      conn.Open();
      try
      {
        System.Data.IDbCommand  cmd  =  conn.CreateCommand();
        cmd.CommandText  =  sql;
        return  cmd.ExecuteScalar();
      }
      finally
      {
        conn.Close();
      }
    }


    /// 
    ///  从当前数据源中获取一个记录行。
    /// 
    ///  进行数据库操作使用的  SQL  语句,如果语句包含一个记录集,则只返回记录集中的第一个记录行。
    ///  返回已经获取的行的值,该行中的所有的值以字典的形式保存。如果没有相应的行,则返回的字典的长度为  0。
    ///  如果数据库中的值为空值,则返回的字典中的相应值为空引用。
    public  static  System.Collections.IDictionary  QueryRow(string  sql)
    {
      if(sql  ==  null  ||  sql.Trim()  ==  "")
        throw  new  ArgumentNullException("sql",  "无效的数据操作语句。");

      System.Data.IDbConnection  conn  =  AdoNetBuilder.CreateConnection();
      conn.Open();
      try
      {
        System.Data.IDbCommand  cmd  =  conn.CreateCommand();
        cmd.CommandText  =  sql;
        System.Data.IDataReader  reader  =  null;
        try
        {
          reader  =  cmd.ExecuteReader();
          if(reader.Read())
          {
            int  count  =  reader.FieldCount;
            System.Collections.Specialized.HybridDictionary  d  =  new  System.Collections.Specialized.HybridDictionary(count);
            for(int  i  =  0;  i  <  count;  i  ++)
            {
              d.Add(reader.GetName(i),  reader.IsDBNull(i)  ?  null  :  reader.GetValue(i));
            }
            return  d;
          }
          else
          {
            return  new  System.Collections.Specialized.HybridDictionary(1);
          }
        }
        finally
        {
          if(reader  !=  null  &&  !reader.IsClosed)
            reader.Close();
        }
      }
      finally
      {
        conn.Close();
      }
    }


    /// 
    ///  从当前的数据源中加载一个行集。
    /// 
    ///  进行数据库操作使用的  SQL  语句。
    ///  返回  System.Data.DataSet  ,该集合中包含了所有的符合条件的行集。
    public  static  System.Data.DataSet  QueryRows(string  sql)
    {
      if(sql  ==  null  ||  sql.Trim()  ==  "")
        throw  new  ArgumentNullException("sql",  "无效的数据操作语句。");

      System.Data.IDbConnection  conn  =  AdoNetBuilder.CreateConnection();
      conn.Open();
      try
      {
        System.Data.IDbCommand  cmd  =  conn.CreateCommand();
        cmd.CommandText  =  sql;

        System.Data.IDbDataAdapter  adapter  =  AdoNetBuilder.CreateDataAdapter();
        System.Data.DataSet  dataset  =  new  System.Data.DataSet();

        adapter.SelectCommand  =  cmd;
        adapter.Fill(dataset);
       
        return  dataset;
      }
      finally
      {
        conn.Close();
      }
    }


   
  }
}


=========

关键词:ADO.NET

赞助商链接: