文章收藏-FAQ 位置:电脑学习网

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

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

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存储过程的示例。

     [文章来源:“十万个为什么”电脑学习网]
     [网络地址:http://why100000.com]
     [版权声明:除本站部分特别声明禁止转载的专稿外,其他的文章可以自由转载,但请务必注明出处和原始作者。本站文章版权归文章原作者所有。如果本站转载的文章有版权问题请联系本站,我们会尽快予以更正。]
 

【字体:[大] [中] [小] 【加入收藏】 【发表评论】 【关闭本窗口】

Copyright © “十万个为什么”电脑学习网 2000-2007 陕ICP备06007929号
站务联系:MSN & Email:zhangking2008@gmail.com  QQ:9365822