/**//* --作者:二泉 --日期:2004-6-3 --版本:0.1 --说明:1、类工厂 DbFactory 根据不同的 数据库类型 返回不同类型的 IDbConnection、IDbCommand 对象 --函数介绍: 欢迎免费使用,有问题至 erquan@126.com。 版本历史: 1、2004-6-3 下午 开始编写。 2、2004-6-3 20:00 前完成 类工厂、数据访问层、逻辑层和表示层的代码 3、2004-6-3 20:00 只完成了 数据访问层 中 SqlDR 的两个重载方法。 4、2004-6-4 下午:完成 数据访问层中 SqlDS、SqlNonQuery 4 个重载方法。 5、2004-6-4 下午:对类代码每句加上注释,函数的头说明,排版 等琐碎工作。 6、2004-6-5 上午:根据重载参数最多的函数,去掉两个函数。 7、2004-6-5 晚上:以标准的 XML 格式进行函数的注释。*/ using System; using System.Data; using System.Data.SqlClient; using System.Data.OleDb; //using System.Data.OracleClient; /**////-----------------------------------下面开始 数据层 类工厂 的定义---------------------------- ///定义一个 枚举 连接类型 public enum ConnectionType{ Sql = 1, //SqlServer Oracle = 2, //Oracle OleDb = 3 //其它。 } /**////定义一个对连接对象的实例工厂。 ///根据 CoonectionType 的不同,返回 类型 不同的 IDbConnection、IDbCommand 对象 public class DbFactory{ private ConnectionType _type;/**////私有的连接 枚举 类型 private String _strConn; //连接字符串 /**////定义 连接类型枚举 属性 public ConnectionType type{ set{ this._type = value; } } /**////定义 连接字符串 属性 public String strConn{ set{ this._strConn = value; } } /**////以 单态模式 实例化本类 private static DbFactory _df = null; /**////实例化入口 public static DbFactory Instance(){ if(_df==null){ _df = new DbFactory(); } return _df; }/**////end DbFactory Instance() private DbFactory(){} //------------------------------------------------------------------------------------------------------ public IDbConnection CreateConnection(){ IDbConnection conn = null; switch(this._type){ /**////如果是 MSSQL,则返回 SqlConnection case ConnectionType.Sql:{ conn = new SqlConnection(); break; } /**////如果是 Oracle,则返回 OracleConnection //case ConectionType.Oracle:{ // conn = new OracleConnection(); // break; //} /**////如果 是其他,则返回 OleDbConnction; case ConnectionType.OleDb:{ conn = new OleDbConnection(); break; } } /**////连接字符串。 conn.ConnectionString = this._strConn; return conn; }/**////End IDbConnection CreateConnection()//------------------------------------------------------------------------------------------------------ public IDbCommand CreateCommand(){ /**////声明一个 IDbCommand 接口。 IDbCommand cmd = null; switch(this._type){ /**////如果为 MSSQL case ConnectionType.Sql:{ cmd = CreateConnection().CreateCommand(); break; } /**////如果为 Oracle /**//* case ConnectionType.Oracle:{ cmd = CreateConnection().CreateCommand(); break; } */ /**////如果为 其他。 case ConnectionType.OleDb:{ cmd = CreateConnection().CreateCommand(); break; } } return cmd; }/**////End IDbCommand CreateCommand() } //---------------------------------- 定义 数据层 类工厂 结束----------------------------- //************************************下面 再开始定义 数据层 类(MSSQL)************************ /**////是基于 MSSQL 的 逻辑层 的父类 public class SqlAccess{ /**////定义全局的 SQL,在 逻辑层 中的类要用到。 protected string Sql = null; /**////根据 类工厂,返回 类工厂 实例。 private DbFactory df(){ /**////实例一个类工厂 DbFactory df = DbFactory.Instance(); /**////选择 数据库 类型。 df.type = ConnectionType.Sql; /**////修改 数据连接字符串 df.strConn = "Server=(local);uid=sa;pwd=sa;database=Northwind"; /**////返回 数据工厂 实例 return df; }/**////end DbFactory df() public SqlAccess(){} //SqlCommand conn = null; SqlCommand cmd = null;//------------------------------------------------------------------------------------------------------ /**//// 返回 SqlDataReader 对象的基础函数 /// <summary> /// 执行SQL命令,返回 SqlDataReader 对象 /// </summary> /// <param name="sql"> SQL 语句 </param> /// <param name="CmdType"> SQL 类型</param> /// <param name="cmdParams">参数集合数组</param> /// <returns> SqlDataReader 对象</returns> protected SqlDataReader SqlDR(String sql,CommandType CmdType,params SqlParameter[] cmdParams) { /**////创建 SqlCommand 对象 cmd = (SqlCommand)this.df().CreateCommand(); try{ /**////填充 Command 对象。 this.PrepareCommand(cmd,sql,CmdType,cmdParams); /**//// 返回 SqlDataReader,同时 关闭 Connection!切记!! SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); /**////清空 Command.Parameters cmd.Parameters.Clear(); /**////返回 SqlDataReader return dr; }catch{ /**////异常时抛出且关闭连接。 cmd.Connection.Close(); throw; } }/**//// end SqlDR(String sql,CommandType CmdType,params SqlParameter[] cmdParams)//------------------------------------------------------------------------------------------------------ /**//// <summary> /// 执行SQL命令,只能是 T-SQL,不能是存储过程,返回 SqlDataReader 对象 /// </summary> /// <returns> SqlDataReader 对象</returns> protected SqlDataReader SqlDR() { return SqlDR(this.Sql,CommandType.Text,null); }/**////end SqlDR()//------------------------------------------------------------------------------------------------------ /**//// <summary> /// 执行SQL命令,返回 SqlDataReader 对象 /// </summary> /// <param name="CmdType"> SQL 类型</param> /// <param name="cmdParams">参数集合数组</param> /// <returns> SqlDataReader 对象</returns> protected SqlDataReader SqlDR(CommandType CmdType,params SqlParameter[] cmdParams) { return SqlDR(this.Sql,CmdType,cmdParams); }/**//// end SqlDR(CommandType CmdType,params SqlParameter[] cmdParams)//------------------------------------------------------------------------------------------------------ /**//// <summary> /// 填充 SqlCommand 对象的 Parametes /// </summary> /// <param name="cmd"> SqlCommand 对象 </param> /// <param name="Sql"> SQL 语句 </param> /// <param name="CmdType"> SQL 的类型 </param> /// <param name="cmdParams"> 参数集合数组 </param> protected void PrepareCommand(SqlCommand cmd,string Sql,CommandType CmdType,params SqlParameter[] cmdParams) { /**////如果已经打开,则不再进行 打开连接 操作。 if(cmd.Connection.State!=ConnectionState.Open) cmd.Connection.Open(); /**////设置要 运行的文本,可能 为 SQL 或 SP cmd.CommandText = Sql; /**////设置运行的类型 cmd.CommandType = CmdType; if(cmdParams!=null){ foreach(SqlParameter param in cmdParams){ /**////填充 cmd.Parameters 属性 cmd.Parameters.Add(param); } } }/**////end PrepareCommand(SqlCommand cmd,string Sql,CommandType CmdType,params SqlParameter[] cmdParams)//------------------------------------------------------------------------------------------------------ /**//// <summary> /// 加上 事务 标志,填充 SqlCommand 对象的 Parametes /// </summary> /// <param name="cmd"> SqlCommand 对象 </param> /// <param name="Sql"> SQL 语句 </param> /// <param name="tran"> 事务 </param> /// <param name="CmdType"> SQL 的类型 </param> /// <param name="cmdParams"> 参数集合数组 </param> protected void PrepareCommand(SqlCommand cmd,string Sql,SqlTransaction tran,CommandType CmdType,params SqlParameter[] cmdParams) { /**////如果已经打开,则不再进行 打开连接 操作。 if(cmd.Connection.State!=ConnectionState.Open) cmd.Connection.Open(); /**////设置要 运行的文本,可能 为 SQL 或 SP cmd.CommandText = Sql; /**////设置运行的类型 cmd.CommandType = CmdType; /**////设置事务 //if(tran!=null) cmd.Transaction = cmd.Connection.BeginTransaction(); if(cmdParams!=null){ foreach(SqlParameter param in cmdParams){ /**////填充 cmd.Parameters 属性 cmd.Parameters.Add(param); } } }/**////end PrepareCommand(SqlCommand cmd,string Sql,SqlTransaction tran,CommandType CmdType,params SqlParameter[] cmdParams)//------------------------------------------------------------------------------------------------------ /**////返回 SqlCommand 对象。 ///以便 逻辑层 里可以通过 SqlCommand 对象返回 SqlParameter 里的值。 /// <summary> /// 加上 事务 标志,填充 SqlCommand 对象的 Parametes /// </summary> /// <param name="cmd"> SqlCommand 对象 </param> /// <param name="Sql"> SQL 语句 </param> /// <param name="tran"> 事务 </param> /// <param name="CmdType"> SQL 的类型 </param> /// <param name="cmdParams"> 参数集合数组 </param> /// <returns> SqlCommand 对象 </returns> protected SqlCommand SqlCmd(CommandType CmdType,params SqlParameter[] cmdParams) { /**////创建 SqlCommand 对象 cmd = (SqlCommand)this.df().CreateCommand(); /**////填充 SqlCommand.Parameters 集合 this.PrepareCommand(cmd,Sql,CmdType,cmdParams); /**////返回 SqlCommand 对象 return cmd; }/**////end SqlCmd(CommandType CmdType,params SqlParameter[] cmdParams)//----------------------------------------------------------------------------------------------------------- /**////返回一个表的 DataSet 的基础函数 /// <summary> /// 执行SQL命令,返回 DataSet 对象 /// </summary> /// <param name="sql"> SQL 语句 </param> /// <param name="CmdType"> SQL 类型</param> /// <param name="cmdParams">参数集合数组</param> /// <returns> DataSet 对象</returns> protected DataSet SqlDS(string sql,CommandType CmdType,params SqlParameter[] cmdParams) { /**////创建 SqlCommand 对象 SqlCommand cmd = (SqlCommand)this.df().CreateCommand(); /**////定义 DataSet DataSet ds = new DataSet(); try { /**////填充 SqlCommand.Parameters 集合 this.PrepareCommand(cmd,sql,CmdType,cmdParams); /**////根据 SqlCommand 构造 SqlDataAdapter 对象 SqlDataAdapter sda = new SqlDataAdapter(cmd); /**////由于在父类中已经打开连接,所以 逻辑层 不需要再打开 //cmd.Connection.Open(); /**////填充 DataSet sda.Fill(ds); } catch { /**////异常时抛出 且 关闭连接!! cmd.Connection.Close(); throw; } finally { /**////关闭连接 cmd.Connection.Close(); } /**////返回 DataSet return ds; }/**////end SqlDS(string sql,CommandType CmdType,params SqlParameter[] cmdParams)//-------------------------------------------------------------------------------------------------------- /**//// <summary> /// 返回一个表的 DataSet 对象,只能根据 SQL,存储过程不行。 /// </summary> /// <returns> DataSet 对象</returns> protected DataSet SqlDS() { return this.SqlDS(this.Sql,CommandType.Text,null); }/**////end SqlDS()//----------------------------------------------------------------------------------------------------------- /**//// <summary> /// 根据 SQL,返回一个表的 DataSet 对象 /// </summary> /// <param name="CmdType"> SQL 类型</param> /// <param name="cmdParams">参数集合数组</param> /// <returns> DataSet 对象</returns> protected DataSet SqlDS(CommandType CmdType,params SqlParameter[] cmdParams) { return this.SqlDS(this.Sql,CmdType,cmdParams); }/**////end SqlDS(CommandType CmdType,params SqlParameter[] cmdParams)///---------------------------------------------------------------------------------------------------------- /// 返回 影响行数 的基础函数 /// <summary> /// 执行SQL命令而不返回查询数据,通常执行关于对数据源进行添加,删除,更新的操作 /// </summary> /// <param name="sql"> SQL 语句 </param> /// <param name="CmdType"> SQL 类型</param> /// <param name="cmdParams">参数集合数组</param> /// <returns> 返回受影响的行数 </returns> protected int SqlNonQuery(String sql,CommandType CmdType,params SqlParameter[] cmdParams) { /**////创建 SqlCommand 对象 SqlCommand cmd = (SqlCommand)this.df().CreateCommand(); /**////定义 变量 i int i = 0; try { /**////填充 SqlCommand 对象的 SqlParameters 集合 this.PrepareCommand(cmd,sql,CmdType,cmdParams); /**////执行 SQL,并返回 影响行数 i = cmd.ExecuteNonQuery(); /**////清空 Parameters 集合 cmd.Parameters.Clear(); } catch { /**////发生异常关闭连接且抛出。 cmd.Connection.Close(); throw; } finally { /**////关闭连接。 cmd.Connection.Close(); } /**////返回 影响行数 return i; }/**////End SqlNonQuery(String sql,CommandType CmdType,params SqlParameter[] cmdParams)///---------------------------------------------------------------------------------------------------------- /// <summary> /// 执行SQL命令而不返回查询数据,通常执行关于对数据源进行添加,删除,更新的操作 /// </summary> /// <returns> 返回受影响的行数 </returns> protected int SqlNonQuery() { return SqlNonQuery(this.Sql,CommandType.Text,null); }/**////end SqlNonQuery()///---------------------------------------------------------------------------------------------------------- /// <summary> /// 执行SQL命令而不返回查询数据,通常执行关于对数据源进行添加,删除,更新的操作 /// </summary> /// <param name="CmdType"> SQL 类型</param> /// <param name="cmdParams">参数集合数组</param> /// <returns> 返回受影响的行数 </returns> protected int SqlNonQuery(CommandType CmdType,params SqlParameter[] cmdParams) { return SqlNonQuery(this.Sql,CmdType,cmdParams); }/**////End SqlNonQuery(CommandType CmdType,params SqlParameter[] cmdParams) }/**////end class SqlAccess //************************************** 定义 数据层 结束*************************************************** //------------------------------- 下面 定义 逻辑层 ------------------------------ /**////操作 Northwind 数据中 Orders 表。 ///继承于 SqlAccess 类。 public class Orders:SqlAccess{ /**////构造函数私有化,必须能过 Instance 入口实例本类。 private Orders(){} /**////Orders 类的局部变量 private static Orders _orders = null; /**////实例化本类的入口,实现 单态模式 public static Orders Instance(){ if(_orders==null) _orders = new Orders(); return _orders; }//------------------------------------------------------------------------------------------------------ /**////返回 Orders 表的 DataReader public SqlDataReader OrderDR(){ /**////Sql 在 父类中已经定义。 this.Sql = "SELECT * FROM orders WHERE EmployeeID=@EmployeeID AND DATEDIFF(d,OrderDate,@OrderDate)>0"; SqlParameter[] prms = { //new SqlParameter("@EmployeeID",SqlDbType.VarChar,5), //new SqlParameter("@OrderDate",SqlDbType.DateTime) new SqlParameter("@EmployeeID",SqlDbType.VarChar,5,ParameterDirection.Input,true,0,0,"EmployeeID",DataRowVersion.Current,"5") ,new SqlParameter("@OrderDate",DateTime.Now.ToString()) }; //prms[0].Value = "5"; //prms[1].Value = DateTime.Now.ToString(); //返回 DataReader 数据流 return SqlDR(CommandType.Text,prms); }//------------------------------------------------------------------------------------------------------ /**////返回 Orders 表的 DataSet public DataSet OrderDS(){ /**////Sql 在 父类中已经定义。 this.Sql = "SELECT * FROM orders WHERE EmployeeID=@EmployeeID AND DATEDIFF(d,OrderDate,@OrderDate)>0"; SqlParameter[] prms = { new SqlParameter("@EmployeeID",SqlDbType.VarChar,5,ParameterDirection.Input,true,0,0,"EmployeeID",DataRowVersion.Current,"5"), new SqlParameter("@OrderDate",DateTime.Now.ToString()) }; return this.SqlDS(CommandType.Text,prms); }//------------------------------------------------------------------------------------------------------ /**////返回执行 存储过程 SalesByCategory 的数据流 public SqlDataReader SalesByCategoryDR(){ this.Sql = "SalesByCategory"; SqlParameter[] prms = { new SqlParameter("@CategoryName","Beverages"), new SqlParameter("@OrdYear","1998") }; return this.SqlDR(CommandType.StoredProcedure,prms); }//------------------------------------------------------------------------------------------------------ /**////返回 存储过程 sp_GetOutPutVal 的 OutPut 类型值 和 返回值。 public string GetOutPutVal(){ /**////设置 存储过程 。 this.Sql = "sp_GetOutPutVal"; SqlParameter[] prms = { new SqlParameter("ReturnValue",SqlDbType.Int), /**////该值为 ReturnValue new SqlParameter("@OrderID","10248"), new SqlParameter("@CustomerID",SqlDbType.VarChar,8) /**////该值为 Output 类型的值 }; /**////设置 ReturnValue prms[0].Direction = ParameterDirection.ReturnValue; /**//// 第 3 个参数为 Output 类型的值,所以需要指定 ParameterDirection prms[2].Direction = ParameterDirection.Output; SqlCommand cmd = this.SqlCmd(CommandType.StoredProcedure,prms); try{ string CustomerID = ""; cmd.ExecuteNonQuery(); /**////Output 类型值 if(cmd.Parameters.Contains("@CustomerID")) CustomerID = "Output 类型的值:"+cmd.Parameters["@CustomerID"].Value.ToString(); else CustomerID = "Output 类型的值:"+"无值"; /**////ReturnValue 值 if(cmd.Parameters.Contains("ReturnValue")) CustomerID += ","+"返回值为:"+cmd.Parameters["ReturnValue"].Value.ToString(); return CustomerID; } catch { cmd.Connection.Close(); throw; } finally { cmd.Connection.Close(); } } /**////新增记录,还未实现。 public int AddTest(){ this.Sql = "sp_addtest"; SqlParameter[] prms = { new SqlParameter("@a","") }; int i = this.SqlNonQuery(CommandType.StoredProcedure,prms); return i; } } //------------------------------- 定义 逻辑层 结束 ------------------------------ //******************************* 定义 表现层 *********************************** /**////显示 Orders 表数据。 public class OrdersClient{ /**////实例本 表现层 的逻辑类 private Orders _orders = Orders.Instance(); /**////在控制台中打印出数据。 ///在 aspx 中实际就是 DataBind() 的实现。 public void write(){//------------------------------------------------------------------------------------ SqlDataReader dr = _orders.OrderDR(); int i = 0; Console.WriteLine(""); while(dr.Read()){ i++; Console.WriteLine("{0,-20}{1,-30}",dr["CustomerID"].ToString(),dr["OrderDate"].ToString()); } dr.Close(); Console.WriteLine();//------------------------------------------------------------------------------------ /**////返回 执行存储过程 SalesByCategory 的返回结果 dr = _orders.SalesByCategoryDR(); i = 0; Console.WriteLine("ProductName----- ----TotalPurchase"); while(dr.Read()){ i++; Console.WriteLine("{0,-20}{1,-30}",dr["ProductName"].ToString(),dr["TotalPurchase"].ToString()); } dr.Close(); Console.WriteLine();//------------------------------------------------------------------------------------- /**////返回 存储过程 GetOutPutVal 的 Output 类型值 Console.WriteLine(_orders.GetOutPutVal()); Console.WriteLine();//------------------------------------------------------------------------------------- /**////根据 Orders 表的 DataSet 进行绑定 DataRowCollection rows = _orders.OrderDS().Tables[0].Rows; Console.WriteLine("客户ID------ ------订单日期"); for(i=0;i<rows.Count;i++) Console.WriteLine("{0,-20}{1,-30}",rows[i]["CustomerID"].ToString(),rows[i]["OrderDate"].ToString()); Console.WriteLine();/**////------------------------------------------------------------------------------------ Console.WriteLine(_orders.AddTest().ToString()); } public static void Main(){ OrdersClient oc = new OrdersClient(); oc.write(); } }