【转自8miu】用工厂模式开发多数据库连接类

it2022-05-09  28

用工厂模式开发多数据库连接类,是工厂模式最好的应用方式,也是很多初级使用设计模式的程序员都会涉及到的,下面是具体代码: 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的函数 // // 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的函数 // // // 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 ...{ //数据库连接工厂生成器 // 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数组做为参数传入函数 } } } 因为当前的要求只是输入数据,所以只写了一个执行insert存储过程的示例,下次将提供C#连接Oracle数据库执行查询的数据集返回的示例

转载于:https://www.cnblogs.com/feima-lxl/archive/2008/03/31/1130933.html


最新回复(0)