c# OracleParameter выдает ORA-06502 - PullRequest
1 голос
/ 09 июля 2020

У меня есть Oracle база данных со следующей функцией

create or replace PACKAGE PCK_A IS

FUNCTION InsertPerson(
    pi_FirstName IN person.firstname%type,
    pi_LastName IN person.lastname%type,
    pi_CompanyName IN person.companyname%type,
    pi_Email IN person.emailaddress%type,
    pi_Phone IN phonenumbers.phoneno%type,
    pi_User IN user.name%type
) RETURN NUMBER;

Таблица PERSON определяется как

CREATE TABLE "person" ( 
  "ID" NUMBER(7,0) NOT NULL ENABLE,  
  "EMAILADDRESS" VARCHAR2(60 BYTE),
  "FIRSTNAME" VARCHAR2(50 BYTE) DEFAULT NULL, 
  "LASTNAME" VARCHAR2(50 BYTE) DEFAULT NULL, 
  "COMPANYNAME" VARCHAR2(100 BYTE) DEFAULT NULL, 
   CONSTRAINT "PK_PERSON" PRIMARY KEY ("ID"));

Мне нужно вызвать эту функцию в коде C#, поэтому я создал следующий метод:

public long InsertPerson(OracleConnection connection, OracleTransaction transaction) {
  using (var cmd = connection.CreateCommand()) {
    cmd.Transaction = transaction;
    cmd.CommandText = @"begin 
                          :personId := PCK_A.InsertPerson('Name', 'Surname', 'Company', 'mail@company.com', '123456789', 'user'); 
                        end;";
    cmd.Parameters.Add("personId", OracleDbType.Decimal, ParameterDirection.ReturnValue).Size = 7;
    cmd.ExecuteNonQuery();

    return ((OracleDecimal) cmd.Parameters["contactPersonId"].Value).ToInt64();
   }
}

Этот код работает правильно. Но когда я использую OracleParameter для параметра функции ExecuteNonQuery , выдает: Oracle .DataAccess.Client.OracleException: 'ORA-06502: PL / SQL: numeri c или ошибка значения: буфер строки символов слишком мал ORA-06512: в строке 2 '

Вот C# скорректированный метод, вызывающий проблему:

public long InsertPerson(OracleConnection connection, OracleTransaction transaction) {
   using (var cmd = connection.CreateCommand()) {
      cmd.Transaction = transaction;
      cmd.CommandText = @"begin 
                             :personId := PCK_A.InsertPerson(:pFirstName, 'Surname', 'Company', 'mail@company.com', '123456789', 'user'); 
                          end;";
      cmd.Parameters.Add("pFirstName", OracleDbType.Varchar2, 50, contact.FirstName, ParameterDirection.Input);
      cmd.Parameters.Add("personId", OracleDbType.Decimal, ParameterDirection.ReturnValue).Size = 7;
      cmd.ExecuteNonQuery();

      return ((OracleDecimal) cmd.Parameters["contactPersonId"].Value).ToInt64();
  }

}

Что не так?

1 Ответ

0 голосов
/ 09 июля 2020

Попробуйте удалить часть этого параметра .Size = 7;. Это размер в байтах, в то время как Oracle s NUMBER(7, 0) не уменьшает размер памяти числа, а только логически ограничивает возможные значения (то есть контролирует, что значения составляют не более 7 цифр , а не 7 байтов )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...