DAL数据访问层

Posted Arlar

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DAL数据访问层相关的知识,希望对你有一定的参考价值。

BaseDAL:(待改进点:sql语句中的每个表名和字段名得用中括号[]包围,以防表名或字段名与数据库特殊用字重名而导致在执行查询时引发异常)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;

public class BaseDAL
{
    public static int Insert(ModelBase obj)
    {
        Type type = obj.GetType();  //获取类型

        object[] attr = type.GetCustomAttributes(typeof(MyKeyAttribute), false);    //获取自定义特性
        if (attr.Length == 0)
            throw new Exception("必须定义主键列");

        string Key = (attr[0] as MyKeyAttribute).Key;               //获取主键列
        bool IsIdentity = (attr[0] as MyKeyAttribute).IsIdentity;   //是否自增长

        StringBuilder sb1 = new StringBuilder();
        StringBuilder sb2 = new StringBuilder();
        List<SqlParameter> ps = new List<SqlParameter>();

        PropertyInfo[] infos = type.GetProperties();        //获取所有属性,即字段名,组装成sql语句
        foreach (PropertyInfo p in infos)
        {
            if (p.GetValue(obj, null) != null)
            {
                if (p.Name.ToLower() == Key.ToLower() && IsIdentity)    //如果是主键列且自增长就跳过
                    continue;

                sb1.Append(p.Name + ",");
                sb2.Append("@" + p.Name + ",");
                ps.Add(new SqlParameter("@" + p.Name, p.GetValue(obj, null)));
            }
        }

        string sql = string.Format("insert into {0}({1}) values({2})", type.Name, sb1.ToString().Trim(‘,‘), sb2.ToString().Trim(‘,‘));

        return DBHelper.CUD(sql, ps);
    }

    public static int InsertID(ModelBase obj)
    {
        Type type = obj.GetType();  //获取类型

        object[] attr = type.GetCustomAttributes(typeof(MyKeyAttribute), false);    //获取自定义特性
        if (attr.Length == 0)
            throw new Exception("必须定义主键列");

        string Key = (attr[0] as MyKeyAttribute).Key;               //获取主键列
        bool IsIdentity = (attr[0] as MyKeyAttribute).IsIdentity;   //是否自增长

        StringBuilder sb1 = new StringBuilder();
        StringBuilder sb2 = new StringBuilder();
        List<SqlParameter> ps = new List<SqlParameter>();

        PropertyInfo[] infos = type.GetProperties();        //获取所有属性,即字段名,组装成sql语句
        foreach (PropertyInfo p in infos)
        {
            if (p.GetValue(obj, null) != null)
            {
                if (p.Name.ToLower() == Key.ToLower() && IsIdentity)    //如果是主键列且自增长就跳过
                    continue;

                sb1.Append(p.Name + ",");
                sb2.Append("@" + p.Name + ",");
                ps.Add(new SqlParameter("@" + p.Name, p.GetValue(obj, null)));
            }
        }

        string sql = string.Format("insert into {0}({1}) values({2});select @@identity;", type.Name, sb1.ToString().Trim(‘,‘), sb2.ToString().Trim(‘,‘));

        return Convert.ToInt32(DBHelper.SelectObject(sql, ps));
    }

    public static int Update(ModelBase obj)
    {
        Type type = obj.GetType();  //获取类型

        object[] attr = type.GetCustomAttributes(typeof(MyKeyAttribute), false);    //通过自定义特性,获取主键列
        if (attr.Length == 0)
            throw new Exception("必须设定主键列!");

        string Key = (attr[0] as MyKeyAttribute).Key;
        object KeyValue = type.GetProperty(Key).GetValue(obj, null);    //获取主键列值
        if (KeyValue == null)
            throw new Exception("必须给主键列赋值!");

        StringBuilder sb1 = new StringBuilder();
        List<SqlParameter> ps = new List<SqlParameter>();

        PropertyInfo[] infos = type.GetProperties();        //获取所有列值,组装成sql语句
        foreach (PropertyInfo p in infos)
        {
            if (p.GetValue(obj, null) != null)
            {
                if (p.Name.ToLower() != Key.ToLower())
                {
                    sb1.Append(p.Name + "[email protected]" + p.Name + ",");
                    ps.Add(new SqlParameter("@" + p.Name, p.GetValue(obj, null)));
                }
            }
        }

        string wstr = Key + "[email protected]" + Key;             //获取主键列,组装成sql语句
        ps.Add(new SqlParameter("@" + Key, KeyValue));

        string sql = string.Format("update {0} set {1} where {2}", type.Name, sb1.ToString().Trim(‘,‘), wstr);

        return DBHelper.CUD(sql, ps);
    }

