.NET 利用反射将对象数据添加到数据库
.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 利用反射将对象数据添加到数据库的更多相关文章
- C#利用反射来判断对象是否包含某个属性的实现方法
本文实例展示了C#利用反射来判断对象是否包含某个属性的实现方法,对于C#程序设计人员来说有一定的学习借鉴价值. 具体实现代码如下: /// <summary> /// 利用反射来判断对象是 ...
- tp 框架 利用反射实现对象调用方法
<?php class Person{ public $name="xiaoming"; function say(){ echo "i am ".$th ...
- 利用反射修改final数据域
当final修饰一个数据域时,意义是声明该数据域是最终的,不可修改的.常见的使用场景就是eclipse自动生成的serialVersionUID一般都是final的. 另外还可以构造线程安全(thre ...
- postman上传excel,java后台读取excel生成到指定位置进行备份,并且把excel中的数据添加到数据库
最近要做个前端网页上传excel,数据直接添加到数据库的功能..在此写个读取excel的demo. 首先新建springboot的web项目 导包,读取excel可以用poi也可以用jxl,这里本文用 ...
- winform中利用反射实现泛型数据访问对象基类(3)
继续完善了几点代码 满足没有主键的情况下使用 并且完善实体字段反射设置value时的类型转换 /// <summary> /// DAO基类 实体名必须要与数据表字段名一致 /// < ...
- winform中利用反射实现泛型数据访问对象基类(1)
考虑到软件使用在客户端,同时想简化代码的实现,就写了一个泛型的数据访问对象基类,并不是特别健全,按道理应该参数化的方式实现insert和update,暂未使用参数化,抽时间改进. /// <su ...
- winform中利用反射实现泛型数据访问对象基类(2)
在1的基础上做了一点改进 参数化处理 看上去更简洁 无主键情况下 update 方法需要改进 insert delete没有问题 /// <summary> /// DAO基类 ...
- java利用反射获取对象前后修改的内容(用于日志记录)
import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Metho ...
- 2018.5.11 Java利用反射实现对象克隆
package com.lanqiao.demo; /** * 创建人 * @author qichunlin * */ public class Person { private int id; p ...
随机推荐
- hibernate tools连接数据报错
报如下的错误: An internal error occurred during: "Fetching children of Database". org.slf4j.spi. ...
- winform 实现选择的城市名单
首先在地图上 #region 选择城市 /// <summary> /// 点击字母事件 /// </summary> /// <param name="sen ...
- ThinkPHP神秘应用架构扩展
ThinkPHP应用模式提供了机会,改变核心框架.它可以让你的应用程序,以适应环境和其他许多不同的需求. 每一个应用模式都有自己的模式定义文件,相对与ThinkPHP3.1版本号.ThinkPHP3. ...
- 换行符以及for循环的优化
string str = ""; for (int i = 0; i < _errlistCusEmailInfo.Count; i++) ...
- 将firebug安装在chrome浏览器上
一直很喜欢火狐浏览器,原因是火狐的插件很喜欢,几天突然发现firebug这个插件能够安装在chrome浏览器上,震惊,更震惊的是这个好似已经很长时间了,而我猜发现. 具体的具体页面地址是 http:/ ...
- hdu 4893 Wow! Such Sequence!
http://acm.hdu.edu.cn/showproblem.php?pid=4893 三种操作: 1 k d - "add" 2 l r - "query sum ...
- CentOs Linux 安装MySql服务失败 安装需要依靠包error:Failed dependencies
[root@sh158-xen data]#rpm -ivh MySQL-server-5.5.24-1.linux2.6.x86_64.rpm error: Failed dependencies: ...
- css3中display和box小结
display:table用处: 1.创建登高列 2.实现大小不确定元素的垂直居中 3.容器内子项目数目未知,子项目平均分配容器的水平空间 float必须指定其宽度才行,不确定的话就用display: ...
- HBuilder HTML 自定义代码块
=begin 本文档是HTML代码块的编辑文件.注意不要把其他语言的设置放到html里来. HBuilder可使用ruby脚本来编辑代码块和增强操作命令. 1.编辑代码块 如果要新增一个代码块,复制如 ...
- leetcode第21题--Generate Parentheses
problem: Given n pairs of parentheses, write a function to generate all combinations of well-formed ...