使用C#MVC4访问Oracle包

时间:2013-07-16 12:07:15

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

我有一个Oracle软件包,根据用户ID提供设施列表。它用于确定访问权限。我们有几个项目已经使用这个包,但它们都是VB和WebForms - 我们正在转向C#和MVC,这是第一个使用这个包的项目。

尝试在包中运行查询时,我得到System.InvalidOperationException: The number of parameters does not match number of values for stored procedure.

程序规范(我无权访问正文,因此在其他应用程序中广泛使用此部分无法编辑):

Procedure GetFacilitiesByUser
(
  p_EmpNo   IN  int,
  cur_OUT   out sys_refcursor
);

我的C#:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Practices.EnterpriseLibrary.Common;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Data.Oracle;

namespace MvcApplication1.DataAccess
{
    public class InpatientSecurity
    {
        public List<string> GetHospitals(int EmployeeNumber)
        {
            var response = new List<string>() { };
            object[] _params = { EmployeeNumber };
            IDataReader dr = ExecuteQuery(
                "connection string",
                "datawarehouse.Access.GetFacilitiesByUser",
                _params
            );
            while (dr.Read())
            {
                response.Add("test");
            }
            return response;
        }

        private IDataReader ExecuteQuery(string provider, string procedure, params object[] args)
        {
            var _db = new OracleDatabase(provider);
            object[] objArr = new object[args.Length];
            args.CopyTo(objArr, 0);
            if (args.Length > 1)
            {
                objArr[objArr.Length - 1] = System.DBNull.Value;
            }
            IDataReader reader = _db.ExecuteReader(procedure, objArr); /* Exception thrown here */
            _db = null;
            return reader;
        }
    }
}

我没有编写用于访问此过程的原始VB代码,这只是一个

1 个答案:

答案 0 :(得分:1)

像往常一样,我在发布后不久就知道了。 objArr数组需要长度为2,我想考虑引用游标?更改ExecuteQuery()中的以下行修复了该问题。

改变这个:

object[] objArr = new object[args.Length];

对此:

object[] objArr = new object[args.Length + 1];