EF和LINQ 呼叫儲存過程
阿新 • • 發佈:2019-01-23
好久沒有更新文章了,最近專案比較忙都沒什麼時間來分享最近的問題。 今天遇到一個超級傻逼的問題。C#中呼叫儲存過程,自己code也10來年了,這應該是很簡單的問題了。今天有2個新的api,一個只有1個引數, 一個有10多個引數,先前沒有注意到物件型別, 以為是EF的DbContext,結果後來才發現是LINQ的DataContext物件。以前呼叫儲存過程都是靠設計介面封裝成方法。 現在designer介面有500多張表, 幾年沒有維護了,大家要修改什麼東東都是直接改程式碼。所以這裡以後臺程式碼呼叫儲存過程為例。
EF呼叫儲存過程
using (AdventureWorks2014Entities aw=newAdventureWorks2014Entities()) { int ret = aw.Database.ExecuteSqlCommand("EXEC [HumanResources].[uspUpdateEmployeeLogin] @BusinessEntityID,@OrganizationNode,@LoginID,@JobTitle,@HireDate,@CurrentFlag ", new SqlParameter("@BusinessEntityID",10),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=10; 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真的是該淘汰了。