Проблема с пользовательским сопоставлением UDT в C# при вызове хранимой процедуры из базы данных Oracle.C#

Место общения программистов C#
Ответить
Anonymous
 Проблема с пользовательским сопоставлением UDT в C# при вызове хранимой процедуры из базы данных Oracle.

Сообщение Anonymous »

В настоящее время мы находимся на этапе перехода от собственного монолитного к Azure Cloud iPaaS.
В старом коде у нас есть приведенный ниже код для выполнения процедуры хранения Oracle

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

    Class.forName("oracle.jdbc.driver.OracleDriver");
connection = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
String typeNameOut = "APPS.p_insert_esb_task";
String typeTableNameOut = "APPS.p_task_rec_out_type";

StructDescriptor structDescriptorOut = StructDescriptor.createDescriptor(typeNameOut.toUpperCase(), connection);

ResultSetMetaData rsMetaData = structDescriptorOut.getMetaData();
cs = connection.prepareCall("{call APPS.XXKR_PA_PROJ_TASK_ESB_PKG.proc_to_fet_tsk_data(?,?)}");
cs.registerOutParameter(1, Types.ARRAY, typeTableNameOut.toUpperCase());
cs.setObject(2, maxBatchSize, Types.NUMERIC);
cs.execute();

if (name == null) {
return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
} else {
return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
}
Теперь на C# я написал аналогичный код, как показано ниже:

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

    string typeTableNameOut = "APPS.p_task_rec_out_type";

OracleParameter structDescriptorOut = new()
{
ParameterName = "structDescriptorOut",
UdtTypeName = typeNameOut.ToUpper(),
OracleDbType = OracleDbType.Object
};

OracleParameter arrayDescriptorOut = new()
{
ParameterName = "arrayDescriptorOut",
UdtTypeName = typeTableNameOut.ToUpper(),
OracleDbType = OracleDbType.Object,
Direction = ParameterDirection.Output
};

OracleParameter numericDescriptorIn = new()
{
ParameterName = "numericDescriptorIn",
OracleDbType = OracleDbType.Int16,
Direction = ParameterDirection.Output,
Value = maxBatchSize
};

cs = new(Constants.PA22ProjectTaskOracleSPName, connection)
{
CommandType = CommandType.StoredProcedure
};
cs.Parameters.Add(arrayDescriptorOut);
cs.Parameters.Add(numericDescriptorIn);

await cs.ExecuteNonQueryAsync();
Во время работы я узнал, что мы написали класс Custom Mapping

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

public void ToCustomObject(OracleConnection con, object pUdt)
{
/* Элементы массива = (Array)pUdt;

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

for (int i = 0; i < elements.Length; i++)
{
// Get the i-th element (THIS is your actual object UDT)
object elemObj = elements.GetValue(i);

// Now fetch attributes FROM THE ELEMENT, not pUdt.
var v = OracleUdt.GetValue(con, elemObj, "PARENT_TASK_ID");
ParentTaskId = v == null || v == DBNull.Value ? (decimal?)null : (decimal)v;
}*/

var v = OracleUdt.GetValue(con, pUdt, "PARENT_TASK_ID");
ParentTaskId = v == null || v == DBNull.Value ? (decimal?)null : (decimal)v;

v = OracleUdt.GetValue(con, pUdt, "TASK_STRAT_DATE");
TaskStratDate = v == null || v == DBNull.Value ? (DateTime?)null : (DateTime)v;

v = OracleUdt.GetValue(con, pUdt, "CHARGABLE");
Chargable = v == null || v == DBNull.Value ? null : (string)v;
Но ничего не работает. во время отладки я получаю system.invalidCastException: невозможно привести объект типа "OracleInternal.UDT.Types.UDTPickleCollectionInst" к типу "System.Array".
Во время отладки это pUdt появляется в Array.
Я потратил почти 3 дня, чтобы попробовать много классов отображения коллекции изменений, но безуспешно.
Буду признателен за любую помощь!

Подробнее здесь: https://stackoverflow.com/questions/798 ... from-oracl
Ответить

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

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

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

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

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