分享

用工厂模式开发多数据库连接类

 greenyun588 2013-08-27


用工厂模式开发数据库连接类,是工厂模式最好的应用方式,也是很多初级使用设计模式的程序员都会涉及到的,下面是具体代码:

A、创建一个类库,里面有如下这些类

一、设计一个抽象类




using System;

using System.Collections.Generic;

using System.Text;

using System.Data;

using System.Configuration;


//工厂模式连接数据

namespace DBAccess

...{

    //数据连接的工厂模式抽象类

    public abstract class DBabstract

    ...{

        //构造函数

        public DBabstract()

        ...{

        }


        //打开一个连接

        public abstract void Open();


        //关闭一个连接
        public abstract void Close();


        //数据读取的公共数

        public abstract void PublicClass(string procname, object[] parmas);


        //执行无返回DataSet的函数

        public abstract string Execsql(string procname, object[] parmas);


        //执行有返回DataSet的函数

        public abstract DataSet ExecSqlReturnDataSet(string tablename, string procname, object[] parmas);


    }

}

二、定义一个Oracle连接类




using System;

using System.Collections.Generic;

using System.Text;

using System.Data;

using System.Data.OracleClient;

using System.Configuration;


//工厂模式连接数据库中的ORACLE数据库连接

namespace DBAccess

...{

    //数据连接的工厂模式ORACLE连接类

    internal class DBOracle : DBabstract

    ...{

        private OracleConnection conn = null;  //数据连接

        private OracleCommand cmd = null;      //连接命令


        //构造函数

        public DBOracle(string constring)

        ...{

            this.conn = new OracleConnection(constring);

        }


        //打开一个连接

        public override void Open()

        ...{

            if (this.conn != null && this.conn.State == ConnectionState.Closed)

            ...{

                this.conn.Open();

            }

        }


        //关闭一个连接

        public override void Close()

        ...{

            if (this.conn != null && this.conn.State == ConnectionState.Open)

            ...{

                this.conn.Close();

            }

        }


        //数据读取的公共数

        public override void PublicClass(string procname, object[] parmas)

        ...{

            OracleParameter[] Oracleparmas = (OracleParameter[])parmas;

            this.cmd = new OracleCommand();

            this.cmd.Connection = this.conn;

            this.cmd.CommandType = CommandType.StoredProcedure;

            this.cmd.CommandText = procname;

            if (this.cmd.Parameters.Count > 0)

            ...{

                this.cmd.Parameters.Clear();

            }

            if (Oracleparmas != null && Oracleparmas.Length > 0)

            ...{

                foreach (OracleParameter p in Oracleparmas)

                ...{

                    this.cmd.Parameters.Add(p);

                }

            }

        }


        //执行无返回DataSet的函数

        //<param name="procname">存储过程名</param>

        //<param name="parmas">参数数组</param>

        public override string Execsql(string procname, object[] parmas)

        ...{

            try

            ...{

                OracleParameter[] Oracleparmas = (OracleParameter[])parmas;

                this.Open();

                this.PublicClass(procname, Oracleparmas);

                int var = this.cmd.ExecuteNonQuery();

                this.cmd.Parameters.Clear();

                this.Close();

                return Convert.ToString(var);

            }

            catch(Exception ex)

            ...{

                string e = ex.Message;

                this.Close();

                throw;

            }

        }


        //执行有返回DataSet的函数

        //<param name="tablename">DataSet表名</param>

        //<param name="procname">存储过程名</param>

        //<param name="parmas">参数数组</param>

        public override DataSet ExecSqlReturnDataSet(string tablename, string procname, object[] parmas)

        ...{

            try

            ...{

                OracleParameter[] Oracleparmas = (OracleParameter[])parmas;

                this.PublicClass(procname, Oracleparmas);

                DataSet ds = new DataSet();

                using (OracleDataAdapter da = new OracleDataAdapter())

                ...{

                    da.SelectCommand = this.cmd;

                    da.Fill(ds, tablename);

                }

                return ds;


            }

            catch (Exception ex)

            ...{

                string e = ex.Message;

                throw;

            }

        }

    }

}

三、定义一个SQLSERVER连接类




using System;

using System.Collections.Generic;

using System.Text;

using System.Data;

using System.Data.SqlClient;

using System.Configuration;


//工厂模式连接数据库中的SQLSERVER数据库连接

namespace DBAccess

