愚见未来

人的思想时时刻刻都在进步,如果你早上起床,想起昨天所做的事情是那么幼稚和迂腐,那么恭喜你,你又变得成熟一点了!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

编写可移植数据访问层

Posted on 2010-01-19 14:06  愚见未来  阅读(475)  评论(1编辑  收藏  举报

数据提供程序基本接口标识应用程序与数据源进行交互通常所需的典型行为:

  • 定义连接字符串。

  • 打开和关闭与数据源的物理连接。

  • 定义命令和相关参数。

  • 执行可以创建的不同种类的命令。

    • 返回一组数据。

    • 返回标量值。

    • 对数据执行操作但不返回任何内容。

  • 对返回的数据集提供只向前型访问和只读型访问。

  • 定义使数据集与数据源(数据适配器)的内容保持同步所需的一组操作。

将检索、插入、更新和删除不同数据源(使用不同的数据提供程序)中的信息所需的各种操作封装在数据访问层中,并且只公开基本接口的成员,则可以实现第一级抽象-至少从数据提供程序的角度来看是这样。让我们看一看以下演示该设计思想的代码:

using System;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Data.OracleClient;


namespace DAL
{
   public enum DatabaseType
   {
      Access,
      SQLServer,
      Oracle
      // 任何其他数据源类型
   }

   public enum ParameterType
   {
      Integer,
      Char,
      VarChar
      // 定义公用参数类型集
   }

   public class DataFactory
   {
      private DataFactory(){}

      public static IDbConnection CreateConnection
         (string ConnectionString,
         DatabaseType dbtype)
      {
         IDbConnection cnn;

         switch(dbtype)
         {
            case DatabaseType.Access:
               cnn = new OleDbConnection
                  (ConnectionString);
               break;
            case DatabaseType.SQLServer:
               cnn = new SqlConnection
                  (ConnectionString);
               break;
            case DatabaseType.Oracle:
               cnn = new OracleConnection
                  (ConnectionString);
               break;
            default:
               cnn = new SqlConnection
                  (ConnectionString);
               break;              
         }

         return cnn;
      }


      public static IDbCommand CreateCommand
         (string CommandText, DatabaseType dbtype,
         IDbConnection cnn)
      {
         IDbCommand cmd;
         switch(dbtype)
         {
            case DatabaseType.Access:
               cmd = new OleDbCommand
                  (CommandText,
                  (OleDbConnection)cnn);
               break;

            case DatabaseType.SQLServer:
               cmd = new SqlCommand
                  (CommandText,
                  (SqlConnection)cnn);
               break;

            case DatabaseType.Oracle:
               cmd = new OracleCommand
                  (CommandText,
                  (OracleConnection)cnn);
               break;
            default:
               cmd = new SqlCommand
                  (CommandText,
                  (SqlConnection)cnn);
               break;
         }

         return cmd;
      }


      public static DbDataAdapter CreateAdapter
         (IDbCommand cmd, DatabaseType dbtype)
      {
         DbDataAdapter da;
         switch(dbtype)
         {
            case DatabaseType.Access:
               da = new OleDbDataAdapter
                  ((OleDbCommand)cmd);
               break;

            case DatabaseType.SQLServer:
               da = new SqlDataAdapter
                  ((SqlCommand)cmd);
               break;

            case DatabaseType.Oracle:
               da = new OracleDataAdapter
                  ((OracleCommand)cmd);
               break;

            default:
               da = new SqlDataAdapter
                  ((SqlCommand)cmd);
               break;
         }

         return da;
      }
   }
}