C# 使用ODP.Net托管客户端将对象数组传递给oracle存储过程

C# 使用ODP.Net托管客户端将对象数组传递给oracle存储过程,c#,oracle,stored-procedures,odp.net-managed,C#,Oracle,Stored Procedures,Odp.net Managed,我的web API中有以下Employee类 public class Employee { public string Name { get; set; } public string City { get; set; } } my web API收到每个请求中包含50条员工记录的列表,需要在Oracle数据库中更新这些详细信息 我采用了将整数数组传递给Oracle存储过程的相同方法,并尝试了以下方法 在Oracle中创建了以下类型和存储过程 --基本类型 create or

我的web API中有以下Employee类

public class Employee
{
    public string Name { get; set; }
    public string City { get; set; }
}
my web API收到每个请求中包含50条员工记录的列表,需要在Oracle数据库中更新这些详细信息

我采用了将整数数组传递给Oracle存储过程的相同方法,并尝试了以下方法

在Oracle中创建了以下类型和存储过程

--基本类型

create or replace  type EMPTEST AS OBJECT
(    
    Name   varchar2(50),    
    City          varchar2(50)
);
--包装

--包体

create or replace  PACKAGE BODY pkgUDFArray_Test
AS
    PROCEDURE ProcEmpUDFArray_Test(
        Param1 IN  T_EMPUDF_ARRAY)
    AS
    BEGIN        
        FORALL indx IN 1..Param1.COUNT
            INSERT INTO Employee(Name,City) 
            VALUES(Param1(indx).Name,Param1(indx).City);       
    END ProcEmpUDFArray_Test;
END pkgUDFArray_Test;
下面是来自WebAPI的代码

     List<Employee> EmpList = new List<Employee>()
    {
        new Employee() { City = "City1", Name="Emp1" },
        new Employee() {City = "City2", Name="Emp2" }
    };            

        OracleConnection con = new OracleConnection(connectionString);       

        con.Open();
        var cmd = con.CreateCommand();

        cmd.CommandText = "pkgUDFArray_Test.ProcEmpUDFArray_Test";
        cmd.CommandType = CommandType.StoredProcedure;

        OracleParameter param1 = new OracleParameter();
        param1.Direction = ParameterDirection.Input;            
        param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
        param1.Value = EmpList.ToArray();
        param1.Size = 2;
        param1.DbType = DbType.Object;

        try
        {
            cmd.ExecuteNonQuery();
            con.Close();
            con.Dispose();
        }
        catch (Exception ex)
        {
            throw ex;
        }
List EmpList=new List()
{
新员工(){City=“City1”,Name=“Emp1”},
新员工(){City=“City2”,Name=“Emp2”}
};            
OracleConnection con=新的OracleConnection(connectionString);
con.Open();
var cmd=con.CreateCommand();
cmd.CommandText=“pkgUDFArray_Test.ProcEmpUDFArray_Test”;
cmd.CommandType=CommandType.storedProcess;
OracleParameter param1=新的OracleParameter();
param1.Direction=ParameterDirection.Input;
param1.CollectionType=OracleCollectionType.plSqlAssociationArray;
param1.Value=EmpList.ToArray();
参数1.尺寸=2;
param1.DbType=DbType.Object;
尝试
{
cmd.ExecuteNonQuery();
con.Close();
con.Dispose();
}
捕获(例外情况除外)
{
掷骰子;
}
当我尝试这样做时,我在下面的一行得到错误“值不在预期范围内”。 param1.Value=EmpList.ToArray()

我知道我需要在这里做更多的工作来让它工作


我搜索了类似的主题,但找不到有关托管客户端的任何主题。我知道使用旧的Oracle.DataAccess.dll可以解决此问题,但我想知道是否有使用最新托管客户端的方法。

我尝试了您的代码,在设置值之前设置大小对我很有效:)
     List<Employee> EmpList = new List<Employee>()
    {
        new Employee() { City = "City1", Name="Emp1" },
        new Employee() {City = "City2", Name="Emp2" }
    };            

        OracleConnection con = new OracleConnection(connectionString);       

        con.Open();
        var cmd = con.CreateCommand();

        cmd.CommandText = "pkgUDFArray_Test.ProcEmpUDFArray_Test";
        cmd.CommandType = CommandType.StoredProcedure;

        OracleParameter param1 = new OracleParameter();
        param1.Direction = ParameterDirection.Input;            
        param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
        param1.Value = EmpList.ToArray();
        param1.Size = 2;
        param1.DbType = DbType.Object;

        try
        {
            cmd.ExecuteNonQuery();
            con.Close();
            con.Dispose();
        }
        catch (Exception ex)
        {
            throw ex;
        }