某天 , 在review项目中代码的时候, 发现有哥们直接通过 Database.ExecuteSqlCommand("select * from order_info where  company like '%abc%' ")的方式与数据库查询, 私下问其是否知道这个方法还有一个带有params object[] parameters参数重载, 对方爽快的回答:"知道啊 ,只是每次都要写一大堆的SqlParameter[] 定义, 实在是太过麻烦了,特别是有的时候查询参数太多了...." .细想一下, 确实麻烦得很,感觉又回到了直接写sqlhelper的时代了.不过转念一想, 这个方法很容易改进, 于是便有了这篇随笔,希望能给有需要的朋友一些提示.

1.目标,我们希望调用者能像字符串格式化,类似   string.Formart("select  * from order_info where company like {0}","abc") 一样去方便使用,而不再关心是否是否需要参数化,但同时数据库在执行的时候,自动转化为参数化的语句.

2.略加思考:首先我们利用 string.Formart 自动将sqlCommand 格式化为带参数的一个字符串, 类似 "select  * from order_info where company like  @p0", 同时自动创建查询参数@p0= abc,即可.

3.于是,便有了如下方法片段

private Tuple<string, SqlParameter[]> ProcessSqlCommand(string sqlCommand, params object[] param)
{
var tempParamKeyValDic = param.Select((item, i) => new KeyValuePair<string, object>("@p" + i, item))
.ToDictionary(k => k.Key, v => v.Value); var tempSqlCommand = string.Format(sqlCommand, tempParamKeyValDic.Keys.ToArray());
var tempParams = tempParamKeyValDic.Select(t => new SqlParameter(t.Key, t.Value)).ToArray(); return Tuple.Create(tempSqlCommand, tempParams);
}

4. 同时对外提供两个类似的ExecSqlCommand 和 SqlQuery 方法即可.

public int ExecSqlCommand(string sqlCommand, params object[] param)
{
if (param == null || param.Length == )
{
return Context.Database.ExecuteSqlCommand(sqlCommand);
} var temp = ProcessSqlCommand(sqlCommand, param); return Context.Database.ExecuteSqlCommand(temp.Item1, temp.Item2);
} public List<T> SqlQuery<T>(string sqlCommand, params object[] param)
{
if (param == null || param.Length == )
{
return Context.Database.SqlQuery<T>(sqlCommand).ToList();
} var temp = ProcessSqlCommand(sqlCommand, param); return Context.Database.SqlQuery<T>(temp.Item1, temp.Item2).ToList();
}

5. 客户端在调用的时候,直接使用类似如下模式

var data=repository.SqlQuery<OrderInfo>(“select  * from order_info where company like  {0}","abc”);

后记:

1. 事关数据安全无小事, 任何侥幸心理都应该避免;

2. 当有人在埋怨程序不好写, 或者框架不好用的时候 , 需要换位思考,并极力改进;

3. 大家在谈论项目框架或系统架构的时候,并不是时时刻刻都需要关注类似高大上的高并发架构图, 有的时候还得压住浮躁的心态关注眼前的蹩脚之处.

关于EF中直接执行sql语句的参数化问题的更多相关文章

  1. SQL*PLUS中批量执行SQL语句

    SQL*PLUS中批量执行SQL语句 今天由于工作的需要,要在CMD中批量执行大量的SQL语句,对于Oracle学习还处在入门阶段的我,只能硬着头皮到处去寻找资料(主要是网络资料,也包括自己的电子书) ...

  2. Eclipse中直接执行sql语句(图文说明)

    转自:https://blog.csdn.net/changjyzzu/article/details/45487847 1.首先新建sql文件,然后打开文件 22.右键点击空白处,点击set-con ...

  3. Django中直接执行SQL语句

    欢迎加入python学习交流群 667279387 今天在django views.py看到同事写的代码里面有段关于数据库查询的语句.因为涉及多个表的查询,所以django 的models的查询无法满 ...

  4. SQLSERVER 在PROCEDURE 中动态执行SQL语句【EXEC】并获取

    1.直接上代码 CREATE PROCEDURE [dbo].[TEST] AS BEGIN DECLARE )='N8-4F', --構建SQL需要的條件 ),--構建後的SQL語句 @cnt in ...

  5. linq直接执行sql语句

    1.ExecuteQuery方法 看命名,我们很容易联想到ado.net里熟悉的Command的ExecuteNonQuery方法,但是VS的智能提示告诉我们这个方法返回的是一个泛型集合,应该&quo ...

  6. PL/SQL中直接写SQL语句和用EXECUTE IMMEDIATE方法的区别

    PL/SQL中直接写SQL语句和用EXECUTE IMMEDIATE方法的区别 在PL/SQL中在执行SQL语句时可以直接写SQL或者可以把一个SQL语句拼成一个字符串,如下: select * fr ...

  7. EF中执行sql语句,以及事务

    EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...

  8. 在EF中执行SQL语句

    你可能要问,我用EF不就为了避免写SQL吗?如果要写SQL我不如直接用ADO.NET得了.话虽然这么说没错,可有些时候使用EF操作数据还是有一些不方便,例如让你根据条件删除一组记录,如果按照正常的流程 ...

  9. EF Core中执行Sql语句查询操作之FromSql,ExecuteSqlCommand,SqlQuery

    一.目前EF Core的版本为V2.1 相比较EF Core v1.0 目前已经增加了不少功能. EF Core除了常用的增删改模型操作,Sql语句在不少项目中是不能避免的. 在EF Core中上下文 ...

随机推荐

  1. FunDA:一个开源的函数式数据处理工具库,也是Slick的补充

    如果你是一个Slick用户,或者你是一个数据库编程人员正在尝试进入函数式编程模式,那么FunDA可能会帮到你. 目前市面上FRM(Functional Relational Mapper),即函数式的 ...

  2. Intellij IDEA2016 注册码

    网上大多数关于Intellij IDEA2016的注册码多是同一个,如下 43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1l ...

  3. Spark名词解释及关系

    随着对spark的业务更深入,对spark的了解也越多,然而目前还处于知道的越多,不知道的更多阶段,当然这也是成长最快的阶段.这篇文章用作总结最近收集及理解的spark相关概念及其关系. 名词 dri ...

  4. Android批量验证渠道、版本号

    功能:可校验单个或目录下所有apk文件的渠道号.版本号使用说明:1.copy需要校验的apk文件到VerifyChannelVersion目录下2.双击运行VerifyChannelVersion.b ...

  5. 谱聚类(Spectral clustering)(2):NCut

    作者:桂. 时间:2017-04-13  21:19:41 链接:http://www.cnblogs.com/xingshansi/p/6706400.html 声明:欢迎被转载,不过记得注明出处哦 ...

  6. ValueStack

    1.把list集合压入栈顶 /** * * 查找所有的用户 * @return */ public String findAll() { List<User> allUser = user ...

  7. git工具使用的简单介绍

    百度百科 写道 Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git的读音为/gɪt/. Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大 ...

  8. WebForm捆绑压缩js和css(WebForm Bundling and Minification)

    .net framework 4以上,可以使用Microsoft.AspNet.Web.Optimization 新建4.0项目 Nuget搜索optimization,安装第一个包 加入Bundle ...

  9. 借助case,实现更丰富的分组查询统计

    根据fileD6的前4位分组    分别统计该组  5种企业类型fileD31的数量 create or replace view jyjc_bycity as select substr(fileD ...

  10. JS和CSS中引号的使用

        font-family属性值如果是英文可以不加引号,如果是中文按照CSS标准则应该加引号,但不加引号也没关系.比如:font-family:Arial,"宋体"," ...