ExecuteNonQuery () возвращается-1 в Обновлении, когда записи обновляются

Я проверил, что моя процедура метода/Oracle работает правильно, но в моем C# я всегда добираюсь-1, возвратился из ExecuteNonQuery (). Следовательно, ниже 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;

КОНЕЦ Change_Password;

5
задан Barryman9000 4 February 2010 в 21:17
поделиться

2 ответа

Попробуйте явно вернуть SQL% ROWCOUNT.

Согласно MSDN, DbCommand..ExecuteNonQuery всегда будет возвращать -1 для вызовов хранимых процедур:

Для операторов UPDATE, INSERT и DELETE возвращаемое значение - это количество строк, затронутых командой. Для всех других типов операторов возвращаемое значение - -1.

Если я правильно помню из дней использования большого количества хранимых процедур, я считаю, что вам нужно будет использовать выходной аргумент, чтобы возвращать такие вещи, как количество обновленных строк.

13
ответ дан 18 December 2019 в 13:14
поделиться

Я предлагаю вам попробовать библиотеку PortAudio. Это бережливая кроссплатформенная библиотека, абстрагирующая функции аудиовыхода.

Он поставляется с кучей небольших примеров. Один из них играет одиночную синусоиду, другой - кучу синусоидальных волн одновременно. Так как примеры уже делают 90% того, что вам нужно, чтобы ваш звук был включен и запущен менее чем за полчаса.

Подсказка: Лучшая документация PortAudio находится в файле заголовка!

-121--4435131-

Вам нужно просто написать небольшую обертку.

std::string getcwd_string( void ) {
   char buff[PATH_MAX];
   getcwd( buff, PATH_MAX );
   std::string cwd( buff );
   return cwd;
}
-121--2519913-

Я не Oracle парень, но, видимо, есть команда:

set feedback off

, которая не дает ему вернуть количество затронутых записей. Эта строка в хранимой процедуре? Или вы пытались «установить обратную связь»? Функционально я думаю, что это просто обратная сторона команды SET NOCOUNT ON/OFF SQL Server.

1
ответ дан 18 December 2019 в 13:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: