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文件 ...
随机推荐
- svn服务器端程序安装(二)
1.下载 Setup-Subversion-1.8.9-1.msi 2. 双击,一直next (1) 修改安装地址,要求是非中文无空格 3. 安装完成后,检查是否已添加到系统的环境变量PATH中,若没 ...
- shell脚本的输入以及脚本拥有特效地输出
shell脚本的输入以及脚本拥有特效地输出 shell脚本输入之read命令 之前是直接在sh 后加参数 现在是另一种方式 语法:read -参数 -p:给出提示符.默认不支持"\n&quo ...
- 洛谷 SP9722 CODESPTB - Insertion Sort
洛谷 SP9722 CODESPTB - Insertion Sort 洛谷传送门 题目描述 Insertion Sort is a classical sorting technique. One ...
- VIJOS-P1325 桐桐的糖果计划
VIJOS-P1325 桐桐的糖果计划 JDOJ 1432 桐桐的糖果计划 https://neooj.com/oldoj/problem.php?id=1432 Description 桐桐很喜欢吃 ...
- NOIP 2012 借教室
洛谷 P1083 借教室 https://www.luogu.org/problem/P1083 JDOJ 1783: [NOIP2012]借教室 D2 T2 https://neooj.com/ol ...
- P256 VRF实现解读
目录 P256 VRF实现及其改造 公式推导 H1:把任意信息映射到曲线上的点 H2: 映射任意信息为(1,q) 计算随机数 随机数的proof 如何验证 VRF优点 针对S256曲线的改造 1. 使 ...
- Excel引用和数学函数
1.indirect函数--引用函数 indirect 英 [ˌɪndəˈrekt] 美 [ˌɪndəˈrekt] adj. 间接的;附带的;闪烁其词的;拐弯抹角的;迂回的;弯曲的 indirect函 ...
- 修改Windows中文用户名为英文(更全面的方法)
网上方法很多,但是大多不全面. 我的建议是 1,新建/切换管理员账号 net user administrator /active:yes 然后点击桌面,使用Alt+F4组合键 注销中文用户名账号,并 ...
- 重启服务器后Docker容器暴露的端口外网突然访问不了!!
*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...
- 解决Spring Cloud中Feign第一次请求失败的问题
在Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题 com.netflix.hystrix.exception.HystrixTimeoutE ...