C#--利用反射編寫的SqlHelper類
阿新 • • 發佈:2020-12-26
以下是學習筆記:
1,常用的查詢方法:
例如:根據id查詢學生資訊
/// <summary> /// 根據ID查詢物件 /// </summary> /// <typeparam name="T">查詢的物件</typeparam> /// <param name="id">物件ID</param> /// <returns></returns> public Students Find(int id) { //查詢語句 string sql = $"SELECT [StudentId] ,[StudentName] ,[Gender] ,[DateOfBirth],[StudentIdNo],[Age],[PhoneNumber],[StudentAddress] ,[ClassId] FROM [dbo].[Students] where StudentId={id}"; //using 使用完會自動釋放 using (SqlConnection conn = new SqlConnection(connStsring)) { SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); SqlDataReader dataReader = cmd.ExecuteReader(); Students students = new Students(); if (dataReader.Read()) { students.StudentId = Convert.ToInt32(dataReader["StudentId"]); students.StudentName = dataReader["StudentName"].ToString(); students.Gender = dataReader["Gender"].ToString(); students.DateOfBirth = Convert.ToDateTime(dataReader["DateOfBirth"]); students.StudentIdNo = Convert.ToDecimal(dataReader["StudentIdNo"]); students.ClassId = Convert.ToInt32(dataReader["ClassId"]); students.Age = Convert.ToInt32(dataReader["Age"]); students.PhoneNumber = dataReader["PhoneNumber"].ToString(); students.StudentAddress = dataReader["StudentAddress"].ToString(); } dataReader.Close(); return students; } }
分析上面的程式碼的問題:
以上只是查詢1個學生表,比如還有班級資訊表,課程表,商場的商品表,有10個表,100個表,一樣的程式碼要寫很多遍
2,以下通過發射來寫一個通用查詢的方法
/// <summary> /// 根據id查詢物件--通用的方法 /// </summary> /// <typeparam name="T">型別的名稱</typeparam> /// <param name="id"></param> /// <param name="fieldId">查詢的欄位</param> /// <returns></returns> public T Find<T>(int id, string fieldName) { //【1】把sql語句寫成可以變的 //string sql = $"SELECT [StudentId] ,[StudentName] ,[Gender] ,[DateOfBirth],[StudentIdNo],[Age],[PhoneNumber],[StudentAddress] ,[ClassId] FROM [dbo].[Students] where StudentId={id}";//之前的sql語句是定死的 //先找到型別 Type type = typeof(T); //type.GetProperties() 獲取所有的屬性 //Select(p => p.Name),linq查詢,p => p.Name 屬性的名稱 //type.Name 表名稱 string sql = $"SELECT {string.Join(",", type.GetProperties().Select(p => p.Name))} from {type.Name} where {fieldName}={id}"; using (SqlConnection conn = new SqlConnection(connStsring)) { SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); SqlDataReader dataReader = cmd.ExecuteReader(); //【2】建立的物件型別也要是可變的 //Students students = new Students();//之前的物件這個是定死的 object oObject = Activator.CreateInstance(type); if (dataReader.Read()) { foreach (var prop in type.GetProperties()) { prop.SetValue(oObject, dataReader[prop.Name]); //【3】利用反射來操作屬性 } } dataReader.Close(); return (T) oObject; } }
3,使用上面的通用方法
【1】,新增Students類
namespace Models { public class Students { /// <summary> /// 學號 /// </summary> public int StudentId { get; set; } /// <summary> /// 學生姓名 /// </summary> public string StudentName { get; set; } /// <summary> /// 性別 /// </summary> public string Gender { get; set; } /// <summary> /// 生日 /// </summary> public DateTime DateOfBirth { get; set; } /// <summary> /// 考勤號 /// </summary> public decimal StudentIdNo { get; set; } /// <summary> /// 照片 /// </summary> public int ClassId { get; set; } /// <summary> /// 年齡 /// </summary> public int Age { get; set; } /// <summary> /// 電話 /// </summary> public string PhoneNumber { get; set; } /// <summary> /// 地址 /// </summary> public string StudentAddress { get; set; } } }
【2】 呼叫
MySQLServerHelper mySqlServerHelper=new MySQLServerHelper(); //普通方法 Students students = mySqlServerHelper.Find(100000); //利用反射的通用方法 Students newStudents = mySqlServerHelper.Find<Students>(100000,"StudentId"); Type type11 = typeof(Students); foreach (var prop in type11.GetProperties()) { Console.WriteLine($"{prop.GetValue(newStudents)}"); }