標籤:result database 添加 val string returns name add sql
本文轉自;http://www.cnblogs.com/xchit/p/3334782.html
目前,EF對預存程序的支援並不完善。存在以下問題:
EF不支援預存程序返回多表聯集查詢的結果集。
EF僅支援返回返回某個表的全部欄位,以便轉換成對應的實體。無法支援返回部分欄位的情況。
雖然可以正常匯入返回標量值的預存程序,但是卻沒有為我們自動產生相應的實體.cs代碼,我們還是無法在代碼中直接調用或使用標量預存程序
EF不能直接支援預存程序中Output類型的參數。
其他一些問題。
今天我們利用EF執行sql語句的方式來執行預存程序,並得到OutPut的值。
首先建立預存程序:
?
Create PROCEDURE proc_testEF ( @id int , @voteCount int OUTPUT --傳回值 ) AS BEGIN SELECT @voteCount = COUNT (*) FROM ConfirmItem WHERE ConfirmItemID = @id; select * from ConfirmItem where [email protected]; END |
然後寫EF調用方法:
?
using (DBEntities context = new DBEntities()) { var idParam = new System.Data.SqlClient.SqlParameter { ParameterName = "@id" , Value = 1 }; var votesParam = new System.Data.SqlClient.SqlParameter { ParameterName = "@voteCount" , Value = 0, Direction = ParameterDirection. Output }; var results = context. Database .SqlQuery<Models.ConfirmItem>( "proc_testEF @id, @voteCount out" , idParam, votesParam); var person = results.Single(); var votes = ( int )votesParam.Value; //得到 OutPut 類型值 return votes; } |
測試多次,沒有什麼問題;最後我對方法進行封裝:
?
/// <summary> /// 執行原始SQL命令 /// </summary> /// <param name="commandText">SQL命令</param> /// <param name="parameters">參數</param> /// <returns>影響的記錄數</returns> public Object[] ExecuteSqlNonQuery<T>( string commandText, params Object[] parameters) { using (DBEntities context = new DBEntities()) { var results = context.Database.SqlQuery<T>(commandText, parameters); results.Single(); return parameters; } } |
調用方式:
?
var idParam = new System.Data.SqlClient.SqlParameter { ParameterName = "@id" , Value = 1 }; var votesParam = new System.Data.SqlClient.SqlParameter { ParameterName = "@voteCount" , Value = 0, Direction = ParameterDirection.Output }; System.Data.SqlClient.SqlParameter[] parm = { idParam, votesParam }; parm = (System.Data.SqlClient.SqlParameter[]) new BLL.Usual.ConfirmItemManager().ExecuteSqlNonQuery<Models.ConfirmItem>( "proc_testEF @id, @voteCount out" , parm); string s = parm[1].Value.ToString(); |
當然還有其它的方式,只是覺得這種簡單方便,比起添加實體模型來說,要方便很多!
[轉]Entity FrameWork利用Database.SqlQuery<T>執行預存程序並返回參數