好久没有更新文章了,最近项目比较忙都没什么时间来分享最近的问题。 今天遇到一个超级傻逼的问题。C#中调用存储过程,自己code也10来年了,这应该是很简单的问题了。今天有2个新的api,一个只有1个参数, 一个有10多个参数,先前没有注意到对象类型, 以为是EF的DbContext,结果后来才发现是LINQ的DataContext对象。以前调用存储过程都是靠设计界面封装成方法。 现在designer界面有500多张表, 几年没有维护了,大家要修改什么东东都是直接改代码。所以这里以后台代码调用存储过程为例。

EF调用存储过程

  using (AdventureWorks2014Entities aw=new AdventureWorks2014Entities())
{
int ret = aw.Database.ExecuteSqlCommand("EXEC [HumanResources].[uspUpdateEmployeeLogin] @BusinessEntityID,@OrganizationNode,@LoginID,@JobTitle,@HireDate,@CurrentFlag ",
new SqlParameter("@BusinessEntityID",),
new SqlParameter("OrganizationNode",DBNull.Value),
new SqlParameter("LoginID", @"adventure-works\michael6"),
new SqlParameter("JobTitle", "Research and Development Manager23"),
new SqlParameter("HireDate", DateTime.Now),
new SqlParameter("CurrentFlag",true)
);
}

注意这里的ExecuteSqlCommand第一个参数是字符串,这个字符串必须包含参数,如这里的@BusinessEntityID,其次这里的SqlParameter里面的参数名是可以包含@符号也可以不包含。

LINQ调用存储过程

  using (AWDataClassesDataContext aw=new AWDataClassesDataContext())
{
int BusinessEntityID=;
string OrganizationNode = null; //0x5AE178
string LoginID=@"adventure-works\michael6";
string JobTitle="Research and Development Manager12";
DateTime HireDate=DateTime.Now;
bool CurrentFlag=true;
string sql = string.Format(" EXEC [HumanResources].[uspUpdateEmployeeLogin] @BusinessEntityID={0},@OrganizationNode={1},@LoginID=N'{2}',@JobTitle=N'{3}',@HireDate=N'{4}',@CurrentFlag=N'{5}'"
, BusinessEntityID.ToString(), "NULL", LoginID.ToString(), JobTitle.ToString(), HireDate.ToString(), CurrentFlag.ToString());
var ret = aw.ExecuteCommand(sql);
//var ret=aw.ExecuteCommand("EXEC [HumanResources].[uspUpdateEmployeeLogin] @BusinessEntityID={0},@OrganizationNode={1},@LoginID={2},@JobTitle={3},@HireDate={4},@CurrentFlag={5}"
// , BusinessEntityID, null, LoginID, JobTitle, HireDate, CurrentFlag);
}
ExecuteCommand方法的后面传值的参数不能是object对象,所以我这里只能拼接SQL字符串。 大家可能注意到这里调用存储过程与普通的sql语句没什么区别,只不过它的sql是调用存储过程如:
EXEC [HumanResources].[uspUpdateEmployeeLogin] @BusinessEntityID=10,@OrganizationNode=NULL,@LoginID=N'adventure-works\michael6',@JobTitle=N'Research and Development Manager',@HireDate=N'2015/6/29 22:30:15',@CurrentFlag=N'True'
这样的sql语句是比较危险的(可能有sql注入)。如果参数可能为Null,那么sql语句 还得动态拼接,比new SqlParameter("OrganizationNode",DBNull.Value)这种写法麻烦多了。我用反编译工具并没有看到DataContext里面的具体实现。
看来LINQ to SQL真的是该淘汰了。
												

