Oracle Update Stored Proc无法使用C#代码

时间:2011-03-10 19:29:04

标签: c# oracle stored-procedures

我有以下代码:

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#调用的,因为如果我注释掉其中一个参数行,我会得到一个错误,即没有enout params。但是,C#代码中licenseType的值“QQ”应该违反FK约束,但我没有错误告诉我。我有其他存储过程称为完全相同的工作方式......

我应该注意,直接通过sql developer执行存储过程。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您的参数不按顺序排列:

开关

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并导致混淆和问题!)

答案 1 :(得分:1)

可能是Where子句不匹配......

尝试从Oracle本身执行存储过程。