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

标签 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 注册窗口,我需要检查用户名是否已被占用。 当我执行此代码时,我收到一个空字符串,因为它必须是用户表中的用户名。

请帮助我,提前致谢。

最佳答案

正如@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 替换为您的用户名 列中的字符数。

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

关于C# + Pl/SQL 存储过程中没有参数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53305776/

相关文章:

c# - Angular + ASP.NET Core Web API : 404 on new controller endpoints

c# - 当 Item 改变时通知 ObservableCollection

MySQL乘法

java - Hibernate:修改条件 sqlrestriction 以使用大于或等于日期

sql - 选择 Oracle 字典 View 中可能不存在的列

c# - 如何检测 Entity Framework Core 2.x 中特定实体的属性更改?

c# - 来自设置的常量字符串

sql - 可以组合日期和时间并存储为日期时间格式

MySQL根据列值生成随机数

oracle - 检测for循环中的最后一条记录