2013-07-16 60 views
0

我有一個Oracle軟件包,它提供了基於用戶ID的設施列表。它用於確定訪問權限。我們有幾個項目已經使用了這個包,但他們都是VB和WebForms--我們正在轉向C#和MVC,這是第一個使用這個包的項目。使用C#MVC4訪問Oracle軟件包

當試圖在包運行查詢,我得到一個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代碼,這只是一個

+0

調用包不應該是用C#,VB,MVC或Win形式不同。 –

回答

1

和往常一樣,我在發佈後不久就想出了它。 objArr數組需要長度爲2,我想要考慮到ref cursor?在ExecuteQuery()中更改以下行修復了問題。

更改此:

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

要這樣:

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