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

访问|数据

在编写数据访问层代码时,总要一边又一边的重复编写:读数据库连接字符串,建立数据库连接对象,打开连接,创建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,返回单值结果(如:查询合计)……

时间: 2024-08-03 10:38:14

为数据访问层编写一个基类的相关文章

如何编写一个ASP类

前几天大佛写了"ASP设计模式",可能有些初学者或者刚刚接触ASP的朋友不一定完全看得明白,偶就整理了一下编写一个ASP类的方法,大部分是从网上找来的.希望对朋友们有帮助. <ASP设计模式>(作者 我佛山人): 首先ASP的类是由事件和方法(它们就是构成类的成员了)构成的,如果大家还没有接触过,可以先看看下面的说明:在 Class 块中,成员通过相应的声明语句被声明为 Private(私有成员,只能在类内部调用) 或 Public(公有成员,可以在类内外部调用) .被声明

面向对象-如何用数组存放一个基类派生的多种派生类?

问题描述 如何用数组存放一个基类派生的多种派生类? 我写了一个基类,用其派生了多个派生类, 接着我生成一个基类数组,再在程序里按输入情况对应将每个数组成员变成派生类, 请问这样如何实现? 我试过 p[i]=new student; 但是说i不能是变量 解决方案 vector list 解决方案二: 为啥不用list,有封装好的方法 解决方案三: 用list vector等支持存放指针的数组 然后你存入基类类型指针 用多态方式处理 解决方案四: p[i]得是指针数组呦

如何编写一个ASP类_ASP CLASS类

前几天大佛写了"ASP设计模式",可能有些初学者或者刚刚接触ASP的朋友不一定完全看得明白,偶就整理了一下编写一个ASP类的方法,大部分是从网上找来的.希望对朋友们有帮助.  <ASP设计模式>(作者 我佛山人): dispbbs.asp?boardID=20&ID=247879 首先ASP的类是由事件和方法(它们就是构成类的成员了)构成的,如果大家还没有接触过,可以先看看下面的说明: 在 Class 块中,成员通过相应的声明语句被声明为 Private(私有成员,

《Programming WPF》翻译 第9章 2.选择一个基类

WPF提供了很多类,当创建一个自定义元素时,你可以从这些类中派生.图9-1显示了一组可能作为类 --可能是合适的基类,并且说明了他们之间的继承关系.注意到,这决不是完整的继承关系图,只是简 单的显示了一些你应该考虑的可能的基类. 无论你选择了哪一个基类,你的元素都会直接或间接地从FrameworkElement派生.这将提供routing事 件,高级属性处理,动画,数据绑定,外观上的支持,样式,以及逻辑树的集成. 派生于FrameworkElement并不是绝对的需要.第7章讨论了底层可视化图形

YY了一个消息处理基类

当我们要进行消息处理的时候,通常需要写出一系列的消息函数,然后再将这些函数指针赋值给一个函数指针数组.当要使用的时候,根据消息编号确定在数组中的位置. 在C++中,成员函数指针写着很不顺手..于是做了一个基类..这个基类有个限制,就是只能处理两个参数的消息处理函数. 第一个是消息ID,第二个就是消息内容.不过多数情况下已经够用...   #include "stdafx.h"      #include <iostream>      #include <stdio.

如何设计一个编辑窗体的基类

为什么我们需要一个编辑的基类呢? 我们发现对于编辑窗体而言,它们的工作基本的流程是大同小异,而且编辑窗体中每次都需要增加按键处理.是否有编辑内容未保存等提示,因此我们需要一个基类来把这些基本的事情完成. 下面,我们看看是如何实现这个基类的. 通用界面与基本的流程 通用的界面 我们的编辑界面通常是在一个列表界面中,通过点击添加或者编辑按钮,打开一个编辑窗体,他们通常长成下面的这个样子: 基本的流程 我们总结一下基本的流程是下面这样的: 基类的基本实现 构造函数 public EditFormBas

ASP.NET中基类页的设计和使用

在Asp.net业务系统的开发过程中,为了保证页面风格的一致性以及减少重复代码的编写,我们需要引入基类页的概念,即:定义一个基类页,让所有的页面都继承这个基类,并在该基类页中加入公用的属性和方法. 实际使用时,按照功能页面划分,可以定义多个基类页,如: class FormBase class BizFormBase :FormBase class ViewFormBase : BizFormBase class EditFormBase : BizFormBase class QueryFor

详解C++中基类与派生类的转换以及虚基类_C 语言

C++基类与派生类的转换 在公用继承.私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中全部都按原样保留下来了,在派生类外可以调用基类的公用成员函数访问基类的私有成员.因此,公用派生类具有基类的全部功能,所有基类能够实现的功能, 公用派生类都能实现.而非公用派生类(私有或保护派生类)不能实现基类的全部功能(例如在派生类外不能调用基类的公用成员函数访问基类的私有成员).因此,只有公用派生类才是基类真正的

艾伟_转载:Socket开发探秘--基类及公共类的定义

Socket开发是属于通信底层的开发,.NET也提供了非常丰富的类来实现Socket的开发工作,本篇不是介绍这些基础类的操作,而是从一个大的架构方面阐述Socket的快速开发工作,本篇以TCP模式进行程序的开发介绍,以期达到抛砖引玉的目的. 要掌握或者了解Socket开发,必须了解下面所述的场景及知识. 1.TCP客户端,连接服务器端,进行数据通信 2.TCP服务器端,负责侦听客户端连接 3.连接客户端的管理,如登陆,注销等,使用独立线程处理 4.数据接收管理,负责数据的接受,并处理队列的分发,