C# 使用不在Oracle中工作的IDataParameter进行更新
我有一个C#抽象类来实现数据库事务,它同时具有SQL(System.Data.SqlClient)和Oracle(Oracle.ManagedDataAccess.Client)实现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
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;
}