使用泛型,可以構建對數據庫單表的基本增刪改查。
首先有一數據庫 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));
謝謝閱讀,一起學習探討!與君共勉!