zoukankan      html  css  js  c++  java
  • 泛型连接数据库

    这些天用泛型做了一个数据库的底层,自我感觉很方便,但是功能不是很完善,会继续考虑下去下面给大家分享一下代码

    1数据库连接的帮助类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Data.SqlClient;
    
    namespace DAL
    {
    
        public class DBHelper
        {
            /// <summary>
            /// 从web.config中获得数据库连接字符串
            /// </summary>
            public static string Connstr = "Data Source=.;Initial Catalog=Pet;Integrated Security=True";
    
            #region sql语句部分
    
    
            /// <summary>
            /// 执行sql语句返回DataTable
            /// </summary>
            /// <param name="sql">sql</param>
            /// <returns>根据sql语句得到所有记录</returns>
            public static DataTable GetDataTable(string sql)
            {
    
                using (SqlConnection conn = new SqlConnection(Connstr))
                {
    
                    SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
                    DataTable dt = new DataTable();
                    sda.Fill(dt);
                    return dt;
    
    
                }
    
    
            }
    
            /// <summary>
            /// 执行带参数的sql语句返回DataTable
            /// </summary>
            /// <param name="sql">带参数的sql语句</param>
            /// <param name="values">参数</param>
            /// <returns>根据sql语句得到所有记录</returns>
            public static DataTable GetDataTable(string sql, params SqlParameter[] values)
            {
                using (SqlConnection conn = new SqlConnection(Connstr))
                {
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    conn.Open();
                    cmd.Parameters.AddRange(values);
                    SqlDataAdapter sda = new SqlDataAdapter(cmd);
                    DataTable dt = new DataTable();
                    sda.Fill(dt);
                    conn.Close();
                    return dt;
                }
    
    
            }
    
    
            /// <summary>
            /// 执行无参数的sql语句
            /// </summary>
            /// <param name="sql">sql语句</param>
            /// <returns>影响的行数</returns>
            public static int ExecuteCommand(string sql)
            {
                using (SqlConnection conn = new SqlConnection(Connstr))
                {
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    conn.Open();
                    int num = cmd.ExecuteNonQuery();
                    conn.Close();
                    return num;
                }
            }
    
    
            /// <summary>
            /// 执行有参数的sql语句
            /// </summary>
            /// <param name="sql">sql语句</param>
            /// <param name="values">参数</param>
            /// <returns>影响的行数</returns>
            public static int ExecuteCommand(string sql, params SqlParameter[] values)
            {
                using (SqlConnection conn = new SqlConnection(Connstr))
                {
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    cmd.Parameters.AddRange(values);
                    conn.Open();
                    int num = Convert.ToInt32(cmd.ExecuteNonQuery());
                    conn.Close();
                    return num;
                }
            }
            /// <summary>
            /// 执行无参数的sql语句,返回首行首列
            /// </summary>
            /// <param name="sql">sql语句</param>
            /// <returns>返回首行首列</returns>
            public static object GetScalar(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>
            /// 执行有参数的sql语句,返回首行首列
            /// </summary>
            /// <param name="sql">sql语句</param>
            /// <param name="values">参数,是否返回首行首列</param>
            /// <returns>返回首行首列</returns>
            public static object ExecuteScalar(string sql, params SqlParameter[] values)
            {
                using (SqlConnection conn = new SqlConnection(Connstr))
                {
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    cmd.Parameters.AddRange(values);
                    conn.Open();
                    object obj = cmd.ExecuteScalar();
                    conn.Close();
                    return obj;
                }
            }
    
            /// <summary>
            /// 带事务的执行多条sql语句
            /// </summary>
            /// <param name="sqls"></param>    
            /// <returns></returns>
            //public static bool ExecuteCommandByTran(params ExecuteSql[] sqls)
            //{
    
            //    using (SqlConnection conn = new SqlConnection(Connstr))
            //    {
            //        conn.Open();
            //        //为数据库连接打开事务
            //        SqlTransaction tran = conn.BeginTransaction();
            //        SqlCommand cmd = new SqlCommand();
            //        cmd.Connection = conn;
            //        //为命令对象指定要应用事务
            //        cmd.Transaction = tran;
            //        try
            //        {
    
            //            for (int i = 0; i < sqls.Length; i++)
            //            {
            //                cmd.CommandText = sqls[i].SqlString;
            //                cmd.Parameters.AddRange(sqls[i].Pars);
            //                cmd.ExecuteNonQuery();
            //            }
    
            //            //没有异常的情况下,提交事务
            //            tran.Commit();
    
            //            return true;
            //        }
            //        catch (Exception ex)
            //        {
            //            //事务滚回去
            //            tran.Rollback();
    
            //            return false;
    
            //        }
            //        finally
            //        {
    
            //            conn.Close();
            //        }
    
            //    }
            //}
    
            #endregion
    
            #region 存储过程部分
            /// <summary>
            /// 执行sql语句返回DataTable
            /// </summary>
            /// <param name="sql">安全的sql语句</param>
            /// <returns>根据sql语句得到所有记录</returns>
            public static DataTable GetDataTableByProcedure(string sql)
            {
    
                using (SqlConnection conn = new SqlConnection(Connstr))
                {
    
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    conn.Open();
                    SqlDataAdapter sda = new SqlDataAdapter(cmd);
                    DataTable dt = new DataTable();
                    sda.Fill(dt);
                    conn.Close();
                    return dt;
    
    
                }
    
    
            }
            /// <summary>
            /// 执行带参数的sql语句返回DataTable
            /// </summary>
            /// <param name="sql">带参数的sql语句</param>
            /// <param name="values">参数</param>
            /// <returns>根据sql语句得到所有记录</returns>
            public static DataTable GetDataTableByProcedure(string sql, params SqlParameter[] values)
            {
                using (SqlConnection conn = new SqlConnection(Connstr))
                {
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    //指定查询的方式使用存储过程
                    cmd.CommandType = CommandType.StoredProcedure;
                    conn.Open();
                    cmd.Parameters.AddRange(values);
                    SqlDataAdapter sda = new SqlDataAdapter(cmd);
                    DataTable dt = new DataTable();
                    sda.Fill(dt);
                    conn.Close();
                    return dt;
                }
    
    
            }
    
    
            /// <summary>
            /// 执行无参数的sql语句
            /// </summary>
            /// <param name="sql">sql语句</param>
            /// <returns>影响的行数</returns>
            public static int ExecuteCommandByProcedure(string sql)
            {
                using (SqlConnection conn = new SqlConnection(Connstr))
                {
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    conn.Open();
                    int num = cmd.ExecuteNonQuery();
                    conn.Close();
                    return num;
                }
            }
    
    
            /// <summary>
            /// 执行有参数的sql语句
            /// </summary>
            /// <param name="sql">sql语句</param>
            /// <param name="values">参数</param>
            /// <returns>影响的行数</returns>
            public static int ExecuteCommandByProcedure(string sql, params SqlParameter[] values)
            {
                using (SqlConnection conn = new SqlConnection(Connstr))
                {
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddRange(values);
                    conn.Open();
                    int num = cmd.ExecuteNonQuery();
                    conn.Close();
                    return num;
                }
            }
            /// <summary>
            /// 执行无参数的sql语句,返回首行首列
            /// </summary>
            /// <param name="sql">sql语句</param>
            /// <returns>返回首行首列</returns>
            public static object GetScalarByProcedure(string sql)
            {
                using (SqlConnection conn = new SqlConnection(Connstr))
                {
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    conn.Open();
                    object obj = cmd.ExecuteScalar();
                    conn.Close();
                    return obj;
                }
            }
            /// <summary>
            /// 执行有参数的sql语句,返回首行首列
            /// </summary>
            /// <param name="sql">sql语句</param>
            /// <param name="values">参数,是否返回首行首列</param>
            /// <returns>返回首行首列</returns>
            public static object ExecuteScalarByProcedure(string sql, params SqlParameter[] values)
            {
                using (SqlConnection conn = new SqlConnection(Connstr))
                {
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddRange(values);
                    conn.Open();
                    object obj = cmd.ExecuteScalar();
                    conn.Close();
                    return obj;
                }
            }
            #endregion
            
            #region 帮助方法
            //判断是否为主键
            public static bool IsPrimaryKey(String columnName, String tableName)
            {
                using (SqlConnection conn = new SqlConnection(Connstr))
                {
                    conn.Open();
                    SqlParameter[] parameters = new SqlParameter[3];
                    parameters[0] = new SqlParameter("@table_name", tableName);
                    parameters[1] = new SqlParameter("@table_owner", null);
                    parameters[2] = new SqlParameter("@table_qualifier", null);
                    SqlCommand comm = new SqlCommand();
                    //指定存储过程名称
                    comm.CommandText = "sp_pkeys";
                    comm.Connection = conn;
                    //声明执行命令的类型
                    comm.CommandType = CommandType.StoredProcedure;
                    comm.Parameters.AddRange(parameters);
                    SqlDataAdapter ad = new SqlDataAdapter(comm);
                    DataTable dt = new DataTable();
                    ad.Fill(dt);
                    DataRowCollection drc = dt.Rows;
                    if (drc.Count == 0 || (drc[0]["COLUMN_NAME"].ToString().ToLower() != columnName.ToLower()))
                        return false;
                    else
                        return true;
                }
    
            }
            //判断是否为外键
            public static bool IsForeignKey(String columnName, String tableName)
            {
                using (SqlConnection conn = new SqlConnection(Connstr))
                {
                    conn.Open();
                    SqlParameter[] parameters = new SqlParameter[3];
                    parameters[0] = new SqlParameter("@pktable_name", tableName);
                    parameters[1] = new SqlParameter("@pktable_owner", null);
                    parameters[2] = new SqlParameter("@pktable_qualifier", null);
                    SqlCommand comm = new SqlCommand();
                    //指定存储过程名称
                    comm.CommandText = "sp_fkeys";
                    comm.Connection = conn;
                    //声明执行命令的类型
                    comm.CommandType = CommandType.StoredProcedure;
                    comm.Parameters.AddRange(parameters);
                    SqlDataAdapter ad = new SqlDataAdapter(comm);
                    DataTable dt = new DataTable();
                    ad.Fill(dt);
                    DataRowCollection drc = dt.Rows;
                    if (drc.Count == 0 || (drc[0]["COLUMN_NAME"].ToString().ToLower() != columnName.ToLower()))
                        return false;
                    else
                        return true;
                }
    
            }
            #endregion
        }
    }

    2BaseDAL定义了一些主要的增删改查的方法因为只是开始做 所以只能是对单张表的操作

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Reflection;
    using Model;
    
    namespace DAL
    {
        public abstract class BassDAL<T> where T : new()
        {
            //单表查询
            public virtual List<T> GetAllModels()
            {
                List<T> tList = new List<T>();
                string name = new T().GetType().Name;
                string sqlStr = "select * from " + name;
                DataTable dt = DBHelper.GetDataTable(sqlStr);
    
                foreach (DataRow dr in dt.Rows)
                {
                    T t = new T();
                    PropertyInfo[] proList = t.GetType().GetProperties();
                    foreach (PropertyInfo pi in proList)
                    {
                        string piName = pi.Name;
                        if (dt.Columns.Contains(piName))
                        {
                            if (!pi.CanWrite) continue;
                            object value = dr[piName];
                            if (value != DBNull.Value)
                                pi.SetValue(t, value, null);
                        }
                    }
                    tList.Add(t);
                }
                return tList;
            }
            //添加
            public virtual bool AddModel(T model)
            {
                PropertyInfo[] proList = model.GetType().GetProperties();
                string name = model.GetType().Name;
                string sqlStr = "insert into " + name;
                string filed = "(";
                string values = " values (";
                foreach (PropertyInfo pi in proList)
                {
                    filed += pi.Name + ",";
                    values += "'" + pi.GetValue(model, null).ToString() + "',";
                }
                filed = filed.Substring(0, filed.Length - 1) + ")";
                values = values.Substring(0, values.Length - 1) + ")";
                sqlStr = sqlStr + filed + values;
                return DBHelper.ExecuteCommand(sqlStr) != 0 ? true : false;
            }
            //修改
            public virtual bool UpdateModel(T model)
            {
                PropertyInfo[] proList = model.GetType().GetProperties();
                string name = model.GetType().Name;
                string sqlStr = "update " + name + " set ";
                foreach (PropertyInfo pi in proList)
                {
                    if (pi.GetValue(model, null) != null && DBHelper.IsPrimaryKey(pi.Name, name) == false)
                    {
                        sqlStr += pi.Name + "='" + pi.GetValue(model, null).ToString() + "',";
                    }
                }
                sqlStr = sqlStr.Substring(0, sqlStr.Length - 1);
                foreach (PropertyInfo pi in proList)
                {
                    if (pi.GetValue(model, null) != null && DBHelper.IsPrimaryKey(pi.Name, name) != false)
                    {
                        sqlStr += " where " + pi.Name + "='" + pi.GetValue(model, null).ToString() + "'";
                    }
                }
                return DBHelper.ExecuteCommand(sqlStr) != 0 ? true : false;
            }
            //删除
            public virtual bool DeleteModel(T model)
            {
                PropertyInfo[] proList = model.GetType().GetProperties();
                string name = model.GetType().Name;
                string sqlStr = "delete " + name + " where ";
                foreach (PropertyInfo pi in proList)
                {
                    if (pi.GetValue(model, null) != null)
                    {
                        if (DBHelper.IsPrimaryKey(pi.Name, name) != false)
                        {
                            sqlStr += pi.Name + "='" + pi.GetValue(model, null).ToString()+"'";
                        }
                    }
                }
                return DBHelper.ExecuteCommand(sqlStr) != 0 ? true : false;
            }
        }
    }

    3使用BaseDAL

    用实体类的DAL继承BaseDAL由于BaseDAL是一个泛型类所以要在继承的时候传入实体类即BassDAL<PetInfo>

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Model;
    
    namespace DAL
    {
        public class Pet:BassDAL<PetInfo>
        {
        }
    }

    4这样就可以使用了

    using System;
    using System.Collections;
    using System.Configuration;
    using System.Data;
    
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    
    using DAL;
    using Model;
    
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            PetInfo petinfo = new PetInfo
            {
                 Id = 1,
            };
            new Pet().DeleteModel(petinfo);
            this.GridView1.DataSource = new Pet().GetAllModels();
            this.GridView1.DataBind();
            
        }
    }

    有什么不足希望大家指出来,一起完善哈

  • 相关阅读:
    第三次上机练习
    第三次作业
    第二次上级练习
    第二次作业
    第一次上机练习
    第一次作业
    4.20
    4.16
    4.10
    4.9
  • 原文地址:https://www.cnblogs.com/liuchang/p/3700992.html
Copyright © 2011-2022 走看看