最近对接一个接口,需要通过xml序列化成实体后添加额外信息后批量插入数据库,需要手动拼sql。因为涉及多张表,拼凑很麻烦而且容易出错,所以写了两个工具方法来生成sql,先写到博客里面,以便以后不时之需。

直接上工具方法,是通过反射机制来拼凑的sql语句,EF底层实现原理差不多。

1.实体生成Insert语句

 /// <summary>
/// 通过反射生成sql语句
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity">实体</param>
/// <param name="tableName">表名称</param>
/// <returns></returns>
public static string InsertSql<T>(T entity,string tableName="")where T:class
{
return entity == null || "".Equals(entity) ? string.Empty : $" INSERT INTO {tableName??entity.GetType().Name} ({string.Join(",", entity.GetType().GetProperties().Select(t => $"[{t.Name}]"))}) Values({string.Join(",",entity.GetType().GetProperties().Select(t=>$"'{t.GetValue(entity)}'"))})";
}

2.实体生成Update语句,主键字段需要自己指定

   /// <summary>
/// 通过反射生成sql语句
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity">实体</param>
/// <param name="value">值</param>
/// <param name="key">条件字段</param>
/// <param name="tableName">表名称</param> public static string UpdateSql<T>(T entity, object value,string key, string tableName = "") where T:class
{
return entity==null || "".Equals(entity) || value==null || "".Equals(value) ? string.Empty: $" UPDATE {tableName??entity.GetType().Name} SET {string.Join(",", entity.GetType().GetProperties().Select(t => $"[{t.Name}]='{t.GetValue(entity)}'"))} WHERE {key}='{value}'";
}

随便造个实体:

 public class UserEntity
{
/// <summary>
/// 主键
/// </summary>
public string Id { get; set; }
public string Name { get; set; }
public string Adress { get; set; }
public int Age { get; set; }
public string Sex { get; set; }
public string Phone { get; set; }
public bool? Enabled { get; set; }
public DateTime? CreateTime { get; set; }
}

测试代码如下:

UserEntity user = new UserEntity()
{
Name = "张三",
Adress = "中国",
Age = ,
Sex = "男",
Phone = "",
Id = "",
Enabled = true,
CreateTime = DateTime.Now
};
Console.WriteLine("***********************实体生成Update语句****************************");
Console.WriteLine(UpdateSql(user, ,"Id", "TestUser"));
Console.WriteLine("***********************实体生成Insert语句****************************");
Console.WriteLine(InsertSql(user, "TestUser"));
Console.ReadKey();

执行结果:

如有不到之处,敬请指出。

ASP.NET通过反射生成sql语句的更多相关文章

  1. 反射生成SQL语句入门

    今天我们来学习学习通过反射技术来生成SQL语句. 反射提供了封装程序集.模块和类型的对象.您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型.然后,可以调用类型的方法或访 ...

  2. 利用反射生成SQL语句

    // 修改学员信息的方法 public bool ModifyStudent(MODEL.Students model) { // 利用反映获取类对所有属性,用来动态生成SQL语句 StringBui ...

  3. 4、注解反射生成SQL语句

    .任务说明         ①有一张用户表,字段包括:用户ID.用户名.昵称.年龄.性别.所在城市.邮箱.手机号:         ②使用java注解来对用户表的每个字段或字段的组合条件进行动态生成S ...

  4. 根据反射生成SQL语句

    /** * 基础查询语句 * 返回类型的属性字符串Sql * @author: InkYi * 修改时间:2016年5月11日 - 上午10:06:00<br/> * 功能说明:<b ...

  5. 通过自定义注解反射生成SQL语句

    ----------------------------------------Program.cs---------------------------------------- using Sys ...

  6. C# - 通过自定义注解反射生成SQL语句[转]

    转自http://blog.163.com/jong_cai/blog/static/87028045200902033553581/ -------------------------------- ...

  7. 反射生成SQL语句

    public static int Reg(Model ml) { bool b = true; Visit vt = new Visit(); StringBuilder builder = new ...

  8. 利用反射自动生成SQL语句(仿Linq)

    转:http://www.cnblogs.com/the7stroke/archive/2012/04/22/2465597.html using System; using System.Colle ...

  9. Excel数据生成Sql语句的方法

    选中想要生成的列,套用表格格式,选中表包含标题的选项确定,然后在最右边的一列第二行处,点击函数功能,选择CONCATENATE,在文本里输入想要的结构即可  代码如下 复制代码 ,=CONCATENA ...

随机推荐

  1. 关于一个查询的JAVA界面,希望对你有启发

    package work2; import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JFrame; ...

  2. Python环境配置问题及解决办法

    Windows下用pip安装包时出现"error: Microsoft Visual C++ 9.0 is required"错误 error: Microsoft Visual ...

  3. 【面试向】hihoCoder 1994 树与落叶

    题目链接 Implementation int n, q; scan(n,q); vi p(n + 1); vi nson(n + 1); up (i, 1, n) { scan(p[i]); nso ...

  4. Java 错误:Constructor call must be the first statement in a constructor

    今天用学校里的黑马程序员通Java语法 想到了:在有参构造函数中调用无参构造函数 语法是这样的: class Person{ private int age; public Person() { Sy ...

  5. IO库中的宽字符语言

    wchar_t是C/C++的字符类型,是一种扩展的存储方式.wchar_t类型主要用在国际化程序的实现中,但它不等同于uni编码.uni编码的字符一般以wchar_t类型存. IO库为了支持宽字符语言 ...

  6. Luogu P4902 乘积

    题目 我们要求的是 \[ \prod\limits_{i=a}^b\prod\limits_{j=1}^i(\frac ij)^{\lfloor\frac ij\rfloor} \] 先把它拆开 \[ ...

  7. codeforces 816B Karen and Coffee (差分思想)

    题目链接 816B Karen and Coffee 题目分析 题意:有个人在学泡咖啡,因此看了很多关于泡咖啡温度的书,得到了n种推荐的泡咖啡温度范围[L1,R1] ,此人将有k种做法推荐的温度记为可 ...

  8. 第二大矩阵面积--(stack)牛客多校第二场-- Second Large Rectangle

    题意: 给你一幅图,问你第二大矩形面积是多少. 思路: 直接一行行跑stack求最大矩阵面积的经典算法,不断更新第二大矩形面积,注意第二大矩形可能在第一大矩形里面. #define IOS ios_b ...

  9. # 数字签名&数字证书

    目录 数字签名&数字证书 数字签名 数字证书 数字证书的实例(https协议) 数字签名&数字证书 参考资料: 数字签名是什么?-阮一峰的网络日志 数字签名和数字证书究竟是什么?知乎- ...

  10. 小白学习django第四站-关联数据库

    使用mysql连接django首先要配置好相关环境 首先在setting.py配置数据库信息(需要现在mysql中创建一个数据库) 在setting.py那个目录的__init__.py文件中写入 之 ...