0

ユーザー ID に基づいて機能のリストを提供する Oracle パッケージがあります。アクセスを判断するために使用されます。すでにこのパッケージを使用しているプロジェクトがいくつかありますが、それらはすべて 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 コードは作成していません。

4

1 に答える 1

1

いつものように、私は投稿した直後にそれを理解しました。objArr 配列の長さは 2 である必要があります。ref カーソルを考慮すると思いますか? ExecuteQuery() の次の行を変更すると、問題が修正されました。

これを変える:

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

これに:

object[] objArr = new object[args.Length + 1];
于 2013-07-16T12:11:40.653 に答える