...{

    //数据连接的工厂模式SQLSERVER连接类

    internal class DBMSSOLServer : DBabstract

    ...{

        private SqlConnection conn = null;

        private SqlCommand cmd = null;


        //构造函数

        public DBMSSOLServer(string constring)

        ...{

            this.conn = new SqlConnection(constring);

        }


        //打开一个连接

        public override void Open()

        ...{

            if (this.conn != null && this.conn.State == ConnectionState.Closed)

            ...{

                this.conn.Open();

            }

        }


        //关闭一个连接

        public override void Close()

        ...{

            if (this.conn != null && this.conn.State == ConnectionState.Open)

            ...{

                this.conn.Close();

            }

        }


        //数据读取的公共数

        public override void PublicClass(string procname, object[] parmas)

        ...{

            SqlParameter[] SQLparmas = (SqlParameter[])parmas;

            this.cmd = new SqlCommand();

            this.cmd.Connection = this.conn;

            this.cmd.CommandType = CommandType.StoredProcedure;

            this.cmd.CommandText = procname;

            if (this.cmd.Parameters.Count > 0)

            ...{

                this.cmd.Parameters.Clear();

            }

            if(SQLparmas != null && SQLparmas.Length > 0 )

            ...{

                foreach (SqlParameter p in SQLparmas)

                ...{

                    this.cmd.Parameters.Add(p);

                }

            }

        }


        //执行无返回DataSet的函数

        public override string Execsql(string procname, object[] parmas)

        ...{

            try

            ...{

                SqlParameter[] SQLparmas = (SqlParameter[])parmas;

                this.Open();

                this.PublicClass(procname, SQLparmas);

                int var = this.cmd.ExecuteNonQuery();

                this.cmd.Parameters.Clear();

                this.Close();

                return Convert.ToString(var);

            }

            catch (Exception ex)

            ...{

                string e = ex.Message;

                this.Close();

                throw;

            }

        }


        //执行有返回DataSet的函数

        public override DataSet ExecSqlReturnDataSet(string tablename, string procname, object[] parmas)

        ...{

            try

            ...{

                SqlParameter[] SQLparmas = (SqlParameter[])parmas;

                this.PublicClass(procname, SQLparmas);

                DataSet ds = new DataSet();

                using (SqlDataAdapter da = new SqlDataAdapter())

                ...{

                    da.SelectCommand = this.cmd;

                    da.Fill(ds, tablename);

                }

                return ds;


            }

            catch (Exception ex)

            ...{

                string e = ex.Message;

                throw;

            }

        }

    }

}

四、创建工厂




using System;

using System.Collections.Generic;

using System.Text;

using System.Data;


//工厂类,数据连接类生成器

namespace DBAccess

...{

    public class FactoryClass

    ...{

        //数据库连接工厂生成器

        //<param name="constring">数据库连接字符串</param>

        public DBabstract GetDB(string constring,string MyDBType)

        ...{

            if (MyDBType == "Oracle")

            ...{

                return new DBOracle(constring);

            }

            else if (MyDBType == "MSSQLSERVER")

            ...{

                return new DBMSSOLServer(constring);

            }

            else if (MyDBType == "ACCESS")

            ...{

                return new DBMSAccess(constring);

            }

            else

            ...{

                return null;

            }

        }

    }

}

B、生成解决方案,产生DLL

C、在另外的工程中引用上面产生的DLL

D、使用DLL连接数据库,输入数据




using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Data.OracleClient;


namespace FeatureInfo

...{

    public partial class frmRead : Form

    ...{

        public frmRead()

        ...{

            InitializeComponent();

        }


        private DBAccess.FactoryClass fac = null;

        private DBAccess.DBabstract dba = null;


        private void frmRead_Load(object sender, EventArgs e)

        ...{

            fac = new DBAccess.FactoryClass();


            dba = fac.GetDB(System.Configuration.ConfigurationSettings.AppSettings["Oracle"], "Oracle");

        }


        private void GetClient(MapXLib.Feature ftr)   //因是针对MapX开发,所以有这个参数

        ...{

            MapXLib.Feature fftr = ftr;                   //定义一个MapX图元对象

            string ftrid = fftr.KeyValue;                   //取值

            map.Layers[this.layername].KeyField = "EquipID";

            MapXLib.Feature eftr = ftr;

            string eqid = eftr.KeyValue;

            map.Layers[this.layername].KeyField = "ShortName";

            MapXLib.Feature sftr = ftr;

            string shortname = sftr.KeyValue;

            map.Layers[this.layername].KeyField = "FtrID";


            //创建OracleParameter数组

            OracleParameter[] parmas = new OracleParameter[3] ...{

                        new OracleParameter("nftr",OracleType.VarChar,13),

                        new OracleParameter("neqid",OracleType.VarChar,50),

                        new OracleParameter("nshortname",OracleType.VarChar,14)

                    };

            if (ftrid != null)

            ...{

                parmas[0].Value = ftrid;

            }

            else

            ...{

                parmas[0].Value = DBNull.Value;

            }

            if (eqid != null)

            ...{

                parmas[1].Value = eqid;

            }

            else

            ...{

                parmas[1].Value = DBNull.Value;

            }

            if (shortname != null)

            ...{

                parmas[2].Value = shortname;

            }

            else

            ...{

                parmas[2].Value = DBNull.Value;

            }


            string t = dba.Execsql("pro_insertClient", (object[])parmas);  

//执行输入操作,将OracleParameter数组强制转换成Object数组做为参数传入函数

        }

    }

}


文章出处:http://www./course/7_databases/database_other/2008410/110019.html



   

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多