C#调用存储过程提示非法变量名。存储过程代码如下:create or replace procedure login_in(
p_loginid in varchar2,
p_password in varchar2,
p_admin out varchar2,
p_nam out varchar2,
p_reason out varchar2)
is
 
   v_count varchar2(10);
   v_adm  varchar2(50);
   v_reas varchar2(50);
   v_nam varchar2(50);
 begin 
 
        select count(*) into v_count from kd_tuser where  userid =p_loginid;
         if v_count<1 then
          v_reas :='noUser';
          v_adm:='-1' ;
           v_nam:='';
         else 
       select count(*) into v_count from kd_tuser
             WHERE userid = p_loginid AND password =p_password;
             
                     if v_count<1 then
                    v_reas:='pError';
                   v_adm:= '-1';
                     v_nam:='';
                    else
                    v_reas:='access';
                    end if;
          end if;
             p_reason:=v_reas;
             p_admin:=v_adm;
             p_nam:=v_nam;
             
end login_in;调用代码c#侧:webconfig文件中连接串:<configuration>
 <configSections>
  ////省略
  ///连接字符串
  <add key="ConnectionString" value="Data Source=hh_conn;User ID=lyjfsoftsys;Password=sjfx0224"/>
 </appSettings>
登陆验证:
OracleConnection myConnection = new OracleConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
       ////存储过程名称login_in
            OracleCommand myCommand = new OracleCommand("LOGIN_IN", myConnection);
           
 
            OracleParameter parameterLoginID = new OracleParameter("p_loginid",OracleType.VarChar,50);
            parameterLoginID.Direction = ParameterDirection.Input;
   parameterLoginID.Value = loginid;
   myCommand.Parameters.Add(parameterLoginID);
 
            OracleParameter parameterPassword = new OracleParameter("p_password",OracleType.VarChar,50);
            parameterPassword.Direction = ParameterDirection.Input;
   parameterPassword.Value = password;
   myCommand.Parameters.Add(parameterPassword);
 
            OracleParameter parameterADMIN = new OracleParameter("p_admin",OracleType.VarChar,50);
            parameterADMIN.Direction = ParameterDirection.Output;
            myCommand.Parameters.Add(parameterADMIN);
 
            OracleParameter parameterUSERNAME = new OracleParameter("p_nam",OracleType.VarChar,100);
            parameterUSERNAME.Direction = ParameterDirection.Output;
            myCommand.Parameters.Add(parameterUSERNAME);
 
            OracleParameter parameterReason = new OracleParameter("p_reason",OracleType.VarChar,20);
            parameterReason.Direction = ParameterDirection.Output;
            myCommand.Parameters.Add(parameterReason);
 
            myConnection.Open();
            myCommand.ExecuteNonQuery();
            myConnection.Close();
运行到myCommand.ExecuteNonQuery();倒数第二句出错。提示非法变量名。急求解决。

解决方案 »

  1.   

    oracle里存储过程的参数不用加@符号吗?
    以下是SQL的写法:OracleParameter parameterReason = new OracleParameter("@p_reason",OracleType.VarChar,20);
      

  2.   

    刚看了oracle区,不需要加.那么看看你的变量名是否与过程里的对应.
      

  3.   

    我给你提供一个思路吧,首先在oracle里面对存储过程进行测试,然后在调用,调用跟连接sql差不多,
    我看你的存储过程就有点问题
    如果WHERE userid = p_loginid AND password =p_password条件下没记录,你的into v_count 是会报异常的。
      

  4.   


    ORACLE是加:(冒号)的。
      

  5.   

    OracleParameter parameterReason = new OracleParameter("@p_reason",OracleType.VarChar,20);其实SQLSERVER这里也可以不加@