我对遗留应用程序进行一些维护使用OracleConnection和OracleCommand来管理我们的数据。我有一个问题,当我使用参数时,特定更新不起作用,但如果我将相同的语句转换为插值字符串,它可以正常工作。我没有得到任何例外,更新不会发生,并且更新的行返回0。我正在使用参数进行其他更新,所以如果有人看到我可能错过的任何内容,我很好奇。我已尝试使用/不使用事务以及显式创建OracleParameter对象无效。
方法如下。我已将参数化版本和参数设置注释掉以供参考。
public int UpdateBusinessEntitlement(int appId, int businessId, int entitlementTypeId, string sso)
{
// Non-Working Parameterized Version
//var sql = "UPDATE APD.APD_BUS_TO_APP_MAP " +
// "SET ENTITLEMENT_TYPE_SEQ_ID = :entitlementTypeId, " +
// "LAST_UPDATE_DATE = SYSDATE, " +
// "LAST_UPDATED_BY = :lastUpdatedBy " +
// "WHERE APP_SEQ_ID = :appId AND BUSINESS_SEQ_ID = :businessId";
var sql = "UPDATE APD.APD_BUS_TO_APP_MAP " +
$"SET ENTITLEMENT_TYPE_SEQ_ID = {entitlementTypeId}, " +
"LAST_UPDATE_DATE = SYSDATE, " +
$"LAST_UPDATED_BY = {sso} " +
$"WHERE APP_SEQ_ID = {appId} AND BUSINESS_SEQ_ID = {businessId}";
using (var cn = _connectionBuilder.GetUpdaterConnection())
{
using (var cmd = _connectionBuilder.GetCommand(sql, cn))
{
cn.Open();
var transaction = cn.BeginTransaction(IsolationLevel.ReadCommitted);
cmd.Transaction = transaction;
//cmd.Parameters.Add("appId", appId);
//cmd.Parameters.Add("businessId", businessId);
//cmd.Parameters.Add("entitlementTypeId", entitlementTypeId);
//cmd.Parameters.Add("lastUpdatedBy", sso);
var rows = cmd.ExecuteNonQuery();
transaction.Commit();
return rows;
}
}
}
答案 0 :(得分:2)
我怀疑你是按位置而不是名字绑定参数。
按位置,您将首先将appId放入entitlement_type_seq_id。然后将BusinessId放入last_Updated_By,将entitlementTypeId放入app_seq_id,将lastUpdatedBy放入business_seq_id。
https://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleCommandClass.htm#i997666
答案 1 :(得分:1)
您必须设置
cmd.BindByName = true;
因为BindByName
属性的默认值为false
,这意味着参数受位置限制。
或者您必须使用与语句中出现的参数顺序相同的顺序,即
cmd.Parameters.Add("entitlementTypeId", entitlementTypeId);
cmd.Parameters.Add("lastUpdatedBy", sso);
cmd.Parameters.Add("appId", appId);
cmd.Parameters.Add("businessId", businessId);
顺便说一句,通常OracleParameter添加如下:
cmd.Parameters.Add("entitlementTypeId", OracleDbType.Int32, ParameterDirection.Input).Value = entitlementTypeId;
cmd.Parameters.Add("lastUpdatedBy", OracleDbType.Varchar2, ParameterDirection.Input).Value = entitlementTypeId;
cmd.Parameters.Add("appId", OracleDbType.Int32, ParameterDirection.Input).Value = appId;
cmd.Parameters.Add("businessId", OracleDbType.Int32, ParameterDirection.Input).Value = businessId;
我认为对于像字符串数这样的简单数据类型,语法无关紧要,但是如果只使用cmd.Parameters.Add(string name, object val)
,其他数据类型(例如 Date )可能会失败。