Oracle Update Stored Proc не работает из кода C # - PullRequest
1 голос
/ 10 марта 2011

У меня есть следующий код:

try
        {
            conn.Open();
            OracleCommand cmd = conn.CreateCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "collikx.webadmin.usp_update_license";
            cmd.Parameters.Add(new OracleParameter("licenseSeqNo", OracleDbType.Int32, 30, 228, ParameterDirection.Input));
            cmd.Parameters.Add(new OracleParameter("thirdPartyId", OracleDbType.Int32, 30, 2, ParameterDirection.Input));
            cmd.Parameters.Add(new OracleParameter("licenseNumber", OracleDbType.Varchar2, 12, "tttttttttttt", ParameterDirection.Input));
            cmd.Parameters.Add(new OracleParameter("licenseState", OracleDbType.Char, 2, "CT", ParameterDirection.Input));
            cmd.Parameters.Add(new OracleParameter("licenseLevel", OracleDbType.Varchar2, 2, "E1", ParameterDirection.Input));
            cmd.Parameters.Add(new OracleParameter("licenseType", OracleDbType.Char, 2, "QQ", ParameterDirection.Input));
            cmd.Parameters.Add(new OracleParameter("cutTap", OracleDbType.Char, 1, "Y", ParameterDirection.Input));
            cmd.Parameters.Add(new OracleParameter("status", OracleDbType.Varchar2, 30, "NOTVALID", ParameterDirection.Input));
            cmd.ExecuteNonQuery();
        }
catch (Exception ex)
        {
            Debug.WriteLine(ex.ToString());
            throw;
        }
        finally { conn.Close(); }

Сохраненный процесс:

PROCEDURE usp_update_license( thirdPartyId integer,
                              licenseSeqNo integer,
                              licenseNumber VARCHAR2,
                              licenseState VARCHAR2,
                              licenseLevel VARCHAR2,
                              licenseType VARCHAR2,
                              cutTap VARCHAR2,
                              status VARCHAR2) AS
begin
  update CNTRCTR_LCNS_INFO
    set cntrctr_lcns_no = licenseNumber,
        lcns_st_cd = licenseState,
        certfn_level_type_cd = licenseLevel,
        cntrctr_type_cd = licenseType,
        cut_tap_authy_ind = cutTap,
        stat_type_nm = status
  where third_party_id = thirdPartyId and cntrctr_lcns_seq_no = licenseSeqNo
        ;
  COMMIT;
         EXCEPTION
          WHEN OTHERS THEN
          ROLLBACK;
          RAISE;
end usp_update_license;

Когда я выполняю это, ничего в базе данных не изменяется.Я знаю, что он вызывается из C #, потому что, если я закомментирую одну из строк параметров, я получаю сообщение об ошибке, что нет никаких параметров.Однако значение «QQ» для licenseType в коде C # должно нарушать FK-ограничение, но я не получаю сообщения об этом.У меня есть другие хранимые процедуры, называемые точно так же, как они работают нормально ...

Я должен отметить, что выполнение хранимого процесса напрямую через sql developer работает.

Что такоея делаю неправильно?

Ответы [ 2 ]

1 голос
/ 10 марта 2011

Может быть, где пункт не совпадает ...

Попробуйте выполнить процедуру сохранения из самого Oracle.

1 голос
/ 10 марта 2011

У вас есть параметры не по порядку:

switch

cmd.Parameters.Add(new OracleParameter("licenseSeqNo", OracleDbType.Int32, 30, 228, ParameterDirection.Input));
cmd.Parameters.Add(new OracleParameter("thirdPartyId", OracleDbType.Int32, 30, 2, ParameterDirection.Input));

на

 cmd.Parameters.Add(new OracleParameter("thirdPartyId", OracleDbType.Int32, 30, 2, ParameterDirection.Input));
 cmd.Parameters.Add(new OracleParameter("licenseSeqNo", OracleDbType.Int32, 30, 228, ParameterDirection.Input));

Вы не получаете предложение where для сопоставления (связывается по порядкупо умолчанию) в ODP вы можете изменить это. BindByName = True, чтобы перезаписать значение по умолчанию BindByName = false

РЕДАКТИРОВАТЬ Вы захотите cmd.BindByName = True;

(по умолчанию FALSE и вызывает путаницу и проблемы!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...