抽象工厂模式:实现ASP.NET访问不同数据库

来源:互联网 发布:oracle恢复删除的数据 编辑:程序博客网 时间:2024/04/30 10:01

ASP.NET网站开发中可能会遇到要更换数据库,如将Aceess换为SQL Server ,由于Aceess引用System.Data.OleDb命名空间,SQL Server引用System.Data.SqlClient命名空间。在一般程序代码中我们需要更改连接字符串,ADO.NET数据访问命令对象,最麻烦的是不同数据库有各自不同Sql命令。我们可以使用抽象工厂模式实现ASP.NET访问不同数据库。

 

1、抽象工厂模式(Abstract Factory):提供一个创建一系列相互依赖对象的接口,而无需指定他们的具体类。

2、一般组成:抽象产品接口,具体产品类,抽象工厂接口,具体工厂类,客户端代码

3、作用:易于交换产品系列,在一个应用中只需在初始化的时候出现一次,这就使得改变一个应用的具体工厂的具体工厂变得非常容易,只需改变具体工厂即可使用不同的产品配置

让具体的创建实例过程与客户端分离,客户端是通过他们的抽象类接口操纵实例,产品的具体类名也被具体工厂是实现分离,不会出现在客户代码中。

 

网上提供的代码基本是为了讲解说明C#设计模式,由C#控制台程序代码实现,并没有真正实现访问数据库。我这里通过建立一个ASP.NET网站,实现访问AccessSQL Server数据库。主要参考《大话设计模式》

 

具体步骤代码如下:

1、  分别在AccessSQL Server建立数据库DaHua与数据库表User(ID,Name)DepartmentID,DepartName

2、  启动Visual Studio 2005/2008新建网站

3、  web.config添加数据库连接

4、  在网站解决方案右键新建类库ClassLibrary1新建类文件,包括:

AbstractUser抽象类,SqlserverUser类,AccessUser

AbstractDepartment抽象类,SqlserverDepartment类,AccessDepartment

DataAccess

生成dll

5、到项目添加引用,项目-右键-添加引用-项目-ClassLibrary1

6、前台代码:添加一个GridView控件,三个Button控件,2TextBox控件

用于查询表UserDepartment表内容,插入User表数据

 

using System;

using System.Configuration;

using System.Data;

using System.Linq;

using System.Web;

using System.Xml.Linq;

using System.Data.SqlClient;

using System.Data.OleDb;

using System.Reflection;

 

namespace ClassLibrary1

{

    /// <summary>

    ///AbstractUser抽象类

    /// </summary>

    public abstract class AbstractUser

    {

        public abstract DataSet GetUser();

        public abstract void InsertUser(string userID, string userName);

    }

 

    /// <summary>

    /// SqlserverUser

    /// </summary>

    public class SqlserverUser : AbstractUser

    {

        string constr = ConfigurationManager.ConnectionStrings["constrSQLDahua"].ConnectionString;

 

        public override DataSet GetUser()

        {

            SqlConnection conn = new SqlConnection(constr);

            if (conn.State == ConnectionState.Closed)

                conn.Open();

 

            SqlCommand cmd = new SqlCommand("select * from [User]", conn);

            SqlDataAdapter sda = new SqlDataAdapter();

            sda.SelectCommand = cmd;

            DataSet ds = new DataSet();

            sda.Fill(ds);

            return ds;

        }

 

        public override void InsertUser(string userID, string userName)

        {

            SqlConnection conn = new SqlConnection(constr);

            if (conn.State == ConnectionState.Closed)

                conn.Open();

            SqlCommand cmd = new SqlCommand();

            cmd.Connection = conn;

            cmd.CommandText = "insert into [User] values('" + Int32.Parse(userID) + "','" + userName + "') ";

            cmd.ExecuteNonQuery();

            conn.Close();

 

        }

    }

 

    /// <summary>

    /// AccessUser

    /// </summary>

    public class AccessUser : AbstractUser

    {

        string constr = ConfigurationManager.ConnectionStrings["constrAccessDaHua"].ConnectionString;

 

        public override DataSet GetUser()

        {

            OleDbConnection conn = new OleDbConnection(constr);

            if (conn.State == ConnectionState.Closed)

                conn.Open();

 

            OleDbCommand cmd = new OleDbCommand("select * from [User]", conn);

            OleDbDataAdapter sda = new OleDbDataAdapter();

            sda.SelectCommand = cmd;

            DataSet ds = new DataSet();

            sda.Fill(ds);

            return ds;

        }

 

        public override void InsertUser(string userID, string userName)

        {

            OleDbConnection conn = new OleDbConnection(constr);

            if (conn.State == ConnectionState.Closed)

                conn.Open();

            OleDbCommand cmd = new OleDbCommand();

            cmd.Connection = conn;

            cmd.CommandText = "insert into [User] values('" + Int32.Parse(userID) + "','" + userName + "') ";

            cmd.ExecuteNonQuery();

            conn.Close();

        }

}

 

/// <summary>

