在C#中调用存储过程

时间:2014-01-16 16:34:35

标签: c# oracle stored-procedures

我有这个存储过程

create or replace procedure get_login(p_username in varchar2)
is

begin
    select USERPASSWORD 
    from LOGIN 
    where USERNAME = p_username;

end;

我尝试使用此

在C#中调用它
public string login(string username)
{    
    try
    {
        conn.Open();
        OracleCommand cmd = new OracleCommand("get_login",conn);
        cmd.CommandType = CommandType.StoredProcedure;

        OracleParameter obja = new OracleParameter("P_USERNAME", OracleDbType.Varchar2, ParameterDirection.Input);
        obja.Value = username;
        obja.UdtTypeName = "varchar2";
      //  OracleParameter objb = new OracleParameter("P_USERPASSWORD", OracleDbType.Varchar2, ParameterDirection.Output);
        cmd.Parameters.Add(obja);

        Login = cmd.ExecuteScalar().ToString(); 
    }
    catch(Exception ex)
    {
        throw ex;
    }   
    finally
    {
        conn.Close();
    }
    return Login;
}

但是当我运行它时我得到了这个错误:

  

ORA-06550:Regel 1,kolom 7:
  PLS-00306:调用'GET_LOGIN'时参数的数量或类型错误。
  ORA-06550:Regel 1,kolom 7:
  PL / SQL:语句被忽略。
  System.Exception {Oracle.DataAccess.Client.OracleException}

我不确定我在这里做错了什么。它可能是程序,但在数据库中测试工作。我可能做错了什么,我不知道是什么。

另外,如果我可以问obja.UdtTypeName是什么意思?我跟着一个朋友的例子,所以我不太确定。

P.S:英语不是我的第一语言,所以如果我有些错误的话我很抱歉

编辑:

public DBConnect()
{
    conn = new OracleConnection();

    String pcn = "login";
    String pw = "pass";



    conn.ConnectionString = "User Id=" + pcn + ";Password=" + pw + ";Data Source=" + "//ipofdatabase" + ";";
}

EDIT2:

create or replace 
procedure get_login(p_username in varchar2)
is
begin
select USERPASSWORD from LOGIN where USERNAME = p_username;
end;

当我这样做时,我收到此错误: 错误(4,1):PLS-00428:此SELECT语句中需要INTO子句

1 个答案:

答案 0 :(得分:3)

您只添加了1个参数:

    OracleParameter objb = new OracleParameter("P_USERPASSWORD",       OracleDbType.Varchar2, ParameterDirection.Output);
    cmd.Parameters.Add(obja);

应该是:

   OracleParameter objb = new OracleParameter("P_USERPASSWORD", OracleDbType.Varchar2, ParameterDirection.Output);
   cmd.Parameters.Add(obja);
   objb.Size = 255;
   cmd.Parameters.Add(objb);

要获取值,请更改:

Login = cmd.ExecuteScalar().ToString(); 

对此:

cmd.ExecuteNonQuery();
Login = objb.Value.ToString();