我有一个如下所示的存储过程:
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注册窗口,我需要检查用户名是否已被使用。 当我执行此代码时,当它必须是用户表中的用户名时,我会收到一个空字符串。
请帮助我,谢谢。
答案 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
类按顺序而不是按名称绑定参数。