題記:
需求如題,在網上搜索了一下,沒有特別貼合我需求的資料,只好自己摸索,東拼西湊了解了一點東西慢慢嘗試做了出來。
難點:.NET是微軟產品,主要支持Sql Server數據庫,對于Oracle的數據庫的資料比較少。
思路:
EF框架是DataBase First ,先在數據庫創建存儲過程并測試能夠執行。在系統中,通過調用SqlQuery方法來執行存儲過程。【EF的SqlQuery使用教程】
封裝一個執行存儲過程的方法,
#region 調用存儲過程返回一個指定的TResult
public List RunProc(string sql, params object[] pamrs)
{
return db.Database.SqlQuery(sql, pamrs).ToList();
}
#endregion
參數sql為執行存儲過程的sql語句,在oracle數據庫中為
begin 存儲過程名稱(參數1,參數2,……);end;
參數pamrs為Oracle.ManagedDataAccess.Client.OracleParameter類型的數組【OracleParameter的教程】,需要引用的dll為Oracle.ManagedDataAccess.dll,可以通過NuGet包添加。
最后根據輸出參數的值判斷是否成功調用存儲過程。
PS:可以用try catch來捕獲異常并輸出
代碼:
public ResultModelProExecute()
{try{//參數數列
List parameters = new List();//輸入參數
parameters.Add(new OracleParameter("exeno", DateTime.Now.ToString("yyyyMMddHHmmss")));
parameters.Add(new OracleParameter("exetype", "手動"));//輸出參數
var para_exeid = new OracleParameter("exeid", OracleDbType.Int32);
para_exeid.Direction=System.Data.ParameterDirection.Output;
parameters.Add(para_exeid);//執行存儲過程
var list = RunProc(@"begin pro_charges_execute(:exeno,:exetype,:exeid);end;", parameters.ToArray());//獲取輸出參數的值
var rowid = Convert.ToInt32(parameters[2].Value.ToString());if (rowid > 0)
{return new ResultModel() { errcode = 0, errmsg =Lang.Filed_Common_OperSuccess };
}else{return new ResultModel() { errcode = 1, errmsg =Lang.ErrMsg_Common_OperationFailed };
}
}catch(Exception ex)
{return new ResultModel() { errcode = 1, errmsg =ex.Message };
}
}
要點:
一開始調用語句為RunProc(),返回報錯
數據讀取器具有多個字段。多個字段對于存儲過程中的EDM原語或枚舉類型無效(數據讀取器具有多個字段。多個字段對于EDM原語或存儲過程中的枚舉類型無效)
這是由于int為值類型,不與存儲過程的返回的模型匹配。重新建立了一個ViewModel作為返回類型。
public classCharges_ExelogParameter
{public string exetype { get; set; }public string exeno { get; set; }public int exeid { get; set; }
}
附記:
順便列出不是用EF框架時,.NET調用存儲過程的方法。
這次使用的是DBHelperOra幫助類,同時也要引用Oracle.ManagedDataAccess.dll。
下面是DBHelperOra里我們需要用到的方法。
public static void RunProcedureNoReturn(stringstoredProcName, IDataParameter[] parameters)
{using (OracleConnection connection = newOracleConnection(connectionString))
{
connection.Open();
OracleCommand command=BuildQueryCommand(connection, storedProcName, parameters);
command.ExecuteNonQuery();
connection.Close();
}
}
邏輯類似,聲明參數變量后直接調用RunProcedureNoReturn去執行存儲過程。
public int UpdateTagMember(int tagid,stringuserid)
{
IDataParameter[] para= new IDataParameter[2];
para[0] = new OracleParameter("@USERID", userid);
para[1] = new OracleParameter("@TAGID", OracleDbType.Int32, tagid,ParameterDirection.InputOutput);
DBHelperOra.RunProcedureNoReturn("PRO_TAGMEMBER_UPDATE", para);return para[1].Value.ObjToInt();
}
參考:https://www.cnblogs.com/lizichao1991/p/6867331.html