C#+ Pl / SQL问题,存储过程中没有参数

时间:2018-11-14 17:30:01

标签: c# sql oracle plsql

我有一个如下所示的存储过程:

CREATE OR REPLACE PROCEDURE
Get_Username
(
    p_Username IN user.USERNAME%TYPE,
    p_ReturningUsername OUT user.Username%TYPE
)
IS
BEGIN
    SELECT username INTO p_ReturningUsername FROM user WHERE p_Username = username;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        p_ReturningUsername := null;
END;

我已经从数据库中执行了它,并且效果很好。 当我从c#应用程序执行它时,我没有任何回报。

public bool getUsername(string username)
    {
        OracleConnection connection = getConnection();
        OracleCommand oracleCommand = new OracleCommand("Get_Username", connection);
        oracleCommand.CommandType = CommandType.StoredProcedure;
        oracleCommand.Parameters.Add("p_ReturningUsername", OracleDbType.Varchar2).Direction = ParameterDirection.Output;
        oracleCommand.Parameters.Add("p_Username", OracleDbType.Varchar2).Value = username;

        try
        {
            oracleCommand.ExecuteNonQuery();
        }
        catch (OracleException ex)
        {
            MessageBox.Show("Exception Message: " + ex.Message);
            MessageBox.Show("Exception Source: " + ex.Source);
        }


        string tmp = oracleCommand.Parameters["p_ReturningUsername"].Value.ToString();
        connection.Close();
        return tmp == username;
    }

对于WPF注册窗口,我需要检查用户名是否已被使用。 当我执行此代码时,当它必须是用户表中的用户名时,我会收到一个空字符串。

请帮助我,谢谢。

2 个答案:

答案 0 :(得分:2)

正如@Codo所说,添加行command.BindByName = true;,但也替换行

        oracleCommand.Parameters.Add("p_ReturningUsername", OracleDbType.Varchar2).Direction = ParameterDirection.Output;

使用

        oracleCommand.Parameters.Add("p_ReturningUsername", OracleDbType.Varchar2, 100, null, ParameterDirection.Output);

100列中的数字username替换为字符数。

我们使用Add方法的重载,以便我们可以指定输出参数的大小。这使Oracle驱动程序有足够的空间来从数据库接收值。 null参数用于参数的初始值,我们不关心它的初始值,因为这是一个输出参数,但是我们必须指定它,因为Add方法没有重载仅使用名称,类型,大小和方向。

答案 1 :(得分:0)

尝试以下代码(我刚刚交换了两行):

public bool getUsername(string username)
    {
        OracleConnection connection = getConnection();
        OracleCommand oracleCommand = new OracleCommand("Get_Username", connection);
        oracleCommand.CommandType = CommandType.StoredProcedure;
        oracleCommand.Parameters.Add("p_Username", OracleDbType.Varchar2).Value = username;
        oracleCommand.Parameters.Add("p_ReturningUsername", OracleDbType.Varchar2).Direction = ParameterDirection.Output;

        try
        {
            oracleCommand.ExecuteNonQuery();
        }
        catch (OracleException ex)
        {
            MessageBox.Show("Exception Message: " + ex.Message);
            MessageBox.Show("Exception Source: " + ex.Source);
        }


        string tmp = oracleCommand.Parameters["p_ReturningUsername"].Value.ToString();
        connection.Close();
        return tmp == username;
    }

或添加:

oracleCommand.BindByName = true;

默认情况下,OracleCommand类按顺序而不是按名称绑定参数。