.NET 利用反射将对象数据添加到数据库

 

一些小型的项目,在不使用其他的框架(LINQ,NHibernate,EF等等框架)的前提下,这时候一些反复的增删改查就会让我们感到极其的繁琐,厌烦,为了避免这种情况出现,本人写了一个小的工具类.自动将实体类添加到数据库.

实现功能的思路:

  1,通过反射获取该对象名称和所有属性名称,然后组合成insert SQL字符串

  (前提是对象属性名称和数据库字段名称一致,表名称和实体类名称一致.不区分大小写).

  2,通过反射获取该对象的每个属性值,并动态的往已经定义好的SqlParameter数组里添加SqlParameter,

  SqlParameter参数的名称与属性名称一致. 

  3,执行SQL。

开始代码:

  CODE_1,定义方法命名先,第一参数是需要插入数据的对象实例,第二个参数是自动增长的主键名称(不区分大小写)

public static int Insert(Object obj, string identityName)
{
}

  CODE_2,反射获取对象数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
StringBuilder commandText = new StringBuilder(" insert into ");
 Type type = obj.GetType();
string tableName = type.Name;//表名称
PropertyInfo[] pros = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);//所有字段名称
StringBuilder fieldStr = new StringBuilder();//拼接需要插入数据库的字段
  StringBuilder paramStr = new StringBuilder();//拼接每个字段对应的参数
int len = pros.Length;
  if (!"".Equals(identityName) && null != identityName) param = new SqlParameter[len-1];//如果有自动增长的字段,则该字段不需要SqlParameter
  int paramLIndex = 0;
  for (int i = 0; i < len; i++)
  {
    string fieldName = pros[i].Name;
      if (!fieldName.ToUpper().Equals(identityName.ToUpper()))
      {//非自动增长字段才加入SQL语句
        fieldStr.Append(fieldName);
          string paramName = "@" + fieldName;//SQL语句的字段名称和参数名称保持一致
            paramStr.Append(paramName);
          if (i < (len - 1))
          {
            fieldStr.Append(",");//参数和字段用逗号隔开
                paramStr.Append(",");
          }
          object val = type.GetProperty(fieldName).GetValue(obj, null);// 根据属性名称获取当前属性的值
            if (val == null) val = DBNull.Value;//如果该值为空的话,则将其转化为数据库的NULL
          param[paramLIndex] = new SqlParameter(fieldName, val);//给每个参数赋值
            paramLIndex++;
      }
   }
               
   commandText.Append(tableName);
   commandText.Append(" ( ");
   commandText.Append(fieldStr);
   commandText.Append(" ) values ( ");
   commandText.Append(paramStr);
   commandText.Append(" ) ");//拼接成完整的字符串
 
 DBHelp.ExcuteSave(commandText.ToString(), param)//执行该INSERT SQL 语句

最后一行执行SQL语句的代码就不需要再说了吧..... 

其实如果能自动生成指定数据库的实体类,那么又减轻的一些繁琐的工作,下一篇我将会写到如何根据指定的数据库生成简单的实体类

反射需要引用到的控件名称为

using System.Reflection;

