利用反射自动生成SQL语句(仿Linq)
转:http://www.cnblogs.com/the7stroke/archive/2012/04/22/2465597.html
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Data;
public class SQLHelper
{
/// <summary>
/// 插入单个实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <returns></returns>
public static int Insert<T>(T entity)
{
#region 生成 SQL 语句
Type type = typeof(T);
string sql = "INSERT INTO [" + type.Name + "] (";
string colsName = string.Empty;
string colsValues = string.Empty;
foreach (PropertyInfo item in type.GetProperties())
{
if (item.Name.ToLower() == "id") //不插入自动增长列
continue;
if (item.GetValue(entity, null) == null) //null值也不插入
continue;
colsName += "[" + item.Name + "],";
if (item.PropertyType.ToString().Contains("String") || item.PropertyType.ToString().Contains("Date"))
colsValues += "'" + item.GetValue(entity, null) + "',";
else
colsValues += item.GetValue(entity, null) + ",";
}
colsName = colsName.Substring(0, colsName.LastIndexOf(',')); //不要最后一个 ,
colsValues = colsValues.Substring(0, colsValues.LastIndexOf(',')); //不要最后一个 ,
sql += colsName + ") VALUES ( " + colsValues + ")";
#endregion
return DBHelperSQL.ExecuteNonQuery(sql);
}
/// <summary>
/// 插入多个实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="ListEntity"></param>
public static void Insert<T>(List<T> ListEntity)
{
#region 生成 SQL 语句
List<string> sqlList = new List<string>();
foreach (var entity in ListEntity)
{
Type type = entity.GetType();
string sql = "INSERT INTO [" + type.Name + "] (";
string colsName = string.Empty;
string colsValues = string.Empty;
foreach (PropertyInfo item in type.GetProperties())
{
if (item.Name.ToLower() == "id") //不插入自动增长列
continue;
if (item.GetValue(entity, null) == null) //null值也不插入
continue;
colsName += "[" + item.Name + "],";
if (item.PropertyType.ToString().Contains("String") || item.PropertyType.ToString().Contains("Date"))
colsValues += "'" + item.GetValue(entity, null) + "',";
else
colsValues += item.GetValue(entity, null) + ",";
}
colsName = colsName.Substring(0, colsName.LastIndexOf(',')); //不要最后一个 ,
colsValues = colsValues.Substring(0, colsValues.LastIndexOf(',')); //不要最后一个 ,
sql += colsName + ") VALUES ( " + colsValues + ");";
sqlList.Add(sql);
}
#endregion
DBHelperSQL.ExcuteTransactionSql(sqlList);
}
/// <summary>
/// 删除单个实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="Id"></param>
/// <returns></returns>
public static int Delete<T>(int Id)
{
Type type = typeof(T);
string sql = "DELETE [" + type.Name + "] WHERE Id IN ( " + Id + ")";
return DBHelperSQL.ExecuteNonQuery(sql);
}
/// <summary>
/// 删除单个实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="Id"></param>
/// <returns></returns>
public static int Delete<T>(T entity)
{
Type type = typeof(T);
string sql = "DELETE [" + type.Name + "] WHERE Id IN ( ";
foreach (PropertyInfo item in type.GetProperties())
{
if (item.Name.ToLower() == "id") //不插入自动增长列
{
sql += item.GetValue(entity,null) + ")";
break;
}
}
return DBHelperSQL.ExecuteNonQuery(sql);
}
/// <summary>
/// 删除多个实体
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="Ids">Id 数组</param>
/// <returns></returns>
public static int Delete<T>(int[] Ids)
{
Type type = typeof(T);
string sql = "DELETE [" + type.Name + "] WHERE Id IN ( ";
foreach (var item in Ids)
{
sql += Ids + ",";
}
sql = sql.Substring(0, sql.LastIndexOf(',')); //不要最后一个 ,
sql += " )";
return DBHelperSQL.ExecuteNonQuery(sql);
}
/// <summary>
/// 删除多个实体
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listEntity">实体数组</param>
/// <returns></returns>
public static int Delete<T>(List<T> listEntity)
{
if (listEntity == null || listEntity.Count == 0)
{
return 0;
}
Type type = typeof(T);
string sql = "DELETE [" + type.Name + "] WHERE Id IN ( ";
foreach (var entity in listEntity)
{
foreach (PropertyInfo property in entity.GetType().GetProperties())
{
if (property.Name.ToLower() == "id") //不插入自动增长列
{
sql += property.GetValue(entity, null) + ",";
break;
}
}
}
sql = sql.Substring(0, sql.LastIndexOf(',')); //不要最后一个 ,
sql += " )";
return DBHelperSQL.ExecuteNonQuery(sql);
}
/// <summary>
/// 修改单个实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <returns></returns>
public static int Update<T>(T entity)
{
#region 生成 SQL 语句
Type type = typeof(T);
string sql = "UPDATE [" + type.Name + "] SET ";
object ID = 0;
foreach (PropertyInfo item in type.GetProperties())
{
if (item.Name.ToLower() == "id") //不插入自动增长列
{
ID = item.GetValue(entity, null);
continue;
}
if (item.GetValue(entity, null) == null) //null值也不插入
continue;
sql += "[" + item.Name + "]=";
if (item.PropertyType.ToString().Contains("String") || item.PropertyType.ToString().Contains("Date"))
sql += "'" + item.GetValue(entity, null) + "',";
else
sql += item.GetValue(entity, null) + ",";
}
sql = sql.Substring(0, sql.LastIndexOf(',')); //不要最后一个,
sql += " WHERE ID=" + ID;
#endregion
return DBHelperSQL.ExecuteNonQuery(sql);
}
/// <summary>
/// 根据ID获取单个实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="ID"></param>
/// <returns></returns>
public static T Get<T>(int ID)
{
#region 生成 SQL 语句
Type type = typeof(T);
string sql = "SELECT * FROM [" + type.Name + "] WHERE ID=" + ID;
#endregion
return DBHelperSQL.ExecuteDataTable(sql).ToSingleEntity<T>();
}
/// <summary>
/// 获取所有实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static List<T> Get<T>()
{
#region 生成 SQL 语句
Type type = typeof(T);
string sql = "SELECT * FROM [" + type.Name + "]";
#endregion
return DBHelperSQL.ExecuteDataTable(sql).ToListEntity<T>();
}
/// <summary>
/// 根据条件查询得到多个实例 (不分页)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="condition"></param>
/// <returns></returns>
public static List<T> Get<T>(T condition)
{
#region 生成 SQL 语句
Type type = typeof(T);
string sql = "SELECT * FROM [" + type.Name + "] WHERE 1=1";
foreach (PropertyInfo item in type.GetProperties())
{
#region 不加条件处理
if (item.GetValue(condition, null) == null) //null值 不加条件
continue;
if (item.PropertyType.ToString().Contains("Int")) //整形为 -1 时不加条件
{
if (item.GetValue(condition, null).ToString().Equals("-1"))
{
continue;
}
}
else if (item.PropertyType.ToString().Contains("Decimal")) //整形为 -1 时不加条件
{
if (item.GetValue(condition, null).ToString().Equals("-1"))
{
continue;
}
}
#endregion
sql += " AND [" + item.Name + "] ";
if (item.PropertyType.ToString().Contains("String") ) //字符串形用模糊查询
sql += " LIKE "+ "'%" + item.GetValue(condition, null) + "%'";
else if (item.PropertyType.ToString().Contains("Date")){ //日期类型
}else{
sql += " = "+ item.GetValue(condition, null) + "";
}
}
#endregion
return DBHelperSQL.ExecuteDataTable(sql).ToListEntity<T>();
}
/// <summary>
/// 根据条件查询得到多个实例 (带分页)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="condition"></param>
/// <returns></returns>
public static List<T> Get<T>(T condition, int pageIndex, int pageSize, ref int totalCount)
{
#region 生成 SQL 语句
Type type = typeof(T);
string sql = "SELECT TOP " + pageSize + " * FROM [" + type.Name + "] WHERE (ID NOT IN (SELECT TOP " + (pageIndex - 1) * pageSize + " ID FROM [" + type.Name + "] WHERE 1=1 ";
StringBuilder sb = new StringBuilder();
foreach (PropertyInfo item in type.GetProperties())
{
#region 不加条件处理
if (item.GetValue(condition, null) == null) //null值 不加条件
continue;
if (item.PropertyType.ToString().Contains("Int")) //整形为 -1 时不加条件
{
if (item.GetValue(condition, null).ToString().Equals("-1"))
{
continue;
}
}
else if (item.PropertyType.ToString().Contains("Decimal")) //整形为 -1 时不加条件
{
if (item.GetValue(condition, null).ToString().Equals("-1"))
{
continue;
}
}
#endregion
sb.Append(" AND [" + item.Name + "] ");
if (item.PropertyType.ToString().Contains("String")) //字符串形用模糊查询
sql += " LIKE " + "'%" + item.GetValue(condition, null) + "%'";
else if (item.PropertyType.ToString().Contains("Date"))
{ //日期类型
}
else
{
sql += " = " + item.GetValue(condition, null) + "";
}
}
sql += sb.ToString() + "ORDER BY ID )) ORDER BY ID ";
//总记录数
string sqlForCount = "SELECT COUNT(*) FROM [" + type.Name + "] WHERE 1=1 " + sb.ToString();
string count = DBHelperSQL.ExecuteString(sqlForCount);
totalCount = string.IsNullOrEmpty(count) ? 0 : int.Parse(count);
#endregion
return DBHelperSQL.ExecuteDataTable(sql).ToListEntity<T>();
}
}
利用反射自动生成SQL语句(仿Linq)的更多相关文章
- springboot+mybatis+mysql 利用mybatis自动生成sql语句
工具和环境 idea,mysql,JDK1.8 效果图如下 结构图如下 java resources sql文件 /* Navicat MySQL Data Transfer Source Serve ...
- 使用Excel自动生成sql语句
在近一段日子里,进入了新的项目组,由于项目需要,经常要将一些Excel表中的数据导入数据库中,以前并没有过多的接触过数据导入与数据处理,对于我来说比较痛苦,今天下午花了几个小时处理数据,但是同事给我提 ...
- 使用sqlmetal工具自动生成SQL数据库的Linq类文件
第一部:找到sqlmetal.exe. 运行cmd. 执行命令 cd C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5 ...
- 根据DELTA自动生成SQL语句
上传客户端的CLIENTDATASET.delta到服务器的clientdataset.data,服务端解析clientdataset的数据生成相应的SQL语句. 相对于直接调用datasetprov ...
- 城市联动 - 自动生成SQL语句
字段比较简单/ 如果有需要可以自己定制字段和排序/ 一共二级城市联动, 本人业务需要, 所以就两层, 网上关于三层的挺多, 有需要可以借鉴/ 废话不多说, 先看效果图, 代码在下面 <?php ...
- Excel 提供数据 更新或者插入数据 通过函数 自动生成SQL语句
excel 更新数据 ="UPDATE dbo.yt_vehicleExtensionBase SET yt_purchase_date='"&B2&"' ...
- 打开powerDesigner时,创建table对应的自动生成sql语句没有注释
在创建pdm时由于需要在name列填写的是以后要在表中创建的注释信息,comment中则写的说明信息字数比较多.默认情况下在生成建表sql时不能将name生成注释信息,进行如下设置可以讲name生成注 ...
- 利用反射动态构成sql语句
class Program { static void Main(string[] args) { People p = new Peo ...
- 使用Java注解开发自动生成SQL
使用注解开发的好处就是减少配置文件的使用.在实际过程中,随着项目越来越复杂,功能越来越多,会产生非常多的配置文件.但是,当配置文件过多,实际维护过程中产生的问题就不容易定位,这样就会徒劳的增加工作量. ...
随机推荐
- 微软发布WP SDK8.0 新增语音、应用内支付等原生API
http://www.csdn.net/article/2012-10-31/2811338-windows-phone-8-sdk 京时间10月30日,微软在旧金山举行新一代手机操作系统Window ...
- 如何深入理解 StatsD 与 Graphite ?
众所周知,StatsD 负责收集并聚合测量值.之后,它会将数据传给 Graphite,后者以时间序列为依据存储数据,并绘制图表.但是,我们不知道,基于 http 访问的图表在展示时,是基于每秒钟的请求 ...
- POJ2488A Knight's Journey
http://poj.org/problem?id=2488 题意 : 给你棋盘大小,判断马能否走完棋盘上所有格子,前提是不走已经走过的格子,然后输出时按照字典序排序的第一种路径 思路 : 这个题吧, ...
- 超实用js代码段一
1: 过滤首尾空格trim.2:过滤左边空格ltrim 3:过滤右边空格 一:用正则方法写成三个函数. <script type="text/javascript" ...
- 前台将勾选的多个属性放到一个value里面,是一个字符串,传到后台
jq function changeStreet(a){ var valk=$(a).html(); $(a).parents(".select_box").children(&q ...
- JavaEE5种常见的设计模式
1.工厂模式:比如你写了个应用,里面用到了数据库的封装,你的应用可以今后需要在不同的数据库环境下运行,可能是oracle,db2,sql server等, 那么连接数据库的代码是不一样的,你用传统的方 ...
- avi 格式详解
http://blog.csdn.net/becomly/article/details/6283004 http://blog.csdn.net/easecom/article/details/45 ...
- mysql建表时拆分出常用字段和不常用字段
一对一 一张表的一条记录一定只能与另外一张表的一条记录进行对应,反之亦然. 学生表:姓名,性别,年龄,身高,体重,籍贯,家庭住址,紧急联系人 其中姓名.性别.年龄.身高,体重属于常用数据,但是籍贯.住 ...
- iOS 中有用的开源库
youtube下载神器:https://github.com/rg3/youtube-dl vim插件:https://github.com/Valloric/YouCompleteMe vim插件配 ...
- TCL语言笔记:TCL过程控制练习
1.青蛙爬井 for {set day 1;set cur 7} {$cur<77} {incr cur 2 ;incr day } { } puts $day 2.求1加到100 proc g ...