我已经验证我的方法/ Oracle过程正常工作,但在我的C#中,我总是从ExecuteNonQuery()返回-1。因此,下面的bool总是假的。我们只在DB(Oracle)中使用触发器来执行INSERT语句。我是否需要触发更新语句?
为什么会发生这种情况的任何建议?它肯定会更新一条记录:
public bool ChangePassword(long UserId, string NewPassword)
{
int rcds = 0;
using (OracleConnection dbConn = new OracleConnection(dbConnString))
using (OracleCommand dbCmd = new OracleCommand("PKG_USER.CHANGE_PASSWORD", dbConn))
{
try
{
string salt = GenerateSalt();
dbCmd.CommandType = CommandType.StoredProcedure;
dbCmd.Parameters.Add("p_USER_ID", OracleDbType.Int64, UserId, ParameterDirection.Input);
dbCmd.Parameters.Add("P_PASSWORD", OracleDbType.Varchar2, 128, EncodePassword(NewPassword, this.IsPasswordHashed, salt), ParameterDirection.Input);
dbCmd.Parameters.Add("P_PASSWORD_SALT", OracleDbType.Varchar2, 128, salt, ParameterDirection.Input);
if (dbConn.State != ConnectionState.Open) dbConn.Open();
rcds = dbCmd.ExecuteNonQuery();
}
catch (Exception e)
{
LastError = e.Message + " " + e.Source;
rcds = 0;
}
finally
{
dbCmd.Dispose();
dbConn.Dispose();
}
}
return (rcds > 0);
}
对不起......继承人SP:
PROCEDURE Change_Password(p_User_Id IN Users.User_Id%TYPE,
p_Password IN Users.Password%TYPE,
p_Password_Salt IN Users.Password_Salt%TYPE) IS
BEGIN
UPDATE Users
SET Password = p_Password,
Password_Salt = p_Password_Salt,
Password_Change_Date = SYSDATE
WHERE User_Id = p_User_Id;
END Change_Password;
答案 0 :(得分:13)
尝试显式返回SQL%ROWCOUNT。
根据MSDN,DbCommand..ExecuteNonQuery将始终为存储过程调用返回-1:
对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数。对于所有其他类型的语句,返回值为-1。
如果我在使用大量存储过程的时候记得正确,我相信您需要使用输出参数来返回更新行数等内容。
答案 1 :(得分:1)
我不是甲骨文家伙,但显然有一个命令:
set feedback off
阻止它返回受影响的记录数。这行是在存储过程中吗?或者你试过'设置反馈'?从功能上来说,我认为这与SQL Server的SET NOCOUNT ON / OFF命令相反。