Re[4]: RFD Сохранение объектов. Как?
От: SiAVoL Россия  
Дата: 23.09.04 07:01
Оценка:
Здравствуйте, 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 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.