6

メソッド/Oracleプロシージャが正しく機能していることを確認しましたが、C#ではExecuteNonQuery()から常に-1が返されます。したがって、以下のブール値は常にfalseです。DB(Oracle)ではINSERTステートメントにのみトリガーを使用します。更新ステートメントのトリガーが必要ですか?

なぜそれが起こるのか、何か提案はありますか?その間違いなく1つのレコードを更新します:

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;
4

2 に答える 2

15

明示的に SQL%ROWCOUNT を返してみてください。

MSDN によると、DbCommand..ExecuteNonQuery は、ストアド プロシージャの呼び出しに対して常に -1 を返します。

UPDATE、INSERT、および DELETE ステートメントの場合、戻り値はコマンドの影響を受けた行数です。他のすべてのタイプのステートメントの場合、戻り値は -1 です。

多くのストアド プロシージャを使用していた日々の記憶が正しければ、出力引数を使用して、更新された行数などを返す必要があると思います。

于 2010-02-04T21:38:06.153 に答える
1

私はオラクルの男ではありませんが、どうやらコマンドがあります:

set feedback off

これにより、影響を受けたレコードの数が返されなくなります。この行はストアドプロシージャにありますか?または、「フィードバックを設定」を試しましたか?機能的には、これはSQLServerのSETNOCOUNT ON/OFFコマンドの逆だと思います。

于 2010-02-04T21:07:03.127 に答える