ASP.NET MVC5+EF6+EasyUI 後臺管理系統(89)-EF執行SQL語句與存儲過程

這一節,我們來看看EF如何執行SQL語句與讀取存儲過程的數據,可能有一部分人,還不知道EF如何執行存儲過程與原生SQL語句!

我們什麼時候要直接使用原生的SQL語句?

  • 返回值過於複雜
  • 過於複雜的聯合查詢,可能連了好幾張表
  • 報表自定義SQL語句(自定義報表居多)
  • 使用EF,但是寫了一條性能很差的LINQ
  • 批量操作

所以實際開發中,我往往兩合一處理

EF上下文 DbContext包含了DataBase屬性,裏面有很多方法,但是實際我們只需要用到個方法

     ExecuteSqlCommand 和 SqlQuery

別小看這兩個方法,他們其實有很多重載,不過操作我們以往的ADO.NET基本無異!

 

下面來看MSDN對於這兩個方法的描述,我們直接看代碼的描述就好,一看就是我們熟悉的ADO.NET操作方式

方法:ExecuteSqlCommand(String,Object[])

context.Database.ExecuteSqlCommand("UPDATE dbo.Posts SET Rating = 5 WHERE Author = @author", new SqlParameter("@author", userSuppliedAuthor));

方法:SqlQuery(String, Object[])

context.Database.SqlQuery("SELECT * FROM dbo.Posts WHERE Author = @author", new SqlParameter("@author", userSuppliedAuthor));

我們通過一個小例子來,來使用這2個方法

新建一個項目,並新增一個EF,並加入表InfoTest

CREATE TABLE [dbo].[InfoTest](
    [Id] [varchar](50) PRIMARY key,
    [Name] [varchar](50) NULL,
    [Phone] [varchar](50) NULL,
    [CreateTime] [datetime] NULL,
)

 

1.來看一段代碼,創建和刪除使用ExecuteSqlCommand

     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注入,還是帶參數好

2.來看一段查詢的語句,使用SqlQuery

sql = "select * from InfoTest";
DbRawSqlQuery<InfoTest> dbRaw = db.Database.SqlQuery<InfoTest>(sql);

執行查詢的語句,會返回 DbRawSqlQuery我們需要將其轉換爲我們熟悉的 IQueryable 或者 List來做進一步的數據庫處理

3.我們還有一些異步的調用方法沒有說明,跟同步是一致的

如:ExecuteSqlCommandAsync

4.使用存儲過程

來看一個簡單的存儲過程

CREATE PROCEDURE SP_GetInfoTest
    @Phone varchar(50)
AS
BEGIN
    select * from InfoTest where Phone=@Phone
END
GO

通過電話號碼查一條記錄,我們需要通過EF傳過來參數,然後接收起返回值

看了上面的朋友,應該知道可以可以用使用SqlQuery來查詢,沒錯,就是可以這樣!

但是有時候我們還是要寫存儲過程,比如你的代碼有幾百行,那麼用存儲過程頁面的代碼看起來就好多了

把創建好的存儲過程加入EF【右鍵更新模型】

第一步:將存儲過程添加入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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章