Здравствуйте, IT, Вы писали:
IT>Возможно
А что именно подтачивал?
я писал расширение DBManager, писал давно, на заре знакомства с RFD и давно туда не смотрел. так что может и криво, но работает
Приведу небольшую выдержку
public class DbManagerEx : DbManager
{
/// <summary>
/// Создает параметры для хранимой процедуры,
/// на основе бизнес-объекта
/// </summary>
/// <param name="spName">Имя хранимой процедуры</param>
/// <param name="entity">Бизнес-объект</param>
/// <returns>Массив параметров</returns>
public IDbDataParameter[] BuildSPParametrs(string spName,
object entity)
{
IDbDataParameter[] pars =
GetSpParameterSet(spName, false);
object[] values = new object[pars.Length];
MapDescriptor descriptor =
MapDescriptor.GetDescriptor(entity.GetType());
for (int i = 0; i < pars.Length; i++)
{
string pName = GetParametrMapName(pars[i]);
int ord = ((IMapDataReceiver) descriptor).GetOrdinal(pName);
values[i] = ((IMapDataSource) descriptor)
.GetFieldValue(ord, entity);
}
AssignParameterValues(pars, values);
return pars;
}
/// <summary>
/// Выполняет хранимую процедуру с бизнес-обектом параметром
/// </summary>
/// <param name="spName">Имя хранимой процедуры</param>
/// <param name="parametrEntity">
/// Бизнес-объект параметр хранимой процедуры</param>
/// <returns>Число строк, на которые оказала действие
/// хранимая процедура</returns>
public int ExecuteSpNonQuery(
string spName,
object parametrEntity)
{
IDbDataParameter[] pars = BuildSPParametrs(spName,
parametrEntity);
int Affected = this
.SetCommand(CommandType.StoredProcedure, spName, pars)
.ExecuteNonQuery();
BackMapParametrs(pars, parametrEntity);
return Affected;
}
/// <summary>
/// Выполняет хранимую процедуру с бизнес-обектом параметром
/// и возвращает бизнес-объект
/// </summary>
/// <param name="bizObjectType">Тип бизнес-объекта</param>
/// <param name="spName">Имя хранимой процедуры</param>
/// <param name="parametrEntity">Объект из которого будут
/// сформированы параметры хранимой процедуры</param>
/// <returns>Бизнес-объект</returns>
public object ExecuteSpBizEntity(
Type bizObjectType,
string spName,
object parametrEntity)
{
IDbDataParameter[] pars = BuildSPParametrs(spName,
parametrEntity);
object obj = this
.SetCommand(CommandType.StoredProcedure, spName, pars)
.ExecuteBizEntity(bizObjectType);
BackMapParametrs(pars, parametrEntity);
return obj;
}
private string GetParametrMapName(IDbDataParameter parametr)
{
return parametr.ParameterName.Substring(1);
}
private void BackMapParametrs(IDbDataParameter[] pars,
object ParametrEntity)
{
MapDescriptor descriptor =
MapDescriptor.GetDescriptor(ParametrEntity.GetType());
foreach (IDbDataParameter p in pars)
if (p.Direction == ParameterDirection.Output ||
p.Direction == ParameterDirection.InputOutput)
{
descriptor[GetParametrMapName(p)].SetValue(
ParametrEntity, p.Value);
}
}
}
функция BackMapParametrs как раз и осуществляет обратное отображение
... << RSDN@Home 1.1.4 beta 3 >>