我有一个C#抽象类,用于实现具有SQL(System.Data.SqlClient)和Oracle(Oracle.ManagedDataaccess.Client)实现的数据库事务。
public int ExecuteDML<T>(string sql,List<T> objects)
{
int cnt = 0;
using (idbconnection conn = getconnection())
{
using (IDbTransaction txn = conn.BeginTransaction())
{
using (IDbCommand cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = PrepSQL(sql);
cmd.Transaction = txn;
try
{
foreach (T obj in objects)
{
cmd.Parameters.Clear();
foreach (var kvp in GetDbParameters<T>(obj))
{
IDataParameter param = new DbParameter
{
ParameterName = kvp.Key,Value = kvp.Value ?? DBNull.Value
};
cmd.Parameters.Add(param);
}
cnt += cmd.ExecuteNonQuery();
}
txn.Commit();
}
catch (Exception)
{
txn.Rollback();
throw;
}
}
}
}
return cnt;
}
我能够在两个实现中执行INSERT,UPDATE和DELETE语句。但是,当我在Oracle实现中运行UPDATE时,该记录不会在数据库中得到更新。 ExecuteNonQuery
返回0。但是,SQL实现中的相同数据/命令可以正常工作。
为什么参数化查询不适用于UPDATE,而INSERT和DELETE很好?
查询
UPDATE CONFIG_PARAMS SET PARAM_VALUE = :ParamValue,LOAD_DATE = :LoadDate,UPDATED_BY = :UpdatedBy WHERE actION_NAME = :actionName AND PARAM_NAME = :ParamName