Передать значение пользовательского типа в качестве входного параметра в хранимую процедуру в Oracle из C # - PullRequest
0 голосов
/ 02 июля 2018

У меня проблема с тем, что я не могу сопоставить объект значения из C # с процедурой параметров Oracle.

В Oracle у меня есть такая структура:

CREATE OR REPLACE TYPE EMPMLOY AS OBJECT 
(
    FNAME VARCHAR2 (20),
    LNAME VARCHAR2 (20)
);

CREATE OR REPLACE PROCEDURE PROC_INSEMPLOY(P1 EMPMLOY)
IS
V_EMPLOY EMPMLOY;
BEGIN
    V_EMPLOY :=  P1;

   INSERT INTO MANAGE_EMPLYEE 
   VALUES (V_EMPLOY.FNAME, V_EMPLOY.LNAME);
END;

В C # код выглядит так:

[OracleCustomTypeMapping("EMPMLOY")]
public class Employ
{
    [OracleObjectMapping("FNAME")]
    public string Fname { get; set; }

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

using (var conn = new OracleConnection(cs))
{
    conn.Open();
    using (var cmd = conn.CreateCommand())
    {
        var employ = new Employ
        {
            Fname = "Thuy",
            Lname = "Tran"
        };

        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "PROC_INSEMPLOY";

        var param = new OracleParameter
        {
            ParameterName = "P1",
            Direction = ParameterDirection.Input,
            OracleDbType = OracleDbType.Object,
            UdtTypeName = "EMPMLOY",
            Value = employ
        };

        cmd.Parameters.Add(param);
        cmd.ExecuteNonQuery();
    }
}

Я получаю ошибку

Неверное имя параметра привязки параметра

Пожалуйста, помогите мне исправить это. Заранее спасибо!

1 Ответ

0 голосов
/ 04 июля 2018

У меня были похожие проблемы, но я читал пользовательские объекты из Oracle Advanced Queue. Чтобы решить мои проблемы, я создал IOracleCustomTypeFactory, как показано ниже:

[OracleCustomTypeMapping("EMPMLOY")]
public class EmployFactory : IOracleCustomTypeFactory
{
    public IOracleCustomType CreateObject()
    {
        return new Employ();
    }
}

Также мне понадобились следующие дополнения к объекту Class:

public class Employ : IOracleCustomType, INullable
{
    [OracleObjectMapping("FNAME")]
    public string Fname{ get; set; }

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

    public void FromCustomObject(OracleConnection con, IntPtr pUdt)
    {
        OracleUdt.SetValue(con, pUdt, "FNAME", this.Fname);
        OracleUdt.SetValue(con, pUdt, "LNAME", this.Lname);
    }

    public void ToCustomObject(OracleConnection con, IntPtr pUdt)
    {
        this.Fname = OracleUdt.GetValue(con, pUdt, "FNAME").ToString();
        this.Lname = OracleUdt.GetValue(con, pUdt, "LNAME").ToString();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...