C#根据反射生成sql语句(Update语句)

  今天有人问我Update语句怎么搞,想了一下大致思路就是用特性去标识一下,主键,然后再去用反射的方式拼sql语句。

  想着晚上再写,又想了想的确好久没写博客了,也好久没正儿八经写代码了,就顺手给写了下来。



一、主键特性 

/// <summary>
    /// 主键特性(在实体类的上方加这个特性,指定该类的主键名称)
    /// </summary>
    [AttributeUsage(AttributeTargets.Class)]
    public class PrimaryKeyAttribute : Attribute
    {
        private PrimaryKeyAttribute()
        {

        }

        private string _name;

        /// <summary>
        /// 构造方法
        /// </summary>
        /// <param name="name"></param>
        public PrimaryKeyAttribute(string name)
        {
            _name = name;
        }

        /// <summary>
        /// 主键名称
        /// </summary>
        public string Name
        {
            get { return _name; }
        }
    }

  把这个特性加到实体类的上方,并指定主键名称,就可以了,示例:

二、拼写SQL语句

public class SqlBuilderHelper
    {
        /// <summary>
        /// 获得主键名称
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        private static string GetPK<T>() where T : class
        {
            string pkName = string.Empty;
            Type objTye = typeof(T);
            PrimaryKeyAttribute pk;
            foreach (Attribute attr in objTye.GetCustomAttributes(true))
            {
                pk = attr as PrimaryKeyAttribute;
                if (pk != null)
                    return pk.Name;
            }
            return pkName;
        }

        /// <summary>
        /// sql修改语句
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"></param>
        /// <param name="tableName"></param>
        /// <returns></returns>
        public static string UpdateSql<T>(T entity, string tableName) where T : class
        {
            if (entity == null || string.IsNullOrEmpty(tableName))
            {
                return string.Empty;
            }

            string pkName = GetPK<T>();

            if (string.IsNullOrEmpty(pkName))
            {
                return string.Empty;
            }

            string pkValue = string.Empty;

            StringBuilder sb = new StringBuilder();
            sb.Append("update ");
            sb.Append(tableName);
            sb.Append(" set ");
            Type type = entity.GetType();
            PropertyInfo[] props = type.GetProperties();
            List<string> paraList = new List<string>();
            foreach (var prop in props)
            {
                if (prop.Name == (string)pkName)
                {
                    pkValue = (string)prop.GetValue(entity);
                }
                else
                {
                    paraList.Add(GetUpdatePara(prop, entity));
                }
            }

            if (paraList.Count == 0)
            {
                return string.Empty;
            }

            sb.Append(string.Join(",", paraList));

            if (string.IsNullOrEmpty(pkValue))
            {
                throw new Exception("主键不能为空");
            }

            sb.Append(" where ");
            sb.Append(pkName);
            sb.Append(" = ");
            sb.AppendFormat("‘{0}‘", pkValue);

            return sb.ToString();
        }

        /// <summary>
        /// 获得修改参数
        /// </summary>
        /// <param name="property"></param>
        /// <returns></returns>
        private static string GetUpdatePara<T>(PropertyInfo property, T entity)
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat(" {0}=‘{1}‘ ", property.Name, property.GetValue(entity));
            return sb.ToString();
        }
    }

  用这个方法生成了一个语句,拿到库里面试了一下,完全ok。

  大功告成。  

原文地址:https://www.cnblogs.com/Yuuuuu/p/10237439.html

时间: 2024-10-06 22:08:15

C#根据反射生成sql语句(Update语句)的相关文章

SQL Server UPDATE语句的用法详解

SQL Server UPDATE语句用于更新数据,下面就为您详细介绍SQL Server UPDATE语句语法方面的知识,希望可以让您对SQL Server UPDATE语句有更多的了解. 现实应用中数据库中的数据改动是免不了的.通常,几乎所有的用户数据库中的大部分数据都要进行某种程度的修改.在SQL Server数据库中要想修改数据库记录,就需要用UPDATE语句,UPDATE语句就是为了改变数据库中的现存数据而存在的.这条语句虽然有一些复杂的选项,但确实是最容易学习的语句之一.这是因为在大

SQL的update语句

Update 语句 Update 语句用于修改表中的数据. 语法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 Person: LastName FirstName Address City Gates Bill Xuanwumen 10 Beijing Wilson   Champs-Elysees   更新某一行中的一个列 我们为 lastname 是 "Wilson" 的人添加 firstname: UPDATE Person SET First

8.INSERT INTO 语句 UPDATE 语句

1. INSERT INTO 语句 INSERT INTO 语句用于向表格中插入新的行. 语法 INSERT INTO 表名称 VALUES (值1, 值2,....) INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing') 我们也可以指定所要插入数据的列: INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....) INSERT INTO Persons

利用反射生成SQL语句

// 修改学员信息的方法 public bool ModifyStudent(MODEL.Students model) { // 利用反映获取类对所有属性,用来动态生成SQL语句 StringBuilder sbSql = new StringBuilder("update Students set "); // 先获得model 的Type类型 Type modeType = model.GetType(); // 通过Type类型得到它所有的公开属性 PropertyInfo[]

MySql依据查询结果,生成insert、update语句

场景:之前有一次测试宣讲中,同事直接用Navicat从查找结果中,直接生成insert语句,支持批量生成语句. 可应用场景:自动化.性能测试初始化数据.直接从现有库中将需要的数据内容查询出来,再生成对应的insert语句,插入到对应的测试目标数据库中,减少由于手工手成数据的冗余工作和导表的误操作. 工具需求:Navicat 11.0.18(老版本好像没有这功能) 步骤: 写出要导出的sql脚本,运行查询 在生成的结果中,选中所需要导出的行(支持Ctrl.Shift按键功能) 选中结果后,右键在选

【C#】通过反射生成sql

1.定义特性标志表或表字段 public class ExtendAttribute { /// <summary> /// 表示在自动生成SQL语句时,不处理该字段 /// </summary> [AttributeUsage(AttributeTargets.Property)] [Serializable] public class ExcludeFieldAttribute : Attribute { /// <summary> /// 获取元数据的特性 ///

用反射来生成SQL的CREATE语句

下面的程序使用R纽约娱乐城eflection来构造"CREATE TABLE"的sql语句.如果你不是很熟悉反射机制,可以从这个程序中看看反射的魅力与作用. <?php /** * Creates an SQL 'Create Table' based upon an entity * * @author Chris Tankersley <[email protected]> * @copyright 2010 Chris Tankersley * @package

根据反射生成SQL语句

1 /** 2 * 基础查询语句 3 * 返回类型的属性字符串Sql 4 * @author: InkYi 5 * 修改时间:2016年5月11日 - 上午10:06:00<br/> 6 * 功能说明:<br/> 7 * @param clazz 8 * @return "id,name,sex....." 9 */ 10 private String baseSelectSQL(Class clazz){ 11 StringBuffer sb = new St

[SQL] MSSQL update 语句中的关联

将tableA 表中的所有title 用tableB中的titlename 更新掉,如果tableB中存在对应的关系 update tableA as a set a.title = (select b.titlename from tableB as b where a.id =b.xid) 上面的写法,无法在MSSQL中进行执行,因此 我们可以使用函数变相 脚本 传入参数相同 update tableA set title =fn_getXTitle(id) fn_getXTitle ALT