控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

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

作者:未知 出处:不详 2010年02月02日 阅读:

用工厂模式开发多数据库连接类,是工厂模式最好的应用方式,也是很多初级使用设计模式的程序员都会涉及到的,下面是具体代码:
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数组做为参数传入函数
    }
  }
}
因为当前的要求只是输入数据,所以只写了一个执行insert存储过程的示例。
                                                           
                                                            【注:本文由控件中国网转载】

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统