【问题标题】:Oracle Stored Procedure not returning any valueOracle 存储过程不返回任何值
【发布时间】:2014-05-28 09:56:24
【问题描述】:

我正在从 c# 登录表单调用 oracle 存储过程,但它没有返回任何值。因此,下面的dt.rows.count 始终为 0,并且 if-else 语句的 if 部分永远不会执行,它总是会到达 else 部分。

C# 代码:

String sConnectionString = "Data Source=XE;User ID=system;Password=system;";

OracleConnection myConnection = new OracleConnection(sConnectionString);
myConnection.Open();

OracleCommand myCommand = new OracleCommand("spValidateDBA", myConnection);

myCommand.CommandType = CommandType.StoredProcedure;
myCommand.CommandText = "spValidateDBA";
myCommand.Parameters.Add("UserName", OracleDbType.Varchar2, 50);
myCommand.Parameters["UserName"].Value = txtUsrId.Text.ToString();
myCommand.Parameters.Add("UserPassword", OracleDbType.Varchar2, 50);
myCommand.Parameters["UserPassword"].Value = txtPassword.Text.ToString();
myCommand.Parameters.Add("DataCount", OracleDbType.Int32, 20).Direction =
ParameterDirection.Output;
OracleDataReader myReader = myCommand.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(myReader);


if (dt.Rows.Count>0)
    {
        CustomMsgbox.Show("\tLogin Successful\t" + Environment.NewLine +  
        "Welcome to DB Utilities Tool", "DB Utilities Tool", "OK", "Cancel");
        DBA dba = new DBA();
        dba.Show();
        this.Hide();
    }

else
    CustomMsgbox.Show("Please enter correct Username/password",
    "DB Utilities Tool", "OK", "Cancel");
        myConnection.Close();
}    

Oracle 存储过程:

create or replace PROCEDURE spValidateDBA(
    UserName IN VARCHAR2,
    UserPassword IN VARCHAR2,
  DataCount OUT INTEGER)
  AS
BEGIN
select count(*) into DataCount from DBA_USER where USER_NAME=UserName and
    USER_PWD=UserPassword and USER_ROLE = 'DBA';
    END spValidateDBA;

请注意,表 DBA_USER 当前包含 1 行,其值为:

USER_NAME   USER_PWD    USER_ROLE
   dask       password     DBA

因此,当登录表单的输入为 dask(username) & password(userpassword) 时,上述存储过程中的 DataCount 应该返回 1 行,值为 1,但它没有返回任何内容。

有人可以告诉我我哪里出了问题吗?我真的需要尽快解决这个问题。

【问题讨论】:

  • 天啊。当有一个名为 DBA_USERS 的系统视图时,为什么要创建一个名为 DBA_USER 的表?当 Oracle 会话完全能够处理这个问题时,为什么还要实现自己的用户验证逻辑?为什么你坚持创建自己的DBA 角色而不是使用predefined DBA 角色?对于熟悉 Oracle 的人来说,这段代码非常非常令人困惑。

标签: c# oracle validation login


【解决方案1】:

您没有从您的 SP 返回任何结果集,因此您的数据表将始终为空。您在输出参数中返回值。使用ExecuteNonQuery,然后从参数中读取值。

试试这个

myCommand.ExecuteNonQuery();
int dataCount = 0;
if(myCommand.Parameters["DataCount"] ! =null)
{
  dataCount = Convert.ToInt32(myCommand.Parameters["DataCount"].Value);
}

if(dataCount > 0)
{
   CustomMsgbox.Show("...");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2021-06-14
    • 2011-04-26
    • 1970-01-01
    • 2017-07-12
    相关资源
    最近更新 更多