2015-06-30 3 views
7

Я пытаюсь выполнить хранимую процедуру Oracle (1 вход и 2 выходных параметра) с использованием C#.Ошибка при выполнении хранимой процедуры Oracle с использованием C#

Моя таблица содержит 3 колонки; целое число id и 2 столбца типа varchar2.

Это определение таблицы:

CREATE TABLE TESTTABLE 
(
    ID INT Not Null, 
    FNAME VARCHAR2(200), 
    LNAME VARCHAR2(200), 
    Constraint PK Primary Key (ID) 
); 

Это моя хранимая процедура:

create or replace PROCEDURE TESTP 
(
    tempID IN TESTTABLE.ID%Type, 
    tempName Out TESTTABLE.NAME%TYPE, 
    tempLName out TESTTABLE.LNAME%TYPE 
) 
AS 
BEGIN 
    select Name, LNAME 
    into tempName, tempLName 
    from TestTable 
    where ID = tempID; 
END; 

Вот код для выполнения этой процедуры из C#:

try 
{ 
      Int32 id = 1; 
      string FName = "", LName = ""; 

      using (_ora.GetOracleConnection()) 
      { 
       Oracle.DataAccess.Client.OracleCommand cmd = new Oracle.DataAccess.Client.OracleCommand("TESTP", _ora.GetOracleConnection()); 
       cmd.CommandType = CommandType.StoredProcedure; 

       cmd.Parameters.Add("tempId", Oracle.DataAccess.Client.OracleDbType.Int32,ParameterDirection.Input).Value = id; 
       cmd.Parameters.Add("tempName", Oracle.DataAccess.Client.OracleDbType.Varchar2,200,ParameterDirection.Output).Value = FName; 
       cmd.Parameters.Add("tempLName", Oracle.DataAccess.Client.OracleDbType.Varchar2,200,ParameterDirection.Output).Value = LName; 

       cmd.ExecuteNonQuery(); 
      } 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.ToString()); 
} 

Это генерируемое исключение:

Oracle.DataAccess.Client.OracleException ORA-06502: PL/SQL: числовые или значение ошибки
ORA-06512: на "USMANDBA.TESTP", строка 9

Может кто-нибудь мне помочь?

+0

Можете ли вы выслать код '_ora.GetOracleConnection()'? –

+0

его просто метод для возврата в настоящее время открытого объекта oracleconnection. –

+0

Вот как устанавливается соединение: con = new OracleConnection(); con.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings ["MyConnection"]. ConnectionString.ToString(); con.Open(); и это метод public OracleConnection GetOracleConnection() { return this.con; } –

ответ

2

Эти изменения в код работает для меня:

using (connection) 
{ 
    Int32 id = 1; 
    OracleCommand cmd = new OracleCommand("TESTP", connection); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add("tempID", OracleDbType.Int32, ParameterDirection.Input).Value = id; 
    cmd.Parameters.Add("tempName", OracleDbType.Varchar2, 200).Direction = ParameterDirection.Output; 
    cmd.Parameters.Add("tempLName", OracleDbType.Varchar2, 200).Direction = ParameterDirection.Output; 
    cmd.ExecuteNonQuery(); 
    string FName = cmd.Parameters["tempName"].Value.ToString(); 
    string LName = cmd.Parameters["tempLName"].Value.ToString(); 
} 

Вы также можете добавить блоки исключений в процедуре Oracle для обработки NO_DATA_FOUND исключение и избежать ORA-01403 ошибки, как здесь:

CREATE OR REPLACE PROCEDURE TESTP (tempID IN TESTTABLE.ID%Type, 
    tempName out TESTTABLE.NAME%TYPE, tempLName out TESTTABLE.LNAME%TYPE) AS 
BEGIN 
    select Name, LNAME Into tempName,tempLName from TestTable Where ID = tempID; 
EXCEPTION WHEN NO_DATA_FOUND THEN 
    tempName := null; 
    tempLName := null; 
END; 

и добавить дополнительный параметр OUT, информирующий об успехе или неудаче и обрабатывая его в коде C#.

+0

спасибо, что так много брата .. это сработало .. –

Смежные вопросы