用泛型創建SqlServerHelper類實現增刪改查(一)


使用泛型,可以構建對數據庫單表的基本增刪改查。

首先有一數據庫 Test_SqlServerHelper ,有2表

 

接下來創建項目,對數據庫進行增刪改查。

直接貼代碼:(SqlServerHelper.cs)

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace SqlServerHelper
{
  public static class SqlServerHelper
  {
    /// <summary>
    /// 數據庫連接字符串
    /// </summary>
    private static readonly string connString = ConfigurationManager.ConnectionStrings["Test"].ToString();  //數據庫連接字符

    /// <summary>
    /// 根據id查詢對象
    /// </summary>
    /// <typeparam name="T">對象類型</typeparam>
    /// <param name="id">對象實例的Id(泛型:類型int或string)</param>
    /// <param name="idName">條件的字段名稱(主鍵名)</param>
    /// <returns></returns>
    public static T QueryById<T, I>(I id, string idName = "Id")
    {
      Type type = typeof(T);
      string columnString = string.Join(",", type.GetProperties().Select(p => string.Format("[{0}]", p.Name)));
      string sqlString = string.Format("select {0} from [{1}] where {2}={3}", columnString, type.Name, idName, id.GetType().Name.ToString() == "String" ? ("'" + id.ToString() + "'") : id.ToString());
      var t = Activator.CreateInstance(type);
      using (SqlConnection conn = new SqlConnection(connString))
      {
        conn.Open();
        SqlCommand sqlCommand = new SqlCommand(sqlString, conn);
        SqlDataReader reader = sqlCommand.ExecuteReader();
        reader.Read();
        SetValueByProperties(type, reader, t);
      }
      return (T)t;
    }

    /// <summary>
    /// 獲取數據列表
    /// </summary>
    /// <typeparam name="T">對象類型</typeparam>
    /// <returns></returns>
    public static List<T> QueryAll<T>()
    {
      Type type = typeof(T);
      string columnString = string.Join(",", type.GetProperties().Select(p => string.Format("[{0}]", p.Name)));
      string sqlString = string.Format("select {0} from [{1}]", columnString, type.Name);
      List<T> dataList = new List<T>();
      using (SqlConnection conn=new SqlConnection(connString))
      {
        conn.Open();
        SqlCommand sqlCommand = new SqlCommand(sqlString,conn);
        SqlDataReader reader = sqlCommand.ExecuteReader();
        if (reader.HasRows)
        {
          while (reader.Read())
          {
            var t = Activator.CreateInstance(type);
            SetValueByProperties(type, reader, t);
            dataList.Add((T)t);
          }
        }
        else
        {
          return null;
        }
      }
      return dataList;
    }

    /// <summary>
    /// 插入對象
    /// </summary>
    /// <typeparam name="T">對象類型</typeparam>
    /// <param name="t">對象實例</param>
    /// <param name="idName">不插入的字段(自增鍵名)</param>
    /// <returns></returns>
    public static bool Insert<T>(T t, string idName = "Id")
    {
      Type type = typeof(T);
      string sqlString = "insert [{0}] ({1}) values ({2})";
      string columnString = string.Join(",", type.GetProperties().Where(p => p.Name != idName).Select(p => string.Format("[{0}]", p.Name)));
      string valueString = string.Join(",", type.GetProperties().Where(p => p.Name != idName).Select(p => string.Format("@{0}", p.Name)));
      sqlString = string.Format(sqlString, type.Name, columnString, valueString);
      using (SqlConnection conn = new SqlConnection(connString))
      {
        conn.Open();
        SqlCommand sqlCommand = new SqlCommand(sqlString, conn);
        SqlParameter[] sqlParameter = type.GetProperties().Where(p => p.Name != idName).Select(p=>new SqlParameter(string.Format("@{0}",p.Name),p.GetValue(t,null)??DBNull.Value)).ToArray();
        sqlCommand.Parameters.AddRange(sqlParameter);
        return sqlCommand.ExecuteNonQuery() > 0;
      }
    }

    /// <summary>
    /// 修改對象
    /// </summary>
    /// <typeparam name="T">對象類型</typeparam>
    /// <param name="t">對象實例</param>
    /// <param name="idName">自增鍵名或條件名</param>
    /// <returns></returns>
    public static bool Update<T>(T t, string idName = "Id")
    {
      Type type = typeof(T);
      string sqlString = "update [{0}] set {1} where {2}={3}";
      string setString = string.Join(",", type.GetProperties().Where(p => p.Name != idName).Select(p => string.Format("[{0}]=@{0}", p.Name)));
      sqlString = string.Format(sqlString, type.Name, setString, idName,"@"+idName);
      using (SqlConnection conn = new SqlConnection(connString))
      {
        conn.Open();
        SqlCommand sqlCommand = new SqlCommand(sqlString, conn);
        SqlParameter[] sqlParameter = type.GetProperties().Select(p => new SqlParameter(string.Format("@{0}", p.Name), p.GetValue(t, null) ?? DBNull.Value)).ToArray();
        sqlCommand.Parameters.AddRange(sqlParameter);
        return sqlCommand.ExecuteNonQuery() > 0;
      }
    }

    /// <summary>
    /// 設置值by屬性(SQLreader)
    /// </summary>
    /// <param name="type">對象類型</param>
    /// <param name="reader">sqlreader</param>
    /// <param name="t">對象</param>
    private static void SetValueByProperties(Type type, SqlDataReader reader, object t)
    {
      foreach (var item in type.GetProperties())
      {
        if (reader[item.Name] is DBNull) //判空
        {
          item.SetValue(t, null);
        }
        else
        {
          item.SetValue(t, reader[item.Name]);
        }
      }
    }
  }
}

 

