话不多说直接上代码,新手上路,高手路过勿喷,请多多指教。

        /// <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使用的更多相关文章

  1. SpringBoot集成JPA根据实体类自动生成表

    数据库是mysql,在application.properties中的写法如下: 原来配置这样的时候确实可以生产表的 #spring.jpa.hibernate.ddl-auto=update 多方查 ...

  2. eclipse类自动生成注释

    1.创建新类时自动生成注释 window->preference->java->code     styple->code     template 当你选择到这部的时候就会看 ...

  3. h5 录音 自动生成proto Js语句 UglifyJS-- 对你的js做了什么 【原码笔记】-- protobuf.js 与 Long.js 【微信开发】-- 发送模板消息 能编程与会编程 vue2入坑随记(二) -- 自定义动态组件 微信上传图片

    得益于前辈的分享,做了一个h5录音的demo.效果图如下: 点击开始录音会先弹出确认框: 首次确认允许后,再次录音不需要再确认,但如果用户点击禁止,则无法录音: 点击发送 将录音内容发送到对话框中.点 ...

  4. Entity Framewrok 7beta7中不同版本sql server自动生成分页sql语句的问题

    在EF中,使用linq进行分页是很方便的,假如我们有一个EMP表,结构如下: public class Emp { [Key] public Guid No { get; set; } public ...

  5. Hibrenate实现根据实体类自动创建表或添加字段

    Hibernate支持自动建表,在开发阶段很方便,可以保证hbm与数据库表结构的自动同步. 实现: 在配置hibernate的配置文件中将hbm2ddl.auto设置为update,如:Xml代码&l ...

  6. Do You Kown Asp.Net Core - 根据实体类自动创建Razor Page CURD页面模板

    Scaffolding Template Intro 我们知道在Asp.Net MVC中,如果你使用的EF的DBContext的话,你可以在vs中通过右键解决方案-添加控制器-添加包含视图的控制器,然 ...

  7. JSon实体类快速生成插件 GsonFormat 1.2.0

    写在前头:本插件只适用 android studio和 Intellij IDEA 工具,eclipse 的少年无视我吧!!! 这是一个根据JSONObject格式的字符串,自动生成实体类参数. gi ...

  8. 【原创】Hibernate通过实体类自动建表时type=MyISAM的问题

    ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 当使用的mysql数据库为5.5版本时,方言需要设置为 <property name="hibernate.dialect&q ...

  9. IntelliJ IDEA 2017版 spring-boot 实现jpa基本部署,通过实体类自动建立数据库

    一.添加Spring Boot JPA-Hibernate步骤 1.在pom.xml添加mysql,spring-data-jpa依赖      2.在application.properties文件 ...

随机推荐

  1. python中判断两个对象是否相等

    #coding=utf-8#比较两个对象是否相等#python 2中使用cmp(),==,is#is 主要是判断 2 个变量是否引用的是同一个对象,如果是的话,则返回 true,否则返回 false. ...

  2. (day45)JavaScript

    目录 一.什么是JavaScript 二.注释 三.引入方式 (1)script标签内联 (2)script标签外联 四.变量 (一)变量声明 (二)命名规范 五.数据类型 (一)数值类型Number ...

  3. zz京东电商推荐系统实践

    挺实在 今天为大家分享下京东电商推荐系统实践方面的经验,主要包括: 简介 排序模块 实时更新 召回和首轮排序 实验平台 简介 说到推荐系统,最经典的就是协同过滤,上图是一个协同过滤的例子.协同过滤主要 ...

  4. CF261E Maxim and Calculator

    CF261E Maxim and Calculator 洛谷评测传送门 题目描述 Maxim has got a calculator. The calculator has two integer ...

  5. 实验1 C语言开发环境和数据类型、运算符、表达式

    #include <stdio.h> int main () { int x; printf("输入一个整数:\n"); scanf("%d",&a ...

  6. vscode用服务打开html

    ①安装插件 此时右击会有: ②anywhere

  7. 【Step-By-Step】第 三 周

    本周面试题一览: 什么是XSS攻击,XSS 攻击可以分为哪几类?我们如何防范XSS攻击? 如何隐藏页面中的某个元素? 浏览器事件代理机制的原理是什么? setTimeout 倒计时为什么会出现误差? ...

  8. Zabbix设置邮件报警

    邮件报警 概述当监控项收集了数据后,触发器会根据异常状态触发报警.根据一些报警机制,它也会通知我们一些重要的事件,而不需要我们直接在Zabbix前端进行查看.这就是通知(Notifications)的 ...

  9. [LeetCode] 119. Pascal's Triangle II 杨辉三角之二

    Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal's triangle. Note t ...

  10. Visual Studio 调试系列5 检查变量(使用自动窗口和局部变量窗口)

    系列目录     [已更新最新开发文章,点击查看详细] 在调试时,“自动变量”和“局部变量”窗口会显示变量值. 仅在调试会话期间,这两个窗口才可用. “自动变量”窗口显示当前断点周围使用的变量. “局 ...