无法在 C# 中将类型 'System.String' 的对象强制转换为类型 'Oracle.DataAccess.Client.OracleParameter'



我正在尝试调用 C# 项目中的存储过程,该项目除了在 Oracle 11g 中返回 2 个输入参数外,还返回 11 个值。 该过程是一个简单的登录,如果存储的用户与用户名和密码匹配,则返回 varchar2("T"或"F"((oracle 不接受布尔值?(,并且它应该返回一个数字(1 或 2(作为用户类型。

如果我只使用">pexito"(成功(输出参数测试该过程,它可以工作,但不适用于">ptipo"(用户类型((参数。

我尝试在 c# 代码中将"ptipo"参数的数据类型更改为 varchar2 和字符串,以不同的方式解析,转换为字符串,然后转换为 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();
}
}
}
} 

Line 有问题

cmd.Parameters.Add("ptipo");

相反,你必须做

cmd.Parameters.Add(ptipo);

注意:您必须将变量而不是变量的名称作为字符串传递。

这种事情是行不通的

OracleParameter paruser = new OracleParameter("puser", OracleDbType.Varchar2);
paruser.Value= TxtUser.Text;
paruser.Direction = ParameterDirection.Input;
cmd.Parameters.Add(paruser);    

就像下面的代码一样,你会得到转换错误。

cmd.Parameters.Add("P_UserName", OracleDbType.Varchar2).Value = login.UserName;
cmd.Parameters.Add("P_UPassword", OracleDbType.Varchar2).Value = login.Password;
cmd.Parameters.Add("cur_splogin", OracleDbType.RefCursor).Direction = ParameterDirection.Output;

最新更新