这一节,咱们来看看EF如何执行SQL语句与读取存储过程的数据,可能有一部分人,还不知道EF如何执行存储过程与原生SQL语句!sql
咱们何时要直接使用原生的SQL语句?数据库
因此实际开发中,我每每两合一处理异步
EF上下文 DbContext包含了DataBase属性,里面有不少方法,可是实际咱们只须要用到个方法函数
别小看这两个方法,他们其实有不少重载,不过操做咱们以往的ADO.NET基本无异!性能
下面来看MSDN对于这两个方法的描述,咱们直接看代码的描述就好,一看就是咱们熟悉的ADO.NET操做方式ui
context.Database.ExecuteSqlCommand("UPDATE dbo.Posts SET Rating = 5 WHERE Author = @author", new SqlParameter("@author", userSuppliedAuthor));
context.Database.SqlQuery("SELECT * FROM dbo.Posts WHERE Author = @author", new SqlParameter("@author", userSuppliedAuthor));
咱们经过一个小例子来,来使用这2个方法spa
新建一个项目,并新增一个EF,并加入表InfoTest3d
CREATE TABLE [dbo].[InfoTest]( [Id] [varchar](50) PRIMARY key, [Name] [varchar](50) NULL, [Phone] [varchar](50) NULL, [CreateTime] [datetime] NULL, )
static void Main(string[] args) { using (DBContainer db = new DBContainer()) { //---------执行一条语句,带参数 string sql = "INSERT INTO [dbo].[InfoTest]([Id],[Name],[Phone],[CreateTime])VALUES(@Id,@Name,@Phone,@CreateTime)"; SqlParameter[] para = new SqlParameter[] { new SqlParameter("@Id",Guid.NewGuid().ToString()), new SqlParameter("@Name","中国移动"), new SqlParameter("@Phone","10086"), new SqlParameter("@CreateTime",DateTime.Now), }; //返回执行的影响行 int count = db.Database.ExecuteSqlCommand(sql,para); Console.WriteLine("新增-带参数"+count); //----------执行一条语句,不带参数 sql = "Delete [dbo].[InfoTest] where Name='中国移动'"; count = db.Database.ExecuteSqlCommand(sql); Console.WriteLine("删除不带参数" + count); } }
注:带参数能够防止SQL注入,仍是带参数好code
sql = "select * from InfoTest"; DbRawSqlQuery<InfoTest> dbRaw = db.Database.SqlQuery<InfoTest>(sql);
执行查询的语句,会返回 DbRawSqlQuery咱们须要将其转换为咱们熟悉的 IQueryable 或者 List来作进一步的数据库处理blog
如:ExecuteSqlCommandAsync
来看一个简单的存储过程
CREATE PROCEDURE SP_GetInfoTest @Phone varchar(50) AS BEGIN select * from InfoTest where Phone=@Phone END GO
经过电话号码查一条记录,咱们须要经过EF传过来参数,而后接收起返回值
看了上面的朋友,应该知道能够能够用使用SqlQuery来查询,没错,就是能够这样!
可是有时候咱们仍是要写存储过程,好比你的代码有几百行,那么用存储过程页面的代码看起来就好多了
把建立好的存储过程加入EF【右键更新模型】
如今的EF很聪明了,帮咱们生成了返回值和函数导入,直接拿来使用就好
//使用存储过程 List<SP_GetInfoTest_Result> spResult = db.SP_GetInfoTest("1008612").ToList(); //进一步的操做 foreach (var r in spResult) { Console.Write("来自存储过程的数据:"+r.Name + r.Phone); }
参考:
Database这个类很强大。有事务,和其余方法,也是很是实用,能够了解一下
https://msdn.microsoft.com/zh-cn/library/system.data.entity.database(v=vs.113).aspx
代码下载:连接:https://pan.baidu.com/s/1qZ964fM 密码:hlyp