看到很多新人满世界大喊:跪求数据库访问类,想自己当初也是这么过来的,所以把自己写的分享出来,已经用在项目中了,当然是小的.有问题请高手斧正,针对access数据库,用sql的可以自己改,我想不是什么难事.完整代码如下:using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;
using System.Data;
using System.Data.OleDb;
/// <summary>
///DAL 的摘要说明
/// </summary>
public class DAL
{
    private static readonly string strcn = ConfigurationManager.ConnectionStrings["cnstr"].ConnectionString;
    /// <summary>
    /// 关闭打开的connection对象
    /// </summary>
    /// <param name="cn"></param>
    protected static void CloseCn(OleDbConnection conn)
    {
        if (conn.State == ConnectionState.Open)
        {
            conn.Close();
        }
    }    /// <summary>
    /// 返回一个datatable
    /// </summary>
    /// <param name="strsql"></param>
    /// <param name="pas"></param>
    /// <returns></returns>
    public static DataTable GetTable(string strsql,  params OleDbParameter[] pas)
    {
        using (OleDbConnection cn = new OleDbConnection(strcn))
        {
            OleDbDataAdapter da = new OleDbDataAdapter(strsql, cn);
            if(pas!=null)
                da.SelectCommand.Parameters.AddRange(pas);
            DataTable dt = new DataTable();
            try
            {
                da.Fill(dt);
                da.SelectCommand.Parameters .Clear ();
                return dt;
            }
            catch
            {
                CloseCn(cn);
                throw;
            }
        }
    }
    public static DataTable GetTable(string strsql)
    {
         return  GetTable(strsql, null);
    }
    /// <summary>
    /// 返回带分页功能的dataset,专为aspnetpager控件使用
    /// </summary>
    /// <param name="str">查询</param>
    /// <param name="pagesize">aspnetpager的pagesize属性值</param>
    /// <param name="currenpage">aspnetpager的当前页属性值</param>
    /// <returns></returns>
    public static DataSet  GetPageDataSet(string str, int pagesize, int currenpage)
    {
        using (OleDbConnection cn = new OleDbConnection(strcn))
        {
            OleDbDataAdapter da = new OleDbDataAdapter(str, cn);
            DataSet ds = new DataSet();
            da.Fill(ds, pagesize * (currenpage - 1), pagesize, "pagetable");
            return ds;
        }
    }    /// <summary>
    /// 返回一个datareader
    /// </summary>
    /// <param name="strsql"></param>
    /// <param name="pas"></param>
    /// <returns></returns>
    public static OleDbDataReader GetReader(string strsql, params OleDbParameter[] pas)
    {
        OleDbConnection cn = new OleDbConnection(strcn);
        try
        {
            cn.Open();
            OleDbCommand cmd = new OleDbCommand(strsql, cn);
            if(pas !=null )
                 cmd.Parameters.AddRange(pas);
            OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            cmd.Parameters.Clear();
            return dr;
        }
        catch(Exception e)
        {
            CloseCn(cn);
            throw new Exception(e.Message ,e) ;
        }
    }
    public static OleDbDataReader GetReader(string strsql)
    {
        return GetReader(strsql, null);
    }    /// <summary>
    /// 执行一条sql语句(insert,update,delete),成功返回true,失败返回false
    /// </summary>
    /// <param name="strsql"></param>
    /// <param name="pas"></param>
    /// <returns></returns>
    public static bool ExcSql(string strsql, params OleDbParameter[] pas)
    {
        using (OleDbConnection cn = new OleDbConnection(strcn))
        {
            OleDbCommand cmd = new OleDbCommand(strsql, cn);
            if(pas!=null)
                cmd.Parameters.AddRange(pas);
            try
            {
                cn.Open();
                cmd.ExecuteNonQuery();
                //if(pas!=null )
                    cmd.Parameters.Clear();
                return true ;
            }
            catch
            {
                CloseCn(cn);
                //throw;
                return  false ;
            }
        }
    }    public static bool  ExcSql(string strsql)
    {
       return  ExcSql (strsql ,null );
    }    /// <summary>
    /// 返回一个整数值,如count,sum,avg,max,min,失败返回-1(此时通常是无记录)
    /// </summary>
    /// <param name="strsql">查询语句</param>
    /// <returns></returns>
    public static int GetNum(string strsql)
    {
        using (OleDbConnection cn = new OleDbConnection(strcn))
        {
            OleDbCommand cmd = new OleDbCommand(strsql, cn);
            try
            {
                cn.Open();
                int i = (int)cmd.ExecuteScalar();
                return i;
            }
            catch
            {
                return -1;
            }
        }
    }
    /// <summary>
    /// 返回一个字段值(字符串),失败返回字符串"null".
    /// </summary>
    /// <param name="strsql"></param>
    /// <returns></returns>
    public static string GetFieldValue(string strsql)
    {
        using (OleDbConnection cn = new OleDbConnection(strcn))
        {
            OleDbCommand cmd = new OleDbCommand(strsql, cn);
            try
            {
                cn.Open();
                return cmd.ExecuteScalar().ToString ();
            }
            catch
            {
                return "null";
            }
        }
    }}

解决方案 »

  1.   

    有微软的SqlHelper,何必再造呢?
      

  2.   

    没看出啥大问题,异常不应该隐藏起来,应该继续往上抛,GetFieldValue这个方法返回object比较好,或者直接设计成泛型方法更好。
      

  3.   

    异常不应隐藏起来。另外,就是,对于常用的访问类,应该用USING,而不是try..catch因为,有catch,会浪费资源。你可以分开两个访问类,一个是全用USING的,一个是try..catch的,你觉得需要catch的才用那个,否则都用using吧
      

  4.   

    正解
    有返回Objesct的值,建议返回泛型。减少拆箱装箱操作
      

  5.   

    我觉得最好的数据库访问类 是集成了存储过程与执行sql语句两者合二为一的类 
    public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
            {
                if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");            // Create & open a SqlConnection, and dispose of it after we are done
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();                // Call the overload that takes a connection in place of the connection string
                    return ExecuteDataset(connection, commandType, commandText, commandParameters);
                }
            }
      

  6.   


    加一个commandType,调用的时候就可以自己选择是用存储过程还是Sql语句了。