c# - Asp.Net MVC 使用参数执行 Oracle PL/SQL 存储过程

标签 c# asp.net-mvc oracle entity-framework plsql

我想先在asp.net MVC代码中执行带参数的oracle pl/sql存储过程。

这是我的存储过程:

CREATE OR REPLACE 
PROCEDURE sp_getuserhosps(p_city IN VARCHAR2,cnt OUT DECIMAL) 
AS
BEGIN

SELECT COUNT(1) INTO cnt FROM "PersonStatus" p1 
INNER JOIN HOSPITALS p2 ON P1."HospitalCode"=p2.KURUM_KODU
WHERE P2.IL_KODU=p_city AND p1."Statu"=1;

END;

这将返回 DBMS OUTPUT CNT=135555,如下所示。

我尝试了这样的 Asp.Net MVC 代码:

var sql = "DECLARE cnt DECIMAL;BEGIN SP_GETUSERHOSPS(@p_city,cnt);END;";
var total = context.Database.ExecuteSqlCommand(sql, new OdbcParameter("@p_city","07"));

但是没有结果。并返回如下错误:

Cannot cast 'System.Data.Odbc.OdbcParameter' to 'Oracle.ManagedDataAccess.Client.OracleParameter'

我该如何解决这个问题?

谢谢

最佳答案

正如错误所述,您需要传递 Oracle.ManagedDataAccess.Client.OracleParameter 的实例,而不是 System.Data.Odbc.OdbcParameter

所以你会得到这个:

var sql = "DECLARE cnt DECIMAL;BEGIN SP_GETUSERHOSPS(:p_city,cnt);END;";
var total = context.Database.ExecuteSqlCommand(sql, new OracleParameter(":p_city","07"));

请注意,我将“@”字符替换为“:”字符。因为Oracle中的参数以后者为前缀,而SQL Server中则使用“@”前缀。

如果您想获取 cnt 值,请像这样重写代码:

var cntParameter = new OracleParameter("cnt", OracleDbType.Number, ParameterDirection.Output);
var cityParameter = new OracleParameter("p_city", OracleDbType.Number,  "07", ParameterDirection.Input);
var sql = "BEGIN SP_GETUSERHOSPS(:p_city,:cnt);END;";
var total = context.Database.ExecuteSqlCommand(sql, cityParameter, cntParameter );
// Here you check the cntParameter.Value to get cnt parameter value.

关于c# - Asp.Net MVC 使用参数执行 Oracle PL/SQL 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39948685/

相关文章:

c# - UnityContainer - 如何使用依赖链注册/解析

c++ - 32 位 ODBC 驱动程序连接到 64 位数据库

oracle - 为什么将字符串变量传递到 PL/SQL where 子句时得到 'No data found'

java - 在两个 SQLSessionFactory bean 之一上使用 @Primary 时出现 "java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist"

c# - directshow.net 网络摄像头覆盖透明面板

c# - 如何只允许整数进入文本框

c# - 将我的代码隐藏变量放在 NavigateUrl 的 Repeater Control 中

asp.net-mvc - 防伪 token 盐有什么用?

c# - iFrame IE8 使用 jQuery ColorBox

javascript - 连接下拉列表以在 Controller 中运行功能