SubSonic3.0使用外连接查询时查询不出数据的问题修改

  今天在开发时,要使用到外连接查询,如图

  

  老是查不出数据,所以就追踪了一下代码,发现查询后生成的SQL语句变成了内连接了,真是晕

  

  然后继续Debug,发现原来SqlQuery类在调用LeftInnerJoin函数时传入的Join.JoinType.LeftInner参数,并没有被CreateJoin函数使用上,如下图

  

  所以赶快修改为type,见图

  

  心想应该可以了吧......继续执行程序,发现还是没有查询出数据来~~~真是郁闷......继续Debug,发现SQL语句还是有问题,见图

  

  语句中多了一个INNER,所以查询直接爆错退出了,继续跟踪Debug,但是找来找去都没有发现在哪里组合语句的,@_@

  认真研究了一下,发现是从Join类的GetJoinTypeValue函数返回连接字符串的,如下图

  

  就尝试修改了一下返回的字串,见图

  

  最后执行程序,生成的SQL语句终于正常了

  

  这个Bug其实并不是很复杂,只要多使用Debug跟踪,多尝试修改(就算改错了也无所谓),才能找出问题所在

  

  本文章为原创内容,转载请保留下面信息。

  发表本编内容,只要主为了和大家共同学习共同进步,有兴趣的朋友可以加加Q群:SubSonic3.0学习群(327360708)或Email给我(1654937#qq.com),大家一起探讨,由于本人工作很繁忙,如果疑问请先留言,回复不及时也请谅解。

  想了解更多SubSonic3.0的相关问题,请观注博客:http://www.cnblogs.com/EmptyFS/

.NET 利用反射将对象数据添加到数据库的更多相关文章

  1. C#利用反射来判断对象是否包含某个属性的实现方法

    本文实例展示了C#利用反射来判断对象是否包含某个属性的实现方法,对于C#程序设计人员来说有一定的学习借鉴价值. 具体实现代码如下: /// <summary> /// 利用反射来判断对象是 ...

  2. tp 框架 利用反射实现对象调用方法

    <?php class Person{ public $name="xiaoming"; function say(){ echo "i am ".$th ...

  3. 利用反射修改final数据域

    当final修饰一个数据域时,意义是声明该数据域是最终的,不可修改的.常见的使用场景就是eclipse自动生成的serialVersionUID一般都是final的. 另外还可以构造线程安全(thre ...

  4. postman上传excel,java后台读取excel生成到指定位置进行备份,并且把excel中的数据添加到数据库

    最近要做个前端网页上传excel,数据直接添加到数据库的功能..在此写个读取excel的demo. 首先新建springboot的web项目 导包,读取excel可以用poi也可以用jxl,这里本文用 ...

  5. winform中利用反射实现泛型数据访问对象基类(3)

    继续完善了几点代码 满足没有主键的情况下使用 并且完善实体字段反射设置value时的类型转换 /// <summary> /// DAO基类 实体名必须要与数据表字段名一致 /// < ...

  6. winform中利用反射实现泛型数据访问对象基类(1)

    考虑到软件使用在客户端,同时想简化代码的实现,就写了一个泛型的数据访问对象基类,并不是特别健全,按道理应该参数化的方式实现insert和update,暂未使用参数化,抽时间改进. /// <su ...

  7. winform中利用反射实现泛型数据访问对象基类(2)

    在1的基础上做了一点改进 参数化处理 看上去更简洁 无主键情况下 update 方法需要改进 insert delete没有问题  /// <summary>     /// DAO基类 ...

  8. java利用反射获取对象前后修改的内容(用于日志记录)

    import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Metho ...

  9. 2018.5.11 Java利用反射实现对象克隆

    package com.lanqiao.demo; /** * 创建人 * @author qichunlin * */ public class Person { private int id; p ...

随机推荐

  1. django csrf_token生成

    django模板中生成csrf_token的不同方式 系统环境 CENTOS 6.4 python 2.7.6 django 1.7.1 当post提交表单的的时候,是需要 csrf_token的, ...

  2. Unity3D专访——真正的面试

    本来想写一系列的,一半的攻击,现在面试的水.人之奸,用大哥的话说,要走新手是做螺丝钉和抹布用的.还有一半是对出出学校的或者是自废武功转3d的朋友们提供一个比較有价值的參考. 只是我时间实在仓促.没有保 ...

  3. 突破IP限制动态替换代理ip。

    须要导入的两个jar包 实现的javabean <span style="font-size:18px;">package com.jx.po; public clas ...

  4. Github Pages 静态网页建站

    创建仓库 略.详见GitHub使用教程. 仓库属性设置 找Github Pages项.点击自己主动生成,依照提示操作,就会得到该项目的gh-pages 分支. 公布站点成功,地址为 http://ch ...

  5. Hibernate制图(两)——许多-于─关系映射

    上篇学习了Hibernate的基本映射,也就是单表映射,非常easy就能理解,可是对于关系数据库来说,表之间存在关系是比不可少的.关系数据库中存在的关系是通过主外键建立起来的.反应到Hibernate ...

  6. Hadoop与HBase中遇到的问题(续)java.io.IOException: Non-increasing Bloom keys异常

    在使用Bulkload向HBase导入数据中, 自己编写Map与使用KeyValueSortReducer生成HFile时, 出现了以下的异常: java.io.IOException: Non-in ...

  7. NET 2015

    .NET 2015 英文原文:Understanding .NET 2015 Understanding 翻译为了解或理解,对于 .NET 来说,2015 年注定会更加精彩,所以标题就用了“精彩”这个 ...

  8. MVC 5 Scaffolding多层架构代码生成向导开源项目

    asp.net MVC 5 Scaffolding多层架构代码生成向导开源项目(邀请你的参与)   Visual Studio.net 2013 asp.net MVC 5 Scaffolding代码 ...

  9. 上海及周边地区产品技术创业QQ群:98905958

    创业是一件骄傲的事,每一个行业里最棒人才都应该创业或參与创业或以一个创业者的心态进行职业远景规划: 创业是一件寻常的事,跟上班打工一样寻常,没有什么必须的前置条件才干够開始,也没有什么前置条件能保证我 ...

  10. ASP.NET MVC企业级项目框架

    ASP.NET MVC企业级项目框架 MVC项目搭建笔记---- 项目框架采用ASP.NET MVC+Entity Framwork+Spring.Net等技术搭建,搭建过程内容比较多,结合了抽象工厂 ...