使用 IDataParameter 进行更新在 Oracle 中不起作用



我有一个用于实现数据库事务的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

在这篇文章中找到了解决方案。BindByName设置需要为 Oracle 显式设置,因为参数顺序不正确。

我在创建IDbCommand后添加了此代码

if (cmd is Oracle.ManagedDataAccess.Client.OracleCommand)
{
((Oracle.ManagedDataAccess.Client.OracleCommand)cmd).BindByName = true;
}

相关内容

  • 没有找到相关文章

最新更新