李建忠老师在讲座中,谁容易变化就把谁拿出来
由于以前我写了好几类分别对应的不用数据库
现在把它们都抽象出来,但是不知道这样是不是对
现在把代码贴出来大家一个讨论一下
听了李建的设计模式之后,也按李老师的相法去写,但是不知道自己写得哪一种模式
由于我的个人原因吧,接触到项目少,所以在听完之后也没有去做相应的练习吧
望各位多我指点吧
下面是代码是我把几个以前写的类有Oledb,sql,Oracle等几个操作数据常的几种方法抽象出来了.
using System; using System.Collections.Generic; using System.Text; using System.Data; namespace LiaoHaiBing.Data ... { public abstract class DatabaseFactoy ...{ //数据连接 public abstract IDbConnection Connection...{get;} //建立Command对象 public abstract IDbCommand Command(); //建立Command对象 public abstract IDbCommand Command(string executeString); //返回受影响得行数 public abstract int ExecuteNonQuery(string executeString); //返回首行首列的值 public abstract object ExecuteScalar(string executeString); //返回只读数据 public abstract IDataReader ExecuteReader(string executeString); //返回一个DataTable public abstract DataTable GetDataTable(string executeString); //返回一个DataSet public abstract DataSet GetDataSet(string executeString); }} SqlDatabase 数据操作类,是对sql数据进行常操作的几个方法 using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.SqlClient; namespace LiaoHaiBing.Data ... { public class SqlDatabase : DatabaseFactoy ...{ //连接数据库字符串 string _connectionString = ConnectionString.connectionString.DataBaseConnectionString; private static SqlDatabase _sqlDatabase; public static SqlDatabase sqlDatabase ...{ get ...{ if (_sqlDatabase == null) ...{ _sqlDatabase = new SqlDatabase(); } return _sqlDatabase; } } public override IDbConnection Connection ...{ get ...{ SqlConnection cn = new SqlConnection(_connectionString); try ...{ cn.Open(); return cn; } catch ...{ throw new Exception("创建数据连接时出现在错误"); } } } public override IDbCommand Command() ...{ SqlConnection cn = (SqlConnection)this.Connection; SqlCommand cmd = new SqlCommand(); try ...{ if (cn == null) ...{ throw new Exception("创建数据连接时出现在问题."); } else ...{ cmd.Connection = cn; return cmd; } } catch ...{ throw new Exception("创建命令对象时出现在问题."); } } public override IDbCommand Command(string executeString) ...{ SqlConnection cn = (SqlConnection)Connection; SqlCommand cmd = new SqlCommand(); try ...{ if (cn == null) ...{ throw new Exception("创建数据连接时出现在问题."); } else ...{ cmd.Connection = cn; cmd.CommandText = executeString; return cmd; } } catch ...{ throw new Exception("创建命令对象时出现在问题."); } } public override int ExecuteNonQuery(string executeString) ...{ SqlCommand cmd = (SqlCommand)Command(executeString); try ...{ return cmd.ExecuteNonQuery(); } catch (SqlException se) ...{ throw new Exception("在执行操作时出现在问题," + se.Message); } finally ...{ cmd.Connection.Dispose(); cmd.Connection.Close(); cmd.Dispose(); } } public override DataTable GetDataTable(string executeString) ...{ SqlConnection cn = (SqlConnection)Connection; SqlDataAdapter sda; try ...{ sda = new SqlDataAdapter(executeString, cn); DataTable dt = new DataTable(); sda.Fill(dt); return dt; } catch ...{ throw new Exception("填充数据时发生错误。"); } finally ...{ cn.Dispose(); cn.Close(); } } public override DataSet GetDataSet(string executeString) ...{ SqlConnection cn = (SqlConnection)Connection; SqlDataAdapter sda; try ...{ sda = new SqlDataAdapter(executeString, cn); DataSet ds = new DataSet(); sda.Fill(ds); return ds; } catch ...{ throw new Exception("填充数据集时出现错误。"); } finally ...{ cn.Dispose(); cn.Close(); } } public override object ExecuteScalar(string executeString) ...{ SqlCommand cmd = (SqlCommand)Command(executeString); try ...{ return cmd.ExecuteScalar(); } catch (SqlException se) ...{ throw new Exception("你的sql语句有问题," + se.Message); } finally ...{ cmd.Connection.Dispose(); cmd.Connection.Close(); cmd.Dispose(); } } public override IDataReader ExecuteReader(string executeString) ...{ SqlCommand cmd = (SqlCommand)Command(executeString); try ...{ return cmd.ExecuteReader(CommandBehavior.CloseConnection); } catch (SqlException se) ...{ throw new Exception("在读取数据的时问题了, " + se.Message); } finally ...{ cmd.Dispose(); } } }}OleDbDatabase 数据操作类,是对Access数据进行常规操作的几个方法
using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.OleDb; namespace LiaoHaiBing.Data.OleDb ... { public class OleDbDatabase : DatabaseFactoy ...{ string _connectionString = ConnectionString.connectionString.DataBaseConnectionString; private static OleDbDatabase _oleDbDatabase; public static OleDbDatabase oleDbDatabase ...{ get ...{ if (_oleDbDatabase == null) ...{ _oleDbDatabase = new OleDbDatabase(); } return _oleDbDatabase; } } public override IDbConnection Connection ...{ get ...{ OleDbConnection cn = new OleDbConnection(_connectionString); try ...{ cn.Open(); return cn; } catch(OleDbException ee) ...{ throw new Exception("创建数据连接时出现在错误" + ee.Message); } } } public override IDbCommand Command() ...{ IDbConnection cn = this.Connection; IDbCommand cmd = new OleDbCommand(); try ...{ if (cn == null) ...{ throw new Exception("创建数据连接时出现在问题."); } else ...{ cmd.Connection = cn; return cmd; } } catch ...{ throw new Exception("创建命令对象时出现在问题."); } } public override IDbCommand Command(string executeString) ...{ IDbConnection cn = this.Connection; IDbCommand cmd = new OleDbCommand(); try ...{ if (cn == null) ...{ throw new Exception("创建数据连接时出现在问题."); } else ...{ cmd.Connection = cn; cmd.CommandText = executeString; return cmd; } } catch ...{ throw new Exception("创建命令对象时出现在问题."); } } public override int ExecuteNonQuery(string executeString) ...{ IDbCommand cmd = this.Command(executeString); try ...{ return cmd.ExecuteNonQuery(); } catch (OleDbException se) ...{ throw new Exception("在执行操作时出现在问题," + se.Message); } finally ...{ cmd.Connection.Dispose(); cmd.Connection.Close(); cmd.Dispose(); } } public override IDataReader ExecuteReader(string executeString) ...{ IDbCommand cmd = this.Command(executeString); try ...{ return cmd.ExecuteReader(CommandBehavior.CloseConnection); } catch (OleDbException se) ...{ throw new Exception("在读取数据的时问题了, " + se.Message); } finally ...{ //cmd.Dispose(); } } public override object ExecuteScalar(string executeString) ...{ IDbCommand cmd = this.Command(executeString); try ...{ return cmd.ExecuteScalar(); } catch (OleDbException se) ...{ throw new Exception("你的sql语句有问题," + se.Message); } finally ...{ cmd.Connection.Dispose(); cmd.Connection.Close(); cmd.Dispose(); } } public override DataTable GetDataTable(string executeString) ...{ OleDbConnection cn = (OleDbConnection)Connection; OleDbDataAdapter sda; try ...{ sda = new OleDbDataAdapter(executeString,cn); DataTable dt = new DataTable(); sda.Fill(dt); return dt; } catch ...{ throw new Exception("填充数据时发生错误。"); } finally ...{ cn.Dispose(); cn.Close(); } } public override DataSet GetDataSet(string executeString) ...{ OleDbConnection cn = (OleDbConnection)Connection; OleDbDataAdapter sda; try ...{ sda = new OleDbDataAdapter(executeString, cn); DataSet ds = new DataSet(); sda.Fill(ds); return ds; } catch ...{ throw new Exception("填充数据集时出现错误。"); } finally ...{ cn.Dispose(); cn.Close(); } } }}如果你要数据以前是Access的,用得时候只要LiaoHaiBing.Data.DatabaseFactoy db = new OleDbDatabase() 就行了,不用 OleDbDatabase db = new OleDbDatabase() 这样了,如果这样的话,那不用那个抽象也可以了现在就是如果当你的数据由Access变成Sql了的话,只需将LiaoHaiBing.Data.DatabaseFactoy db = new OleDbDatabase() 改一成 LiaoHaiBing.Data.DatabaseFactoy db = new SqlDatabase() 就行了其它的什么也都不用改这样用起来是不是好放便多了呢。当然这两个数据库当中表的结构要一样,要不能的话会出问题。
