string sql = @"INSERT INTO stu VALUES (@id,@name) ";

参数化查询是经常用到的,它可以有效防止SQL注入。但是需要手动去匹配参数@id,@name。数据量大时很繁琐,下面是自动填充SqlParameter列表的实现。

支持泛型,Object和ExpandoObject动态类型

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Dynamic;
namespace Comm
{
    /// <summary>
    /// 作者:徐晓硕
    /// 邮箱:xuxiaoshuo@fang.com
    /// 版本:v1.0.0
    /// </summary>
    public class GetSqlParameters
    {
        /// <summary>
        /// 过滤参数的规则
        /// </summary>
        private static Regex reg = new Regex(@"@\S{1,}?(,|\s|;|--|\)|$)");  

        private static char[] filterChars = new char[] { ' ', ',', ';', '-',')' };  

        /// <summary>
        /// 根据sql语句和实体对象自动生成参数化查询SqlParameter列表
        /// </summary>
        /// <typeparam name="T">实体对象类型</typeparam>
        /// <param name="sqlStr">sql语句</param>
        /// <param name="obj">实体对象</param>
        /// <returns>SqlParameter列表</returns>
        public static List<SqlParameter> From<T>(String sqlStr, T obj)
        {
            List<SqlParameter> parameters = new List<SqlParameter>();  

            List<string> listStr = new List<string>();
            Match mymatch = reg.Match(sqlStr);
            while (mymatch.Success)
            {
                listStr.Add(mymatch.Value.TrimEnd(filterChars).TrimStart('@'));
                mymatch = mymatch.NextMatch();
            }
            Type t = typeof(T);  

            PropertyInfo[] pinfo = t.GetProperties();  

            foreach (var item in listStr)
            {
                ; i < pinfo.Length; i++)
                {
                    if (item.Equals(pinfo[i].Name, StringComparison.OrdinalIgnoreCase))
                    {
                        parameters.Add(new SqlParameter() { ParameterName = "@" + item, Value = pinfo[i].GetValue(obj, null) });
                        break;
                    }
                    else
                    {
                        )
                        {
                            throw new Exception("查询参数@" + item + "在类型" + t.ToString() + "中未找到赋值属性");
                        }
                    }
                }
            }  

            return parameters;
        }
        /// <summary>
        /// 根据sql语句和实体对象自动生成参数化查询SqlParameter列表
        /// </summary>
        /// <param name="sqlStr">sql语句</param>
        /// <param name="obj">实体对象</param>
        /// <returns>SqlParameter列表</returns>
        public static List<SqlParameter> From(String sqlStr, object obj)
        {
            List<SqlParameter> parameters = new List<SqlParameter>();  

            List<string> listStr = new List<string>();
            Match mymatch = reg.Match(sqlStr);
            while (mymatch.Success)
            {
                listStr.Add(mymatch.Value.TrimEnd(filterChars).TrimStart('@'));
                mymatch = mymatch.NextMatch();
            }
            Type t = obj.GetType();  

            PropertyInfo[] pinfo = t.GetProperties();  

            foreach (var item in listStr)
            {
                ; i < pinfo.Length; i++)
                {
                    if (item.Equals(pinfo[i].Name, StringComparison.OrdinalIgnoreCase))
                    {
                        parameters.Add(new SqlParameter() { ParameterName = "@" + item, Value = pinfo[i].GetValue(obj, null) });
                        break;
                    }
                    else
                    {
                        )
                        {
                            throw new Exception("查询参数@" + item + "在类型" + t.ToString() + "中未找到赋值属性");
                        }
                    }
                }
            }  

            return parameters;
        }  

        /// <summary>
        /// 根据sql语句和ExpandoObject对象自动生成参数化查询SqlParameter列表
        /// </summary>
        /// <param name="sqlStr">sql语句</param>
        /// <param name="obj">ExpandoObject对象</param>
        /// <returns>SqlParameter列表</returns>
        public static List<SqlParameter> From(String sqlStr, ExpandoObject obj)
        {
            List<SqlParameter> parameters = new List<SqlParameter>();  

            List<string> listStr = new List<string>();
            Match mymatch = reg.Match(sqlStr);
            while (mymatch.Success)
            {
                listStr.Add(mymatch.Value.TrimEnd(filterChars).TrimStart('@'));
                mymatch = mymatch.NextMatch();
            }
            IDictionary<String, Object> dic=(IDictionary<String, Object>)obj;  

            foreach (var item in listStr)
            {
                ;
                foreach (var property in dic)
                {
                    if (item.Equals(property.Key, StringComparison.OrdinalIgnoreCase))
                    {
                        parameters.Add(new SqlParameter() { ParameterName = "@" + item, Value = property.Value });
                        break;
                    }
                    else
                    {
                        )
                        {
                            throw new Exception("查询参数@" + item + "在类型ExpandoObject中未找到赋值属性");
                        }
                    }
                    reachCount++;
                }
            }
            return parameters;
        }
    }
}  

Demo代码

