最近碰上這個一個需求,需要寫一個接口,將穿進來的參數,存儲到數據庫里,但是存到哪個庫,哪個表,不確定,需要根據參數去判斷,但數據結構是固定的,因為表名不是固定的,所以這就很麻煩了,不能用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語句)
這個可以直接使用,有需要的朋友可以直接復制走。
有什么問題歡迎隨時交流。