使用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
RENXIAODUO87 回答:使用IDataParameter的更新在Oracle中不起作用

this post中找到了解决方案。由于参数混乱,因此需要为Oracle明确设置BindByName设置。

我在创建IDbCommand

之后添加了此代码
if (cmd is Oracle.ManagedDataAccess.Client.OracleCommand)
{
    ((Oracle.ManagedDataAccess.Client.OracleCommand)cmd).BindByName = true;
}
本文链接:https://www.f2er.com/2809530.html

大家都在问