我有一个如下所示的存储过程:
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/