C# ORM 反射与泛型的交叉应用 - 获取泛型与数据库对应字段的值并存入数据库

3 篇文章 0 订阅

废话 不说直入正题

步骤

  1. 获取泛型类型
  2. 获取泛型属性
  3. 由泛型属性匹配数据库字段
  4. 获取匹配成功的字段名称
  5. 获取匹配成功的属性值
  6. 建立 SQL 语句执行

代码

这里没有使用 SqlParameters ,考虑到参数类型是可变的,于是就使用了 StringBuilder 来创建字符串并完成拼接

private const string INSERT = "INSERT INTO dbo.Alvin";
public static int Create<TEntity>(TEntity entity) {
            using (var conn = SqlHelper.Instance.GetConnection())
            {
                Type type = typeof(TEntity);
                PropertyInfo[] infos = type.GetProperties();
                StringBuilder sbP = new StringBuilder();
                sbP.Append("(");
                StringBuilder sbV = new StringBuilder();
                sbV.Append(" VALUES(");
                foreach (var info in infos)
                {
                    object[] objs = info.GetCustomAttributes(typeof(FieldAttribute), false);
                    if (objs != null)
                    {
                        //获取字段名称
                        string s = ((FieldAttribute)objs[0]).Fields;
                        sbP.Append(s+",");
                        //Console.WriteLine("字段名称:{0}", ((FieldAttribute)objs[0]).Fields);
                        //通过type 获取对应的字段,然后通过 getvalue 获取到值
                       // Console.WriteLine("字段值:{0}", type.GetProperty(s).GetValue(entity, null));
                        //注意这里必须要加上 '' 否则存入的时候会在datatime的转换上出现问题导致崩溃
                        sbV.Append("'"+type.GetProperty(s).GetValue(entity, null) + "',");
                    }
                }
                //获取完所有值,去掉尾部 , 并添加上真正的尾部
                sbP.Append(")");
                sbP.Replace(",)", ")");
                sbV.Append(")");
                sbV.Replace(",)", ") SELECT SCOPE_IDENTITY()");
                string sql = INSERT + sbP.ToString() + sbV.ToString();
                //Console.WriteLine("SQL 语句:{0}", sql);
                //插入
                int insertedId = SqlHelper.Instance.ExecuteScalar<int>(conn,
                    sql, 
                    new List<SqlParameter>() { });
                return insertedId;
            }
        }

效果

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值