Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新记录时,ExecuteNonQuery()在更新中返回-1_C#_Asp.net_Oracle11g - Fatal编程技术网

C# 更新记录时,ExecuteNonQuery()在更新中返回-1

C# 更新记录时,ExecuteNonQuery()在更新中返回-1,c#,asp.net,oracle11g,C#,Asp.net,Oracle11g,我已经验证了我的方法/Oracle过程是否正常工作,但在我的C#中,我总是从ExecuteNonQuery()返回-1。因此,下面的布尔值总是错误的。我们只在DB(Oracle)中为INSERT语句使用触发器。我需要update语句的触发器吗 有什么建议可以解释为什么会这样吗?它肯定在更新一个记录: public bool ChangePassword(long UserId, string NewPassword) { int rcds = 0; usi

我已经验证了我的方法/Oracle过程是否正常工作,但在我的C#中,我总是从ExecuteNonQuery()返回-1。因此,下面的布尔值总是错误的。我们只在DB(Oracle)中为INSERT语句使用触发器。我需要update语句的触发器吗

有什么建议可以解释为什么会这样吗?它肯定在更新一个记录:

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;

我不是神谕专家,但显然有一个命令:

set feedback off
这会阻止它返回受影响记录的计数。这行在存储过程中吗?或者你试过“设置反馈”吗?在功能上,我认为这与SQL Server的SET NOCOUNT ON/OFF命令正好相反。

尝试显式返回SQL%ROWCOUNT

根据MSDN,对于存储过程调用,DbCommand..ExecuteOnQuery将始终返回-1:

对于UPDATE、INSERT和DELETE语句,返回值是受命令影响的行数。对于所有其他类型的语句,返回值为-1


如果我在使用大量存储过程的日子里没有记错的话,我相信您需要使用一个输出参数来返回诸如更新行数之类的内容。

您的存储过程是什么样子的?但是ExecuteOnQuery方法不应该返回值,而不是一个额外的输出参数吗?这就是MSDN上的声音。@Barryman9000-我不是这样读的,它也不是如何在SqlCommand上工作的-您没有发出更新/插入/删除命令,您正在发出对存储过程的调用-因此ExecuteOnQuery的返回值将是-1。如果需要一个值,则需要在输出参数中返回它。(请注意,OracleCommand还可以为创建/删除表请求返回0:)啊哈。。。我在想,因为我正在更新我的表,所以我发出了更新命令。不过你的解释很有道理,谢谢。