    public static int Delete<T>(object objID)
    {
        Type type = typeof(T);

        object[] attr = type.GetCustomAttributes(typeof(MyKeyAttribute), false);
        if (attr.Length == 0)
            throw new Exception("必须指定主键列!");

        string Key = (attr[0] as MyKeyAttribute).Key;
        string sql = string.Format("delete from {0} where {1}[email protected]{1}", type.Name, Key);
        List<SqlParameter> ps = new List<SqlParameter>();
        ps.Add(new SqlParameter("@" + Key, objID));

        return DBHelper.CUD(sql, ps);
    }

    public static T SelectObj<T>(object objID)
    {
        Type type = typeof(T);

        object[] attr = type.GetCustomAttributes(typeof(MyKeyAttribute), false);
        if (attr.Length == 0)
            throw new Exception("必须设定主键列!");

        string Key = (attr[0] as MyKeyAttribute).Key;
        string sql = string.Format("select * from {0} where {1}[email protected]{1}", type.Name, Key);
        List<SqlParameter> ps = new List<SqlParameter>();
        ps.Add(new SqlParameter("@" + Key, objID));

        T obj = Activator.CreateInstance<T>();
        using (DataTable dt = DBHelper.SelectTable(sql, ps))
        {
            for (int r = 0; r < dt.Rows.Count; r++)
            {
                PropertyInfo[] infos = type.GetProperties();
                foreach (PropertyInfo p in infos)
                {
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        if (p.Name.ToLower() == dt.Columns[i].ColumnName.ToLower())
                        {
                            if (dt.Rows[r][p.Name] != DBNull.Value)
                                p.SetValue(obj, dt.Rows[r][p.Name], null);
                        }
                    }
                }
            }
        }
        return obj;
    }

    public static List<T> SelectList<T>(string sql = null, List<SqlParameter> ps = null)
    {
        List<T> list = new List<T>();

        Type type = typeof(T);

        using (DataTable dt = (sql == null ? DBHelper.SelectTable("select * from " + type.Name) : DBHelper.SelectTable(sql, ps)))
        {
            for (int r = 0; r < dt.Rows.Count; r++)
            {
                T obj = Activator.CreateInstance<T>();
                PropertyInfo[] infos = type.GetProperties();

                foreach (PropertyInfo p in infos)
                {
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        if (p.Name.ToLower() == dt.Columns[i].ColumnName.ToLower())
                        {
                            if (dt.Rows[r][p.Name] != DBNull.Value)
                                p.SetValue(obj, dt.Rows[r][p.Name], null);
                        }
                    }
                }
                list.Add(obj);
            }
        }
        return list;
    }
}

EntityDAL:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

public class EntityDAL : BaseDAL
{
  //对表或视图实体的数据操作
}
            

ModelBase:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class ModelBase
{

}

Entity:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

[MyKey("ID",true)]
public class Entity : ModelBase
{
    public System.Int32 ID { get; set; }
    public System.String ClassName { get; set; }

    public Entity()
    {
        ClassName = string.Empty;
    }
}

MyKeyAttribute:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//自定义特性类
public class MyKeyAttribute : Attribute
{
    public string Key { get; set; }         //主键列
    public bool IsIdentity { get; set; }    //是否自增长

    public MyKeyAttribute(string key, bool isIdentity)
    {
        this.Key = key;
        this.IsIdentity = isIdentity;
    }
}

DBHelper:

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

public class DBHelper
{
    public static string connstr = ConfigurationManager.ConnectionStrings["connstr"].ToString();

