C# 使用不在Oracle中工作的IDataParameter进行更新

C# 使用不在Oracle中工作的IDataParameter进行更新,c#,oracle,odp.net,C#,Oracle,Odp.net,我有一个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 (IDb

我有一个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;
}
找到了解决办法<需要为Oracle显式设置code>BindByName设置,因为参数顺序不正确

我在创建
idb命令后添加了此代码

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

你能分享你的查询和参数吗?将查询添加到帖子中。参数是一个OracleParameterCollection,其参数与查询中的每个命名参数匹配。如果我在WHERE子句中硬编码:ActionName和:ParamName值,则SET子句中的值有效。所以问题似乎就在那里。
if (cmd is Oracle.ManagedDataAccess.Client.OracleCommand)
{
    ((Oracle.ManagedDataAccess.Client.OracleCommand)cmd).BindByName = true;
}