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

用工厂模式开发多数据库连接类,是工厂模式最好的应用方式,也是很多初级使用设计模式的程序员都会涉及到的,下面是具体代码:
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的函数
// 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数据库执行查询的数据集返回的示例 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值