zoukankan      html  css  js  c++  java
  • 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语句)

      这个可以直接使用,有需要的朋友可以直接复制走。

      有什么问题欢迎随时交流。

  • 相关阅读:
    希望走过的路成为未来的基石
    第三次个人作业--用例图设计
    第二次结对作业
    第一次结对作业
    第二次个人编程作业
    第一次个人编程作业(更新至2020.02.07)
    Springboot vue 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro权限
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    spring cloud springboot 框架源码 activiti工作流 前后分离 集成代码生成器
    java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码
  • 原文地址:https://www.cnblogs.com/Yuuuuu/p/8688237.html
Copyright © 2011-2022 走看看