我有以下代码:
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执行存储过程。
我做错了什么?
答案 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本身执行存储过程。