EF和LINQ 调用存储过程的更多相关文章

  1. 解决Linq第一次调用存储过程时速度慢的问题

    最近做项目,发现linq调用存储过程,第一次时会速度慢,但之后速度都很快,过一阵子又会慢一下,以实际的操作为例子: using (FruitDbDataContext dbo = new FruitD ...

  2. .net core EF Core 调用存储过程

    在这里,我们将尝试去学习一下 .net core EF Core 中调用存储过程. 我们知道,EF Core 是不支持直接调用存储过程的,那它又提供了什么样的方式去执行存储过程呢?有如下方法: 1.F ...

  3. 转:EF调用存储过程、函数

    EF调用存储过程.函数 2014-04-02 09:12:20|  分类: ORM框架|举报|字号 订阅          一.ef4.1 codeFirst 修改表结构 增加字段等 EF code ...

  4. ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪

    ASP.NET MVC深入浅出(被替换)   一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...

  5. 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法

    一. 背景 上一个章节,介绍了EF调用两类SQL语句,主要是借助 ExecuteSqlCommand  和 SqlQuery 两个方法来完成,在本章节主要是复习几类存储过程的写法和对应的EF调用这几类 ...

  6. EF 6 调用存储过程时返回多结果集和OUTPUT参数问题

    原文地址:http://q.cnblogs.com/q/56836/ 各位大侠,提问一个关于EF6调用存储过程时返回多结果集和OUTPUT参数问题 目前已经可以调用存储过程并且可以返回多个结果集. 但 ...

  7. entity framework core 调用存储过程和方法

    目前EF Core调用存储过程,限制很多,比如返回结果必须是定义好的DbSet<>等等.这里用一种曲线救国的方式,自定义两个方法,用原始ado.net解决问题.以MySql数据库为例,代码 ...

  8. ADO.NET笔记——调用存储过程

    相关知识: 在ADO.NET访问SQL Server时,鼓励使用存储过程取代常规的SQL语句. 存储过程有下列优点: 存储过程中的SQL语句将会经过预先的解析和编译,然后存放在数据库服务器上行.调用的 ...

  9. 数据库复习总结(20)-存储过程以及.net调用存储过程

    一.存储过程(注意区分将一段select语句进行封装叫做视图)(1)将一段t-sql脚本进行封装,以完成一个逻辑操作(2)创建存储过程:            create proc 名称      ...

随机推荐

  1. Xamarin-Android_BaseAdapter 简单的复用

    Xamarin-Android_BaseAdapter 简单的复用 缘由: 本人是一枚 小菜 初学Xamarin-Android  正在学习ListView 控件 发现这个控件的自定义布局 用的那叫一 ...

  2. HDU.5181.numbers(DP)

    题目链接 参考. \(Description\) 将\(1,2,\cdots,n(n\leq 300)\)依次入栈/出栈,并满足\(m(m\leq 90000)\)个形如\(x\)要在\(y\)之前出 ...

  3. BZOJ4247 : 挂饰

    首先将挂饰按照挂钩个数从大到小排序,然后DP 设f[i][j]处理完前i个挂饰,还有j个多余挂钩的最大喜悦值,则 f[0][1]=0 f[i][j]=max(f[i-1][max(j-a[i],0)+ ...

  4. 喵哈哈村的魔法考试 Round #3 (Div.2) 题解

    A 题解:保证一个三角形的话,得两边之和大于第三边才行,所以都拿来判一判就好了. #include <iostream> using namespace std; int main(){ ...

  5. 初始化collectionViewCell

    #import <UIKit/UIKit.h> @interface TonyCollectionViewCell : UICollectionViewCell @property UII ...

  6. ARM DEBUGGER FOR NEARLY ONE DOLLAR

    http://hackaday.com/2014/01/23/arm-debugger-for-nearly-one-dollar/ Oh that title is so misleading. B ...

  7. DTrace memory leak 内存泄露

    http://blog.sina.com.cn/s/blog_538040b70100eecn.html   如下程序用于跟踪,在分配和回收都会触发探针 #!/usr/sbin/dtrace -s p ...

  8. nginx源码学习 资料

    首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没有注释,完全没有配置文档的代码. 现在你最希望要的是一份注释版的nginx源码, ...

  9. 玩一下C#的语音识别

    在.NET4.0中,我可以借助System.Speech组件让电脑来识别我们的声音. 以上,当我说"name",显示"Darren",我说"age&q ...

  10. Navicat Premium 12.1.7.0安装与激活

    原文:https://www.jianshu.com/p/5f693b4c9468 Navicat Premium 12.1.8.0安装与激活 丿记忆灬永殇丨 关注 2018.01.20 13:43* ...