    /// <summary>
    ///无参的增改删
    /// </summary>
    public static int CUD(string sql)
    {
        using (SqlConnection conn = new SqlConnection(connstr))
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            conn.Open();
            int result = cmd.ExecuteNonQuery();

            return result;
        }
    }
    

    /// <summary>
    ///有参的增改删
    /// </summary>
    public static int CUD(string sql, List<SqlParameter> ps)
    {
        using (SqlConnection conn = new SqlConnection(connstr))
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            if (ps != null)
                cmd.Parameters.AddRange(ps.ToArray());
            conn.Open();
            int result = cmd.ExecuteNonQuery();

            return result;
        }
    }

    /// <summary>
    ///无参、断开式数据操作
    /// </summary>
    public static DataSet SelectSet(string sql)
    {
        using (SqlConnection conn = new SqlConnection(connstr))
        {
            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            DataSet ds = new DataSet();
            da.Fill(ds);
            return ds;
        }
    }


    /// <summary>
    ///无参、断开式数据操作
    /// </summary>
    public static DataTable SelectTable(string sql)
    {
        using (SqlConnection conn = new SqlConnection(connstr))
        {
            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            DataSet ds = new DataSet();
            da.Fill(ds);

            return ds.Tables[0];
        }
    }

    /// <summary>
    ///有参、断开式数据操作
    /// </summary>
    
    public static DataTable SelectTable(string sql,List<SqlParameter> ps)
    {
        using (SqlConnection conn = new SqlConnection(connstr))
        {
            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            if (ps != null)
                da.SelectCommand.Parameters.AddRange(ps.ToArray());
            DataSet ds = new DataSet();
            da.Fill(ds);

            return ds.Tables[0];
        }
    }

    /// <summary>
    ///无参、连接式数据操作
    /// </summary>
    
    public static SqlDataReader SelectReader(string sql)
    {
        SqlConnection conn = new SqlConnection(connstr);
        SqlCommand cmd = new SqlCommand(sql, conn);
        conn.Open();
        SqlDataReader sr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

        return sr;
    }

    /// <summary>
    ///有参、连接式数据操作
    /// </summary>
    
    public static SqlDataReader SelectReader(string sql,List<SqlParameter> ps)
    {
        SqlConnection conn = new SqlConnection(connstr);
        SqlCommand cmd = new SqlCommand(sql, conn);
        if (ps != null)
            cmd.Parameters.AddRange(ps.ToArray());
        conn.Open();
        SqlDataReader sr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

        return sr;
    }


    /// <summary>
    ///调用存储过程,返回DataSet
    /// </summary>
    
    public static DataSet SelectProc(string sql, List<SqlParameter> ps)
    {
        using (SqlConnection conn = new SqlConnection(connstr))
        {
            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            //指定命令类型为存储过程模式
            da.SelectCommand.CommandType = CommandType.StoredProcedure;

            if (ps != null)
                da.SelectCommand.Parameters.AddRange(ps.ToArray());
            DataSet ds = new DataSet();
            da.Fill(ds);

            return ds;
        }
    }

    /// <summary>
    /// 调用存储过程,返回DataTable数组
    /// </summary>
    
    public static DataTable[] SelectProcTable(string sql, List<SqlParameter> ps)
    {
        using (SqlConnection conn = new SqlConnection(connstr))
        {
            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            //指定命令类型为存储过程模式
            da.SelectCommand.CommandType = CommandType.StoredProcedure;

            if (ps != null)
                da.SelectCommand.Parameters.AddRange(ps.ToArray());
            DataSet ds = new DataSet();
            da.Fill(ds);

            DataTable[] dts = new DataTable[2];
            ds.Tables.CopyTo(dts, 0);

            return dts;
        }
    }


    /// <summary>
    /// 取单行单列的数据对象
    /// </summary>
    public static object SelectObject(string sql)
    {
        using (SqlConnection conn = new SqlConnection(connstr))
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            conn.Open();
            object obj = cmd.ExecuteScalar();
            //conn.Close();

            return obj;
        }
    }

    /// <summary>
    /// 取单行单列的数据对象
    /// </summary>
    public static object SelectObject(string sql, List<SqlParameter> ps)
    {
        using (SqlConnection conn = new SqlConnection(connstr))
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            conn.Open();
            if (ps != null)
                cmd.Parameters.AddRange(ps.ToArray());
            object obj = cmd.ExecuteScalar();
            //conn.Close();

            return obj;
        }
    }
}

 

以上是关于DAL数据访问层的主要内容,如果未能解决你的问题,请参考以下文章

业务层 (BLL) 数据访问层 (DAL) 和 UI 之间的通用结构?

1.1 DAL数据访问层

DAL 层:EF 4.0 或带有存储过程的普通数据访问层

数据访问层DAL

项目的两个独立数据访问层 (DAL) 的比较

DAL数据访问层