C# Передача массива объектов (UDT) в хранимую процедуру Oracle возвращает исключение «Столбец содержит данные NULL» в ExC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 C# Передача массива объектов (UDT) в хранимую процедуру Oracle возвращает исключение «Столбец содержит данные NULL» в Ex

Сообщение Anonymous »

Я пытаюсь создать тестовое приложение, которое будет передавать массив объектов (в моем случае сотрудников) в хранимую процедуру Oracle.
Когда я вызываю ExecuteReader при вызове процедуры получаю ошибку

Столбец содержит NULL-данные

но я понятия не имею, что это значит.
Вот код, который я использую. У меня есть следующий класс:

Код: Выделить всё

[OracleCustomTypeMapping("EMTEST")]
public class Employee : IOracleCustomType, INullable
{

public Employee(int? Id, string Name)
{
this.Id = Id;
this.Name = Name;
}

[OracleObjectMapping("Name")]
public string Name { get; set; }

[OracleObjectMapping("Id")]
public int? Id { get; set; }

public bool IsNull { get; set; }

public static Employee Null => new Employee(0, "") { IsNull = true };

public void FromCustomObject(OracleConnection con, object udt)
{
OracleUdt.SetValue(con, udt, "Id", Id);
OracleUdt.SetValue(con, udt, "Name", Name);
}

public void ToCustomObject(OracleConnection con, object udt)
{
Id = ((int?)(OracleUdt.GetValue(con, udt, "Id")));
Name = ((string)(OracleUdt.GetValue(con, udt, "Name")));
}
}
На стороне Oracle я создаю тип:

Код: Выделить всё

create or replace TYPE EMTEST AS OBJECT
(
Id number  null,
Name varchar2(50)  null
);
И процедура в пакете под названием PKS_CARAT
Это заголовок (где определена таблица типа):

Код: Выделить всё

type T_EMTEST_ARRAY is table of EMTEST;

procedure TestGetObjectsBack(
Employes in T_EMTEST_ARRAY,
ResultTest OUT RC_Result
);
Это тело:

Код: Выделить всё

procedure TestGetObjectsBack(
Employes in T_EMTEST_ARRAY,
ResultTest OUT RC_Result
)
is

begin

OPEN ResultTest FOR
select 1 as Id,'mika' as Name from dual;

-- select e.Id,e.Name from table (Employes) e;

end TestGetObjectsBack;
Это код, вызывающий хранимую процедуру:

Код: Выделить всё

var oracleConnection = new OracleConnection("User Id=xxx;Password=xxx;Data Source=ORAKISDEV2;Connection Lifetime=10;Min Pool Size=1;Max Pool Size=200;");

var employeList = new List()
{
new Employee(1,"Zoki"),
new Employee(2, "Pera"),
};

var employeArray = employeList.ToArray();

var employeParam = new OracleParameter("Employes", OracleDbType.Object,  ParameterDirection.Input);
employeParam.CollectionType = OracleCollectionType.PLSQLAssociativeArray;

employeParam.Size = employeArray.Length;
employeParam.UdtTypeName = "PKS_CARAT.T_EMTEST_ARRAY";
employeParam.Value = employeArray;

var cursor = new OracleParameter("ResultTest", OracleDbType.RefCursor, ParameterDirection.Output);

oracleConnection.Open();
using (var oracleCommand = oracleConnection.CreateCommand())
{
oracleCommand.Connection = oracleConnection;
oracleCommand.CommandText = "PKS_CARAT.TestGetObjectsBack";
oracleCommand.CommandType = CommandType.StoredProcedure;
oracleCommand.BindByName = true;

oracleCommand.Parameters.Add(employeParam);
oracleCommand.Parameters.Add(cursor);

var reader = oracleCommand.ExecuteReader();
....

Я прочитал много статей, и самые важные из них:
  • передача массива объектов в хранимую процедуру Oracle с использованием ODP Управляемый клиент .Net
  • Почему я получаю сообщение «Неверная привязка параметра» при использовании хранимой процедуры Oracle с Udt и C#
Я перепробовал много предложений, но ни одно из них не помогло. Я по-прежнему получаю сообщение Столбец содержит NULL-данные без каких-либо объяснений, какие данные имеют значение NULL или почему возникает эта проблема.
Я проверил, совпадают ли мои столбцы из класса и типа оракула, и это выглядят так, как будто они есть.
Полный текст исключения:
"Столбец содержит данные NULL".
Из "Oracle.ManagedDataAccess"
< /p>
Тип исключения: System.InvalidCastException
Я использую пакет nuget Oracle.ManagedDataAccess.Core версии 3.21.80 >
Вот верхняя часть трассировки стека исключения:

Код: Выделить всё

OracleInternal.UDT.Types.UDTNamedType.GetNamedTypeMetaData(OracleConnection conn, OracleCommand getTypeCmd)
at OracleInternal.UDT.Types.UDTTypeCache.GetMetaData(OracleConnection conn, UDTNamedType udtType)
at OracleInternal.UDT.Types.UDTTypeCache.CreateUDTType(OracleConnection conn, String schemaName, String typeName)
at OracleInternal.UDT.Types.UDTTypeCache.GetUDTType(OracleConnection conn, String schemaName, String typeName)
at OracleInternal.ConnectionPool.OraclePoolManager.GetUDTType(OracleConnection conn, String schemaName, String typeName)
at Oracle.ManagedDataAccess.Client.OracleConnection.GetUDTTypeFromCache(String schemaName, String typeName)
at Oracle.ManagedDataAccess.Client.OracleParameter.GetUDTType(OracleConnection conn)
at Oracle.ManagedDataAccess.Client.OracleParameter.PreBind_UDT(OracleConnection conn)
at Oracle.ManagedDataAccess.Client.OracleParameter.PreBind(OracleConnectionImpl connImpl, ColumnDescribeInfo cachedParamMetadata, Boolean& bMetadataModified, Int32 arrayBindCount, ColumnDescribeInfo& paramMetaData, Object& paramValue, Boolean isEFSelectStatement, SqlStatementType stmtType)
at OracleInternal.ServiceObjects.OracleCommandImpl.InitializeParamInfo(ICollection paramColl, OracleConnectionImpl connectionImpl, ColumnDescribeInfo[] cachedParamMetadata, Boolean& bMetadataModified, Boolean isEFSelectStatement, MarshalBindParameterValueHelper& marshalBindValuesHelper)
at OracleInternal.ServiceObjects.OracleCommandImpl.ProcessParameters(OracleParameterCollection paramColl, OracleConnectionImpl connectionImpl, ColumnDescribeInfo[] cachedParamMetadata, Boolean& bBindMetadataModified, Boolean isEFSelectStatement, MarshalBindParameterValueHelper& marshalBindValuesHelper)
at OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteReader(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, OracleDataReaderImpl& rdrImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64[] scnForExecution, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, Int64& internalInitialLOBFS, Int64 internalInitialJSONFS, OracleException& exceptionForArrayBindDML, OracleConnection connection, IEnumerable`1 adrianParsedStmt, Boolean isDescribeOnly, Boolean isFromEF)
at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior)
at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader()
at OracleArrayTest.Program.TestCollectionCustom() in C:\project\BulkProject\OracleArrayTest\Program.cs:line 203
Кто-нибудь знает, что я делаю неправильно?
Что мне говорит это исключение?

Подробнее здесь: https://stackoverflow.com/questions/752 ... -exception
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»