zoukankan      html  css  js  c++  java
  • 把数据访问层写成一个基类

    在编写数据访问层代码时,总要一边又一边的重复编写:读数据库连接字符串,建立数据库连接对象,打开连接,创建Command对象,创建数据适配器,创建数据集,填充数据集,关闭连接。这种重复的代码写一两次到还行,写多了就免不了有一些烦了。 
      在总结以前的代码以后,决定重构数据方法层的代码。数据访问层无非进行两种操作:查询返回DataTable,进行插入、更新、删除等无返回值的操作。只要增加一个数据访问层基类包含这些繁琐的代码,其余的数据访问层代码继承数据访问层基类,在调用基类函数时给出存储过程名称和存储过程参数即可。  
    数据访问层基类代码: 
    using System; 
    using System.Data; 
    using System.Collections;  
    using System.Data.SqlClient; 
    namespace DAL 

     /// <summary> 
     /// DALBase 的摘要说明。 
     /// 数据层访问基类,定义数据层访问公共的变量,方法 
     /// </summary> 
     public class DALBase 
     { 
      //定义该类共用变量 
      private SqlConnection conn;  // 
      private SqlCommand mycm;  // 
      private DataSet myds;   // 
      private SqlDataAdapter myda; // 
       
      /// <summary> 
      /// 从web.config中读取数据库连接字符串 
      /// </summary> 
      private string CONNSTR = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]; 
      public DALBase() 
      { 
       //构造函数,创建对象实例 
       conn = new SqlConnection(CONNSTR); 
       mycm = conn.CreateCommand(); 
       myds = new DataSet(); 
       myda = new SqlDataAdapter(); 
      } 
      /// <summary> 
      /// 通过存储过程返回查询表的信息 
      /// </summary> 
      /// <param name="sprocName">存储过程名称</param> 
      /// <returns>DataTable</returns> 
      protected DataTable GetTable(string sprocName) 
      { 
       conn.Open(); 
       try 
       { 
        mycm.CommandText = sprocName; 
        mycm.CommandType = CommandType.StoredProcedure; 
        myda.SelectCommand = mycm; 
        myda.Fill(myds); 
       } 
       finally 
       { 
        //无论语句执行正确与否,都关闭连接释放资源 
        conn.Close(); 
       } 
       return myds.Tables[0]; 
      } 
      /// <summary> 
      /// 通过存储过程和参数返回查询表的信息 
      /// </summary> 
      /// <param name="sprocName"></param> 
      /// <param name="parameters"></param> 
      /// <returns></returns> 
      protected DataTable GetTable(string sprocName, SqlParameter[] parameters) 
      { 
       conn.Open(); 
       try 
       { 
        mycm.CommandText = sprocName; 
        mycm.CommandType = CommandType.StoredProcedure; 
        SqlParameterCollection sqlParams = mycm.Parameters; 
        //先清空原有的参数 
        mycm.Parameters.Clear(); 
        //给Command添加参数 
        foreach ( SqlParameter parameter in parameters ) 
        { 
         mycm.Parameters.Add( parameter ); 
        } 
        myda.SelectCommand = mycm; 
        myda.Fill(myds); 
       } 
       finally 
       { 
        //无论语句执行正确与否,都关闭连接释放资源 
        conn.Close(); 
       } 
       return myds.Tables[0]; 
      } 

      /// <summary> 
      /// 通过存储过程及存储过程参数执行对数据库无返回值的操作(如:新增,更新,删除等) 
      /// </summary> 
      /// <param name="sprocName">存储过程名称</param> 
      /// <param name="parameters">存储过程参数</param> 
      protected void SaveTale(string sprocName, SqlParameter[] parameters) 
      { 
       mycm.CommandText = sprocName;  
       mycm.CommandType = CommandType.StoredProcedure;  
       SqlParameterCollection sqlParams = mycm.Parameters; 
       //先清空原有的参数 
       mycm.Parameters.Clear(); 
       //给Command添加参数 
       foreach ( SqlParameter parameter in parameters ) 
       { 
        mycm.Parameters.Add( parameter ); 
       } 
       //打开连接 
       conn.Open(); 
       try 
       { 
        //执行 
        mycm.ExecuteNonQuery();  
       } 
       finally 
       { 
        //关闭连接 
        conn.Close(); 
       } 
      } 
     } 

    数据访问层代码: 
    using System; 
    using System.Data; 
    using System.Collections;  
    using System.Data.SqlClient; 
    namespace DAL 

     public class Test : DALBase 
     { 
      public Test() 
      { 
      } 
      public DataTable GetTestTable() 
      { 
        return base.GetTable("存储过程名称"); 
      } 
      public DataTable GetTestTableByXName(string XName) 
      { 
          SqlParameter[] parameters = { new SqlParameter( "@XName",SqlDbType.NVarChar,10 ) };   
          return base.GetTable("存储过程名称",parameters); 
      } 

      public void AddTestTable(string XName, string Description) 
      { 
       SqlParameter[] parameters =  
       { 
        new SqlParameter( "@XName",SqlDbType.NVarChar,10 ), 
        new SqlParameter( "@Description",SqlDbType.NVarChar,100) 
       }; 
      
       //设置参数值 
       parameters[0].Value = XName; 
       parameters[1].Value = Description; 
       base.SaveTale("存储过程名称",parameters); 
      } 
     } 

    大家有兴趣还可以帮忙扩充一下这个基类,比如增加通过SQL语句返回DataTable,返回单值结果(如:查询合计)…… 
  • 相关阅读:
    Django开发个人博客网站
    Photoshop界面字体太小解决方案
    [Leetcode]第三题:无重复字符最长子串
    web网站服务(1)
    备份与恢复笔记和实验
    oracle事物和常用数据库对象笔记和实验
    Oracle配置管理实验
    Oracle配置管理笔记
    Oracle体系结构和用户管理实验
    Oracle数据库部署
  • 原文地址:https://www.cnblogs.com/yhb199/p/1234054.html
Copyright © 2011-2022 走看看