    ///AbstractDepartment抽象类

    /// </summary>

    public abstract class AbstractDepartment

    {

        public abstract DataSet GetDepartment();

        // void InsertDepartment(string depID, string depName);

    }

 

    /// <summary>

    /// SqlserverDepartment

    /// </summary>

    public class SqlserverDepartment : AbstractDepartment

    {

        string constr = ConfigurationManager.ConnectionStrings["constrSQLDahua"].ConnectionString;

 

        public override DataSet GetDepartment()

        {

            SqlConnection conn = new SqlConnection(constr);

            if (conn.State == ConnectionState.Closed)

                conn.Open();

 

            SqlCommand cmd = new SqlCommand("select * from [Department]", conn);

            SqlDataAdapter sda = new SqlDataAdapter();

            sda.SelectCommand = cmd;

            DataSet ds = new DataSet();

            sda.Fill(ds);

            return ds;

 

        }

    }

 

    /// <summary>

    /// AccessDepartment

    /// </summary>

    public class AccessDepartment : AbstractDepartment

    {

        string constr = ConfigurationManager.ConnectionStrings["constrAccessDaHua"].ConnectionString;

 

        public override DataSet GetDepartment()

        {

            OleDbConnection conn = new OleDbConnection(constr);

            if (conn.State == ConnectionState.Closed)

                conn.Open();

 

            OleDbCommand cmd = new OleDbCommand("select * from [Department]", conn);

            OleDbDataAdapter sda = new OleDbDataAdapter();

            sda.SelectCommand = cmd;

            DataSet ds = new DataSet();

            sda.Fill(ds);

            return ds;

        }

 }

 

/// <summary>

    ///DataAccess

    ///使用反射

    /// </summary>

    public class DataAccess

    {

        private static readonly string AssemblyName = "ClassLibrary1"; //程序集名称

        private static readonly string db = "Sqlserver"; //数据库类型名,要更改访问的数据库,只需更改这里

 

        public static AbstractUser CreateUser()

        {

            string className = AssemblyName + "." + db + "User"; //命名空间.要实例化的类名

            return (AbstractUser)Assembly.Load(AssemblyName).CreateInstance(className);

        }

 

        public static AbstractDepartment CreateDepartment()

        {

            string className = AssemblyName + "." + db + "Department";

            return (AbstractDepartment)Assembly.Load(AssemblyName).CreateInstance(className);

        }

 }

}

 

前台代码:

public partial class _Default : System.Web.UI.Page

{

    ClassLibrary1.AbstractUser au = null;

    ClassLibrary1.AbstractDepartment ad = null;

 

    protected void Page_Load(object sender, EventArgs e)

    {

       

      

    }

    protected void Button1_Click(object sender, EventArgs e)

    {

        au =ClassLibrary1.DataAccess.CreateUser();

        DataSet ds = au.GetUser();

        GridView1.DataSource = ds;

        GridView1.DataBind();

 

    }

    protected void Button2_Click(object sender, EventArgs e)

    {       

        string userID = txtID.Text;

        string userName = txtName.Text ;

        au = ClassLibrary1.DataAccess.CreateUser();

        au.InsertUser(userID,userName);

    }

 

    //部门查询

    protected void Button3_Click(object sender, EventArgs e)

    {

        ad = ClassLibrary1.DataAccess.CreateDepartment();

        DataSet ds = ad.GetDepartment();

        GridView1.DataSource = ds;

        GridView1.DataBind();

    }

}

 

 

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 头发有颜色怎么办护照 微信怎么办港澳通行证 港澳通行证 团签怎么办 出境章没有盖怎么办 过海关没有盖章怎么办 中国入境没盖章怎么办 护照有效期写错怎么办 回国海关电子盖章怎么办 户籍在学校怎么办护照 割过双眼皮护照怎么办 想换电子护照怎么办 有美签的护照丢失怎么办 护照在国外掉了怎么办 上海动迁房户口怎么办 政府强制拆房怎么办 农村无证宅基地怎么办 身份证没磁怎么办护照 买安置房怎么办产权 安置房房东违约怎么办 安置房产权到期怎么办 安置房怎么办房产证吗 美甲后指甲长了怎么办 在菲律宾怎么办持枪证? 绝地求生打不准怎么办 身份证号码变更后社保怎么办 社保与身份不符怎么办 年龄改了学籍怎么办 结婚证信息错误怎么办 六级身份证过期怎么办 身份号泄露了怎么办 身体证信息泄露怎么办 手机号被泄漏了怎么办 姓名和电话泄露怎么办 个人身份证信息泄露怎么办 身份号码泄露了怎么办 我身份证泄露了怎么办 身份证信息泄漏了怎么办 无锡身份证丢了怎么办 人在外地怎么办身份证 欠空放公司不还怎么办 兼职要身份证照片怎么办