這里使用二個數據庫表類實體:(我是通過工具直接在數據庫上導出來的)

Dt_Fruits.cs
using System;
using System.Collections.Generic;
using System.Text;

namespace SqlServerHelper
{
    public class Dt_Fruits
    {
        private int id;
        public int Id
        {
            get { return id; }
            set { id = value; }
        }
    
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    
        private int sort;
        public int Sort
        {
            get { return sort; }
            set { sort = value; }
        }
    
        private DateTime addTime;
        public DateTime AddTime
        {
            get { return addTime; }
            set { addTime = value; }
        }
    }
}

 

Dt_User.cs

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

namespace SqlServerHelper
{
    public class Dt_User
    {
        private int id;
        public int Id
        {
            get { return id; }
            set { id = value; }
        }
    
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    
        private string mob;
        public string Mob
        {
            get { return mob; }
            set { mob = value; }
        }
    
        private string sex;
        public string Sex
        {
            get { return sex; }
            set { sex = value; }
        }
    
        private DateTime birthday;
        public DateTime Birthday
        {
            get { return birthday; }
            set { birthday = value; }
        }
    
        private DateTime addTime;
        public DateTime AddTime
        {
            get { return addTime; }
            set { addTime = value; }
        }
    }
}

 

 以上都是准備工作,准備工作做好了,接下來就是,面向對象,直接操作類,快速對數據庫:增刪改查:

直接上代碼:

 //查詢所有:
      var userList = SqlServerHelper.QueryAll<Dt_User>();

      //查詢某一id:
      var oneFruits = SqlServerHelper.QueryById<Dt_Fruits,int>(1);//查到芒果的所有信息

      //修改
      oneFruits.Name = "芒果:修改";
      bool updateRes = SqlServerHelper.Update<Dt_Fruits>(oneFruits);//修改了芒果--》芒果:修改

      //添加
      var newUser = new Dt_User()
      {
        Name = "博客君",
        Sex = "",
        Mob = "16816816888",
        Birthday = DateTime.Now,
        AddTime=DateTime.Now
      };
      bool addRes = SqlServerHelper.Insert<Dt_User>(newUser);

 

以下是增刪改查的詳細講解:

查詢整表  所有(數據量超過5000的不推薦這么查詢,一般查詢一下類型表什么的)

 //查詢所有:
      var userList = SqlServerHelper.QueryAll<Dt_User>();

 

查詢某一id  的數據

 //查詢某一id:
      var oneFruits = SqlServerHelper.QueryById<Dt_Fruits,int>(1);//查到芒果的所有信息

查詢到的數據就不截圖了

修改某一id 的數據

  //修改
      oneFruits.Name = "芒果:修改";
      bool updateRes = SqlServerHelper.Update<Dt_Fruits>(oneFruits);//修改了芒果--》芒果:修改

 

 

 添加一條數據 

 //添加
      var newUser = new Dt_User()
      {
        Name = "博客君",
        Sex = "",
        Mob = "16816816888",
        Birthday = DateTime.Now,
        AddTime=DateTime.Now
      };
      bool addRes = SqlServerHelper.Insert<Dt_User>(newUser);

 最后數據變化:

 

 

 

是不是很棒,很輕松的對數據庫,簡單的增刪改查!

這里可能會有博友會說,哎呀,拼接SQL語句的,好像性能,或者某方面看起來不好,其實呀,ADO.net 對於數據庫訪問,底層也是對SQL語句的封裝的,好用就行了。以后如過有新表,就添加一對應新的C#模型就可以了,這種思想就衍生了現在很流行的EF框架哦。

還有!細心的朋友會發現:

我要查詢一條數據,為什么還要傳int,和1,其實是這樣的,如果數據庫主鍵名如果不是“id”,不用這樣查詢會拼接出錯誤的sql,因為id名是多變的,所以這里要傳。int,表示數據庫表的主鍵是int,對應傳就行了。假如有些數據庫表主鍵是“nvarchar,varchar 等”列如大型數據訂單id等,這時候傳string,(“10000101”)即可。

完整的寫法是這樣的:

 

     //查詢所有:
        var userList = SqlServerHelper.QueryAll<Dt_User>();

        //查詢某一id:
        var oneFruits = SqlServerHelper.QueryById<Dt_Fruits, int>(1,nameof(Dt_Fruits.Id));//查到芒果的所有信息

        //修改
        oneFruits.Name = "芒果:修改";
        bool updateRes = SqlServerHelper.Update<Dt_Fruits>(oneFruits,nameof(Dt_Fruits.Id));//修改了芒果--》芒果:修改

        //添加
        var newUser = new Dt_User()
        {
          Name = "博客君",
          Sex = "",
          Mob = "16816816888",
          Birthday = DateTime.Now,
          AddTime = DateTime.Now
        };
        bool addRes = SqlServerHelper.Insert<Dt_User>(newUser,nameof(Dt_Fruits.Id));

 謝謝閱讀,一起學習探討!與君共勉!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM