C#使用反射根據實體生成sql語句(添加和批量添加)


  最近碰上這個一個需求,需要寫一個接口,將穿進來的參數,存儲到數據庫里,但是存到哪個庫,哪個表,不確定,需要根據參數去判斷,但數據結構是固定的,因為表名不是固定的,所以這就很麻煩了,不能用EF直接去add或者是addRange了。需要自己去拼sql語句。

  但是本人比較懶,懶得去寫sql語句,所以就寫了一個自動生成Insert語句的通用方法,代碼如下

/// <summary>
    /// 對象拼接sql語句
    /// </summary>
    public class SqlBuilderHelper
    {
        /// <summary>
        /// Insert SQL語句
        /// </summary>
        /// <param name="obj">要轉換的對象,不可空</param>
        /// <param name="tableName">要添加的表明,不可空</param>
        /// <returns>
        ////// sql語句
        /// </returns>
        public static string InsertSql<T>(T t, string tableName) where T : class
        {
            if (t == null || string.IsNullOrEmpty(tableName))
            {
                return string.Empty;
            }
            string columns = GetColmons(t);
            if (string.IsNullOrEmpty(columns))
            {
                return string.Empty;
            }
            string values = GetValues(t);
            if (string.IsNullOrEmpty(values))
            {
                return string.Empty;
            }
            StringBuilder sql = new StringBuilder();
            sql.Append("Insert into " + tableName);
            sql.Append("(" + columns + ")");
            sql.Append(" values(" + values + ")");
            return sql.ToString();
        }

        /// <summary>
        /// BulkInsert SQL語句(批量添加)
        /// </summary>
        /// <typeparam name="T">類型</typeparam>
        /// <param name="objs">要轉換的對象集合,不可空</param>
        /// <param name="tableName">>要添加的表明,不可空</param>
        /// <returns>
        ////// sql語句
        /// </returns>
        public static string BulkInsertSql<T>(List<T> objs, string tableName) where T : class
        {
            if (objs == null || objs.Count == 0 || string.IsNullOrEmpty(tableName))
            {
                return string.Empty;
            }
            string columns = GetColmons(objs[0]);
            if (string.IsNullOrEmpty(columns))
            {
                return string.Empty;
            }
            string values = string.Join(",", objs.Select(p => string.Format("({0})", GetValues(p))).ToArray());
            StringBuilder sql = new StringBuilder();
            sql.Append("Insert into " + tableName);
            sql.Append("(" + columns + ")");
            sql.Append(" values " + values + "");
            return sql.ToString();
        }

        /// <summary>
        /// 獲得類型的列名
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        private static string GetColmons<T>(T obj)
        {
            if (obj == null)
            {
                return string.Empty;
            }
            return string.Join(",", obj.GetType().GetProperties().Select(p => p.Name).ToList());
        }

        /// <summary>
        /// 獲得值
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        private static string GetValues<T>(T obj)
        {
            if (obj == null)
            {
                return string.Empty;
            }
            return string.Join(",", obj.GetType().GetProperties().Select(p => string.Format("'{0}'", p.GetValue(obj))).ToArray());
        }
    }

   修改也寫好了,C#根據反射生成sql語句(Update語句)

  這個可以直接使用,有需要的朋友可以直接復制走。

  有什么問題歡迎隨時交流。

 


免責聲明!

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



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