首页 > 开发 > 综合 > 正文

为数据访问层编写一个基类

2024-07-21 02:22:57
字体:
来源:转载
供稿:网友
在编写数据访问层代码时,总要一边又一边的重复编写:读数据库连接字符串,建立数据库连接对象,打开连接,创建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,返回单值结果(如:查询合计)……
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表