Я пытаюсь вызвать хранимую процедуру в проекте C #, которая возвращает 2 значения в дополнение к некоторым входным параметрам в Oracle 11g.
Процедура представляет собой простой вход в систему, который возвращает varchar2 ('T' или 'F') ( oracle не принимает логические значения? ), если есть сохраненный пользователь, который совпадает с именем пользователя и паролем, и он должен вернуть номер (1 или 2) для типа пользователя.
Если я тестирую процедуру только с выходным параметром ' pexito ' (success), он работает, но не с ' ptipo ' (тип пользователя)) параметр.
Я попытался изменить тип данных параметра 'ptipo' на varchar2 и строку в коде c #, по-разному анализировать, преобразовывать в строку, а затем в int и многое другое. Ничего не работает, всегда одна и та же ошибка.
"Невозможно привести объект типа 'System.String' к типу 'Oracle.DataAccess.Client.OracleParameter'"
Вот код PL / SQL SP:
CREATE OR REPLACE PROCEDURE sp_login
(puser IN VARCHAR2, ppass IN VARCHAR2, pexito OUT VARCHAR2, ptipo OUT NUMBER )
AS
lfila NUMBER;
ltipo number;
BEGIN
SELECT COUNT(*)
INTO lfila
FROM usuario
WHERE user_login = puser AND pass_login = ppass;
SELECT idtipo_user
INTO ltipo
FROM usuario
WHERE user_login = puser AND pass_login = ppass;
IF lfila = 0 THEN pexito:='F';
ELSE pexito:='T';
END IF;
IF ltipo =NULL THEN ptipo:=NULL;
ELSE ptipo:=ltipo;
END IF;
END;
/
А вот код C #:
using System;
using System.Data;
using System.Windows.Forms;
using Oracle.DataAccess.Client;
//using System.Data.OracleClient; DEPRECATED
using Sistema_On_Tour.Vistas;
using Sistema_On_Tour.Controlador;
private void BtnIniciar_Click(object sender, EventArgs e)
{
OracleConnection conn = new OracleConnection(Conexion.conn);
try
{
conn.Open();
OracleCommand cmd = new OracleCommand("sp_login", conn);
cmd.CommandType = CommandType.StoredProcedure;
OracleParameter paruser = new OracleParameter("puser", OracleDbType.Varchar2);
paruser.Value= TxtUser.Text;
paruser.Direction = ParameterDirection.Input;
cmd.Parameters.Add(paruser);
OracleParameter parpass = new OracleParameter("ppass", OracleDbType.Varchar2);
parpass.Value = TxtPass.Text;
parpass.Direction = ParameterDirection.Input;
cmd.Parameters.Add(parpass);
OracleParameter parexito = new OracleParameter("pexito", OracleDbType.Varchar2);
parexito.Direction = ParameterDirection.Output;
parexito.Size = 1;
cmd.Parameters.Add(parexito);
OracleParameter ptipo = new OracleParameter("ptipo", OracleDbType.Int32);
ptipo.Direction = ParameterDirection.Output;
ptipo.Size = 1;
cmd.Parameters.Add("ptipo");
cmd.ExecuteNonQuery();
string exito = cmd.Parameters["pexito"].Value.ToString();
int tipouser = int.Parse(cmd.Parameters["ptipo"].Value.ToString());
if (exito.Equals('T'))
{
if (tipouser == 1)
{
this.Hide();
VentanaPrincipalApoderado v = new VentanaPrincipalApoderado();
v.Show();
}
else if(tipouser==2)
{
this.Hide();
VentanaPrincipalEjecutivo v = new VentanaPrincipalEjecutivo();
v.Show();
}
}
MessageBox.Show(exito);
}
catch(Exception error)
{
MessageBox.Show(error.Message);
}
finally
{
conn.Close();
}
}
}
}