ADO.NET 根据实体类自动生成添加修改语句仅限Oracle使用
话不多说直接上代码,新手上路,高手路过勿喷,请多多指教。
/// <summary>
/// 等于号
/// </summary>
private readonly static string eq = string.Format(string.Empty + Convert.ToChar() + Convert.ToChar() + Convert.ToChar()); /// <summary>
/// 条件变量
/// </summary>
private readonly static string where = string.Format(string.Empty + Convert.ToChar() + "WHERE 1" + eq + "" + Convert.ToChar()); /// <summary>
/// 异常信息
/// </summary>
private readonly static string errInfo = string.Format("传入的key不存在"); /// <summary>
/// 录入信息存在风险
/// </summary>
private readonly static string injection = string.Format("录入信息存在风险");
/// <summary>
/// 添加Sql语句函数 fg
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <param name="key">主键名称,必须是实体对象中存在</param>
/// <param name="value">主键值(序列)</param>
/// <param name="outmsg"></param>
/// <returns>fg: 添加根据实体类接收的数据进行拼接sql语句</returns>
public static string Added<T>(T t, string key, string value, out string outmsg)
{
bool blo = false;
outmsg = string.Empty;
string sql = string.Empty, error = string.Empty;
StringBuilder sqlField = new StringBuilder();
StringBuilder sqlValue = new StringBuilder();
try
{
if (t == null)
return sql;
if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(value))
throw new Exception("对象实例化失败,请检查主键是否正确"); Type type = t.GetType();
sqlField.AppendFormat("INSERT INTO " + type.Name + Convert.ToChar() + Convert.ToChar());
sqlValue.AppendFormat(Convert.ToChar() + "VALUES" + Convert.ToChar());
sqlField.AppendFormat(key);
sqlValue.AppendFormat(value);
PropertyInfo[] props = type.GetProperties();
blo = props.Any(o => o.Name.ToUpper() != key);
if (!blo)
throw new Exception(errInfo); Parallel.ForEach(props, p =>
{
if (p.Name.Equals(key))
return;
if (p.GetValue(t, null) == null)
return; switch (p.PropertyType.Name)
{
case "String":
var tmp = (string)p.GetValue(t, null);
blo = VerificationHelper.VerificationByStr(tmp);
if (!blo)
error = string.Format(injection);
sqlField.AppendFormat(", " + p.Name);
sqlValue.AppendFormat(", '" + (string.IsNullOrEmpty(tmp) ? tmp : tmp.Contains("'") ? tmp.Replace("'", "''") : tmp.Trim()) + "'");
break;
case "DateTime":
sqlField.AppendFormat(", " + p.Name);
sqlValue.AppendFormat(", TO_DATE('" + p.GetValue(t, null) + "','YYYY-MM-DD HH24:MI:SS')");
break;
default:
sqlField.AppendFormat(", " + p.Name);
sqlValue.AppendFormat(", '" + p.GetValue(t, null) + "'");
break;
}
});
if (!string.IsNullOrEmpty(error))
throw new Exception(error);
sqlField.AppendFormat(string.Empty + Convert.ToChar());
sqlValue.AppendFormat(string.Empty + Convert.ToChar());
sql = sqlField + sqlValue.ToString();
return sql;
}
catch (Exception ex)
{
outmsg = ex.Message;
}
return sql;
} /// <summary>
/// 修改 sql 方法函数
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <param name="key">主键,必须是实体对象中存在的字段</param>
/// <param name="value">主键值</param>
/// <param name="outmsg"></param>
/// <returns>fg: 修改函数封装根据接收的实体对象生成sql修改语句</returns>
public static string Edited<T>(T t, string key, string value, out string outmsg)
{
bool blo = false;
outmsg = string.Empty;
string sql = string.Empty, error = string.Empty, fieldVars = string.Empty;
StringBuilder sqlstr = new StringBuilder();
StringBuilder newSql = new StringBuilder();
try
{
if (t == null)
return sql;
if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(value))
throw new Exception("对象实例化失败,请检查主键是否正确");
key = key.ToUpper();
Type type = t.GetType();
PropertyInfo[] props = type.GetProperties();
sqlstr.AppendFormat("UPDATE" + Convert.ToChar() + type.Name + Convert.ToChar() + "SET" + Convert.ToChar());
blo = props.Any(o => o.Name.ToUpper() != key);
if (!blo)
throw new Exception(errInfo);
Parallel.ForEach(props, p =>
{
fieldVars = p.Name.ToUpper();
if (fieldVars.Equals(key))
return;
if (p.GetValue(t, null) == null)
return; switch (p.PropertyType.Name)
{
case "String":
var tmp = (string)p.GetValue(t, null);
tmp = tmp.ToUpper();
blo = VerificationHelper.VerificationByStr(tmp);
if (!blo)
error = string.Format(injection);
sqlstr.AppendFormat(fieldVars + eq + "'" + (string.IsNullOrEmpty(tmp) ? tmp : tmp.Contains("'") ? tmp.Replace("'", "''") : tmp.Trim()) + "', ");
break;
case "DateTime":
sqlstr.AppendFormat(fieldVars + eq + "TO_DATE('" + p.GetValue(t, null) + "','YYYY-MM-DD HH24:MI:SS'), ");
break;
default:
sqlstr.AppendFormat(fieldVars + eq + "'" + p.GetValue(t, null) + "', ");
break;
}
});
if (!string.IsNullOrEmpty(error))
throw new Exception(error);
sql = sqlstr.ToString().Remove(sqlstr.Length - );
sqlstr.Clear();
sqlstr.AppendFormat(sql);
sqlstr.AppendFormat(where + "AND" + Convert.ToChar() + key + eq + value);
sql = sqlstr.ToString();
return sql;
}
catch (Exception ex)
{
outmsg = ex.Message;
}
return sql;
} /// <summary>
/// 根据条件修改 sql 方法函数
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <param name="condition">修改条件,直接写条件即可</param>
/// <param name="outmsg"></param>
/// <returns>fg: 修改函数封装根据接收的实体对象生成sql修改语句</returns>
public static string Editeds<T>(T t, string key, string condition, out string outmsg)
{
bool blo = false;
outmsg = string.Empty;
string sql = string.Empty, error = string.Empty, tmpstr = string.Empty;
StringBuilder sqlstr = new StringBuilder();
StringBuilder newSql = new StringBuilder(); try
{
if (t == null)
return sql;
if (string.IsNullOrEmpty(condition))
throw new Exception("请先完善条件后,再尝试");
else
condition = condition.Trim();
string[] array = condition.Split(' ');
string str = array.FirstOrDefault();
str = str.ToUpper();
if (str.Equals("OR"))
throw new Exception("拼接条件部分开始不能使用\"OR\"关键字");
if (str.Equals("AND"))
{
array[] = string.Empty;
foreach (var item in array)
tmpstr += item + Convert.ToChar();
}
else
tmpstr = condition; Type type = t.GetType();
PropertyInfo[] props = type.GetProperties();
sqlstr.AppendFormat("UPDATE" + Convert.ToChar() + type.Name + Convert.ToChar() + "SET" + Convert.ToChar());
blo = props.Any(o => o.Name.ToUpper() != key);
if (!blo)
throw new Exception(errInfo); Parallel.ForEach(props, p =>
{
if (p.Name.Equals(key))
return;
if (p.GetValue(t, null) == null)
return; switch (p.PropertyType.Name)
{
case "String":
var tmp = (string)p.GetValue(t, null);
blo = VerificationHelper.VerificationByStr(tmp);
if (!blo)
error = string.Format(injection);
sqlstr.AppendFormat(p.Name + eq + "'" + (string.IsNullOrEmpty(tmp) ? tmp : tmp.Contains("'") ? tmp.Replace("'", "''") : tmp.Trim()) + "', ");
break;
case "DateTime":
sqlstr.AppendFormat(p.Name + eq + "TO_DATE('" + p.GetValue(t, null) + "','YYYY-MM-DD HH24:MI:SS'), ");
break;
default:
sqlstr.AppendFormat(p.Name + eq + "'" + p.GetValue(t, null) + "', ");
break;
}
});
if (!string.IsNullOrEmpty(error))
throw new Exception(error);
sql = sqlstr.ToString().Remove(sqlstr.Length - );
sqlstr.Clear();
sqlstr.AppendFormat(sql);
sqlstr.AppendFormat(where + "AND" + Convert.ToChar() + tmpstr);
sql = sqlstr.ToString();
return sql;
}
catch (Exception ex)
{
outmsg = ex.Message;
}
return sql;
}
/// <summary>
/// 验证帮助类
/// </summary>
public class VerificationHelper
{
private static string sqlinjectStr = "=;--;delete ;drop ;alert ;insert ;and ;or ;";
/// <summary>
/// 验证字符串是否存在sql注入
/// </summary>
/// <param name="str">验证字符串</param>
/// <returns>不存在则验证通过,返回true,否则返回false</returns>
public static bool VerificationByStr(string str)
{
string[] strarr = sqlinjectStr.Split(';');
bool result = true;
string itemstr = string.Empty;
if (string.IsNullOrEmpty(str))
{
return true;
}
else
{
str = str.ToLower().Trim();
foreach (string item in strarr)
{
if (!string.IsNullOrEmpty(item))
{
if (str.IndexOf(item) > - || str.Contains(item))
{
itemstr = item;
result = false;
break;
}
} }
}
return result;
}
}
原创不易,作者地址:https://www.cnblogs.com/FGang/p/11179086.html
ADO.NET 根据实体类自动生成添加修改语句仅限Oracle使用的更多相关文章
- SpringBoot集成JPA根据实体类自动生成表
数据库是mysql,在application.properties中的写法如下: 原来配置这样的时候确实可以生产表的 #spring.jpa.hibernate.ddl-auto=update 多方查 ...
- eclipse类自动生成注释
1.创建新类时自动生成注释 window->preference->java->code styple->code template 当你选择到这部的时候就会看 ...
- h5 录音 自动生成proto Js语句 UglifyJS-- 对你的js做了什么 【原码笔记】-- protobuf.js 与 Long.js 【微信开发】-- 发送模板消息 能编程与会编程 vue2入坑随记(二) -- 自定义动态组件 微信上传图片
得益于前辈的分享,做了一个h5录音的demo.效果图如下: 点击开始录音会先弹出确认框: 首次确认允许后,再次录音不需要再确认,但如果用户点击禁止,则无法录音: 点击发送 将录音内容发送到对话框中.点 ...
- Entity Framewrok 7beta7中不同版本sql server自动生成分页sql语句的问题
在EF中,使用linq进行分页是很方便的,假如我们有一个EMP表,结构如下: public class Emp { [Key] public Guid No { get; set; } public ...
- Hibrenate实现根据实体类自动创建表或添加字段
Hibernate支持自动建表,在开发阶段很方便,可以保证hbm与数据库表结构的自动同步. 实现: 在配置hibernate的配置文件中将hbm2ddl.auto设置为update,如:Xml代码&l ...
- Do You Kown Asp.Net Core - 根据实体类自动创建Razor Page CURD页面模板
Scaffolding Template Intro 我们知道在Asp.Net MVC中,如果你使用的EF的DBContext的话,你可以在vs中通过右键解决方案-添加控制器-添加包含视图的控制器,然 ...
- JSon实体类快速生成插件 GsonFormat 1.2.0
写在前头:本插件只适用 android studio和 Intellij IDEA 工具,eclipse 的少年无视我吧!!! 这是一个根据JSONObject格式的字符串,自动生成实体类参数. gi ...
- 【原创】Hibernate通过实体类自动建表时type=MyISAM的问题
ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 当使用的mysql数据库为5.5版本时,方言需要设置为 <property name="hibernate.dialect&q ...
- IntelliJ IDEA 2017版 spring-boot 实现jpa基本部署,通过实体类自动建立数据库
一.添加Spring Boot JPA-Hibernate步骤 1.在pom.xml添加mysql,spring-data-jpa依赖 2.在application.properties文件 ...
随机推荐
- 201871010136-赵艳强《面向对象程序设计(java)》第十五周学习总结
201871010136-赵艳强<面向对象程序设计JAVA>第十五周实验总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh 这 ...
- python字符串的split replace strip
split replace strip是字符串中内置的三个函数,作用分别是分割 替换 去空格 0x01:split split(a,b):用指定的字符(a)分割字符串,可以限制分割的次数(b),返回一 ...
- TiDB 学习资料
学习资料 网址 官网 https://pingcap.com/docs-cn/stable/
- uiautomator手动调试与快速高度设置
创建java工程:Demo1包名:com.bing.cn类名:Test测试用例:testDemo android create uitest-project -n Demo1 -t 7 -p E:\e ...
- zz阿里小蜜—智能服务技术实践及场景探索(AI先行者大会)Final.pdf
SLQA+ 模型
- [LeetCode] 617. Merge Two Binary Trees 合并二叉树
Given two binary trees and imagine that when you put one of them to cover the other, some nodes of t ...
- nginx小知识
What Nginx是一款轻量级的Web服务器.反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用. 反向代理 当我们在外网访问百度的时候,其实会进行一个转发,代理到内 ...
- 转 A 、B两张表,找出ID字段中,存在A表,但是不存在B表的数据
A.B两张表,找出ID字段中,存在A表,但是不存在B表的数据,A表总共13W数据,去重后大约3万条数据,B表有2W条数据,且B表的ID有索引. 方法一 使用not in,容易理解,效率低. selec ...
- HTML+css基础 img 标签的属性
img: src=”” src是标签的属性 等号右边是属性值.就是图片的路径. 路径 1. 绝对路径:按照一个路径能找到,具体到某一个盘符下,某一个文件夹内. 2. 相对路径:以当前页面为参考物,去查 ...
- Hbase源码之 compact源码(二)
compact一中介绍了HBASE compact的调度流程,本篇文章主要介绍实际进行compact的过程.先从上文中的chore中接入,在HRegionserver中的compactChecker ...