1. 程式人生 > 實用技巧 >C#--利用反射編寫的SqlHelper類

C#--利用反射編寫的SqlHelper類

以下是學習筆記:

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)}");
            }