using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Reflection;
using System.Text;
using Framework.Data;
using System.Data;
using System.Data.SqlClient;
using System.Dynamic;
using Comm;
namespace 数据层
{
    class Program
    {
        static void Main(string[] args)
        {  

            string sql = @"INSERT INTO stu VALUES (@id,@name) ";  

            dynamic wherePart = new ExpandoObject();
            wherePart.ID = ";
            wherePart.Name = "Test";
            List<SqlParameter> listPar2 = GetSqlParameters.From(sql, wherePart);
            foreach (var item in listPar2)
            {
                Console.WriteLine(item.ParameterName + ":" + item.Value);
            }  

            Console.ReadKey();
        }
    }
}  

转载:http://blog.csdn.net/xxs77ch/article/details/51513722

SQL参数化查询自动生成SqlParameter列表的更多相关文章

  1. SQL Server镜像自动生成脚本

    SQL Server镜像自动生成脚本 镜像的搭建非常繁琐,花了一点时间写了这个脚本,方便大家搭建镜像 执行完这个镜像脚本之后,最好在每台机器都绑定一下hosts文件,不然的话,镜像可能会不work 1 ...

  2. SQL 参数化查询 应用于 Like

    在sql 进行参数化查询的时候,使用like 语句和参数的时候,错误的写法:  Participant like '%@Participant%' ,这样在数据库为解析为 '%'participant ...

  3. SQL参数化查询--最有效可预防SQL注入攻击的防御方式

    参数化查询(Parameterized Query 或 Parameterized Statement)是访问数据库时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值. 在使用参 ...

  4. SQL参数化查询的问题

    最近碰到个问题, SQL语句中的 "... like '%@strKeyword%'"这样写查不出结果, 非的写成 "... like '%" + strKey ...

  5. sql参数化查询避免注入漏洞的原因探析

    网上其他同学的都说是重用执行计划,将用户输入的作为文本查询,到底如何实现,我用下面三行代码来解析一下. DECLARE @test NVARCHAR() SET @test=' or 1='1 SEL ...

  6. sql参数化查询in的参数

    private Query setParameter(Query query, Map<String, Object> map) { if (map != null) { Set<S ...

  7. SQL Server 2008 R2 性能计数器详细列表(四)

    原文:SQL Server 2008 R2 性能计数器详细列表(四) SQL Server Latches 对象: 监视称为闩锁的内部 SQL Server 资源锁.通过监视闩锁来确定用户活动和资源使 ...

  8. Go 语言,开源服务端代码自动生成 框架 - EasyGoServer

    EasyGoServer 作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblog ...

  9. 自动生成 Lambda查询和排序,从些查询列表so easy

    如下图查询页面,跟据不同条件动态生成lambda的Where条件和OrderBy,如果要增加或调整查询,只用改前台HTML即可,不用改后台代码 前台代码: <div style="pa ...

随机推荐

  1. Android开发学习之路-该怎么学Android(Service和Activity通信为例)

    在大部分地方,比如书本或者学校和培训机构,教学Android的方式都基本类似,就是告诉先上原理方法,然后对着代码讲一下. 但是,这往往不是一个很好的方法,为什么? ① 学生要掌握这个方法的用途,只能通 ...

  2. ABP Migration(数据库迁移)

    今天准备说说EntityFramework 6.0+,它与我之前所学的4.0有所区别,自从4.1发布以来,code first 被许多人所钟爱,Dbcontext API也由此时而生.早在学校的时候就 ...

  3. 弹窗样式 idialog,purebox,artdialog4.1.2,jquery.alert.v1.2

    <script src="<?php echo $imgurl;?>/tools/media/js/jquery.iDialog.js"></scri ...

  4. IIS 7.5 + PHP-5.6.3 + mysql-5.6.21.1

    禅道项目管理软件源码下载:http://sourceforge.net/projects/zentao/files/6.3/ZenTaoPMS.6.3.stable.zip/download Stp1 ...

  5. Tableau:数据可视化之急速BI

    1.我们通过数据可视化,是为了从数据中寻找什么呢?三个方面:模式.关系和异常.不管图形表现的是什么,我们都要留心观察这三者.

  6. 客户端GUI程序开发漫谈

    这篇文章包含了这个领域的很多开源项目的介绍,还有我多年来的心血和汗水  去年夏天的时候,我用QT做了一个小工具 后来还用QT做了流程设计器 我把程序分享给飞扬青云之后,他甚至搞出来一套QT的皮肤来 说 ...

  7. Linux zabbix 配置注意事项

    发现php-fpm启动之后,找不到 php-fpm.pid文件??? vi php-fpm.conf 去掉里面那个 pid = run/php-fpm.pid 前面的分号然后再启动php-fpm才能自 ...

  8. flash as3 socket安全服务网关(socket policy file server)

    关键字: SecurityErrorEvent socket as3 flash有着自己的一套安全处理模式,在socket方面,我这样的菜鸟无法理解他的好处:一句话,不怀好意的人如果想用flash写一 ...

  9. Java 多线程程序设计

    课程  Java面向对象程序设计 一.实验目的 掌握多线程程序设计 二.实验环境 1.微型计算机一台 2.WINDOWS操作系统,Java SDK,Eclipse开发环境 三.实验内容 1.Java有 ...

  10. mysql之游标

    游标 行,也不存在每次一行地处理所有行的简单方法(相对于成批地处理它们).有时,需要在检索出来的行中前进或后退一行或多行.这就是使用游标的原因.游标( cursor)是一个存储在MySQL服务器上的数 ...