mvc调用mysql存储过程_使用.NET MVC +EF调用oracle的存储过程

题记:

需求如题,在网上搜索了一下,没有特别贴合我需求的资料,只好自己摸索,东拼西凑了解了一点东西慢慢尝试做了出来。

难点:.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值