某天 , 在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. Windows入门基础:2.vs2013中Icon显示

    第一:系统小图标的显示 wndclass.hIcon = LoadIcon(NULL,IDI_WARNING); //LoadIcon函数的第一的参数要为0,第二个参数是系统自定义的ID号: IDI_ ...

  2. H5学习的第三周

    上周,我们结束了京东站的制作,本周我们开始了手机站和响应式网站的学习,并仿制了一个手机端界面和一个响应式界面,在完成这两个网站的过程中我遇到了许多问题,也了解了它们的解决方法,接下来我讲详细介绍本周我 ...

  3. HashMap源码详解(JDK7版本)

    一.内部属性 内部属性源码: //内部数组的默认初始容量,作为hashmap的初始容量,是2的4次方,2的n次方的作用是减少hash冲突 static final int DEFAULT_INITIA ...

  4. [原创] IAR7.10安装注册教程

    代码开发简单化的趋势势不可挡,TI 公司推出的 IAR7.10 以上版本,集成代码库,方便初学者进行学习移植.本教程详细列出IAR7.10安装以及注册步骤,不足之处望多多交流. 好了进入正题. 第一, ...

  5. oracle备份与还原(导入导出)

    Oracle数据导入导出imp/exp 功能:Oracle数据导入导出imp/exp相当于oracle数据还原与备份.说明:大多情况都可以用Oracle数据导入导出完成数据的备份和还原(不会造成数据的 ...

  6. 串口屏与触摸屏人机界面组态软件HMIMaker介绍

    串口屏与触摸屏人机界面组态软件HMIMaker介绍 触摸屏人机界面组态软件HMIMaker,是一款基于ARM架构的嵌入式控制系统开发的嵌入式软件,专业应用于触摸屏的二级界面开发,具有单片机协议,mod ...

  7. node.js系列(实例):原生node.js实现接收前台post请求提交数据

    前台界面: 前台代码: <form class="form-horizontal" method="post" action="http:127 ...

  8. python在cmd上导包成功,但是python charm上面就提示找不到

    失败 成功 原因:我的python file名称和numpy 的名字一样了,把python file 的名字改了就好了

  9. Java排序算法之希尔(Shell)排序

    基本思想: 希尔排序就是对直接插入排序的一个优化.现在有一个array,希尔排序就是设定一个增量incrementNum(0<incrementNum<array.length).先从ar ...

  10. extj6.0写增删查改(1)-------查询

    本文主要实现的效果是:点击查询按钮,根据form中的条件,在Grid中显示对应的数据(如果form为空,显示全部数据) 一.静态页面 1.查询按钮 { text:'查询', handler: 'onS ...