从C#将表类型对象作为输入参数传递给Oracle中的存储过程

我有接受表类型作为输入参数的存储过程。 如何从c#代码传递对象?

create or replace TYPE CUSTOM_TYPE AS OBJECT ( attribute1 VARCHAR(10), attribute2 VARCHAR(10) ); create or replace TYPE CUSTOM_TYPE_ARRAY AS TABLE OF CUSTOM_TYPE; PROCEDURE SP_TEST ( P_TABLE_IN IN CUSTOM_TYPE_ARRAY, P_RESULT_OUT OUT SYS_REFCURSOR ) AS BEGIN OPEN P_RESULT_OUT FOR SELECT ti.attribute1, ti.attribute2, ti.attribute3 FROM TABLE(P_TABLE_IN) ea inner join MYTABLE ti on ea.attribute1 = ti.attribute1 and ea.attribute2 = ti.attribute2; END SP_TEST; 

并尝试添加如下参数:

 var oracleParam = new OracleParameter(); oracleParam.OracleDbType = OracleDbType.Array; oracleParam.Direction = ParameterDirection.Input; oracleParam.ParameterName = "P_TABLE_IN"; oracleParam.Value = entities; oracleCommand.Parameters.Add(oracleParam); 

其中实体是自定义实体集合的实例(具有已定义的oracle属性映射)

 public class EntityUdt { [OracleObjectMappingAttribute("attribute1")] public string attribute1 {get;set;} [OracleObjectMappingAttribute("attribute2")] public string attribute2 {get;set;} } 

我按照本指南正确定义.net实体,但通过我的列表仍然没有运气:

用户代码未处理System.InvalidOperationException
的HResult = -2146233079
Message =’EntityUdt :: attribute1 :: OracleObjectMappingAttribute’不能设置为’attribute1’的无效值
Source = Oracle.DataAccess StackTrace:at Oracle.DataAccess.Types.OracleUdtDescriptor.DescribeCustomType(Object customTypeFactory)

我花了几个小时试图找出问题,结果发现oracle属性定义的映射应该具有与属性名称不同的名称。

所以我只是将所有的映射属性都设置为大写,现在就可以了!

  [OracleObjectMappingAttribute("ATTRIBUTE1")] public string attribute1 { get; set; } [OracleObjectMappingAttribute("ATTRIBUTE2")] public string attribute2 { get; set; }