Используя Doodads MyGeneration в C# .NET

Я добавил новый элемент управления в свою форму.NET и хочу сохранить его значение в таблице. Я добавил новый столбец в свою таблицу. Как вы используете MyGeneration Doodads для создания объекта доступа к данным для этой таблицы? У меня есть Посмотрел http://www.mygenerationsoftware.com/portal/doodads/cusage/tabid/53/default.aspx но я не могу понять, что это значит под "шаблоном". Какова процедура восстановления дудов для стола?

1 ответ

Вы не получите большой ответ на это... dOOdads не поддерживали в течение многих лет. Несмотря на это, мы тоже используем dOOdads, и я просто запускаю свои собственные репозитории для своих проектов WPF (я знаю, что это не ASP, но я не думаю, что вы можете просто "подключи и играй"). Вот пример моего базового класса поиска:

public abstract class BaseLookup<TEntity>
{
    // Constructor

    protected BaseLookup()
    {
        this.SubsetIdentifier = null;
    }

    // Properties

    public virtual object SubsetIdentifier { get; set; }

    // Public Methods

    public abstract IEnumerable<TEntity> Read();

    public virtual TEntity ReadSingle()
    {
        return default(TEntity);
    }

    // Protected Methods

    /// <summary>
    /// Retrieve translated entities from the database. The methods used to do this
    /// are specified from the child class as parameters (i.e. Action or Func delegates).
    /// </summary>
    /// <param name="loadSubsetFunc">Specify how to load a set of database records.
    /// Return boolean confirmation that records were found.</param>
    /// <param name="orderByAction">Specify what should happen to sort the results.</param>
    /// <param name="translateRowFunc">Specify how a database record should translate to
    /// a model entity. Return the new entity.</param>
    /// <param name="moveNextFunc">Specify how the database row pointer should move on.
    /// Return FALSE on a call to the final row.</param>
    /// <returns>A set of translated entities from the database.</returns>
    /// <example><code>
    ///
    /// return base.ReloadRecords(
    ///     _dOOdad.LoadAll,
    ///     () =>
    ///     {
    ///         _dOOdad.Sort = _dOOdad.GetAutoKeyColumn();
    ///     },
    ///     () =>
    ///     {
    ///         var entity = new LookupEntity();
    ///         return entity.PopulateLookupEntity(_dOOdad.CurrentRow.ItemArray);
    ///     },
    ///     _dOOdad.MoveNext);
    ///     
    /// </code></example>
    protected virtual IEnumerable<TEntity> ReloadRecords(Func<bool> loadSubsetFunc,
        Action orderByAction, Func<TEntity> translateRowFunc, Func<bool> moveNextFunc)
    {
        // If records are found, sort them and return set of entities
        if (loadSubsetFunc())
        {
            orderByAction();

            do
            {
                var entity = translateRowFunc();
                yield return entity;
            }
            while (moveNextFunc());
        }
        else
        {
            Debug.WriteLine(
                string.Format(
                    "# ZERO records found: Returning empty set of {0}.",
                    typeof(TEntity).Name));
        }
    }
}

А вот конкретная реализация базового поиска:

public class CyclesLookup : BaseLookup<BaseLookupEntity>
{
    // Fields & Constructor

    private readonly CYCLES _dOOdad;

    public CyclesLookup(IDbConnection connection, string library)
    {
        _dOOdad = OpenConnection(connection, library);
    }

    // Base Override Methods

    public override IEnumerable<BaseLookupEntity> Read()
    {
        // Clear old result set and settings
        _dOOdad.FlushData();

        // Reload the records and return them sorted and translated
        return base.ReloadRecords(
            _dOOdad.LoadAll,
            () =>
            {
                _dOOdad.Sort = _dOOdad.GetAutoKeyColumn();
            },
            () =>
            {
                var entity = new LookupEntity();
                entity.Description = string.Format("Cycles for {0}", _dOOdad.YEAR);
                return entity.PopulateLookupEntity(_dOOdad.CurrentRow.ItemArray, true);
            },
            _dOOdad.MoveNext);
    }

    // Private Helper Methods

    private static CYCLES OpenConnection(IDbConnection connection, string library)
    {
        var dOOdad = new CYCLES(connection);
        dOOdad.SchemaGlobal = library + ".";
        return dOOdad;
    }
}

Этот метод PopulateLookupEntity является просто методом расширения:

public static T PopulateLookupEntity<T>(this T entity, object[] rowItems,
    bool noDescription = false) where T : BaseLookupEntity
{
    int id = 0;
    int.TryParse(rowItems[0].ToString(), out id);
    entity.RecordID = id;

    var attributesFirstIndex = 1;
    if (!noDescription)
    {
        entity.Description = rowItems[1].ToString();
        attributesFirstIndex = 2;
    }

    entity.Attributes = new object[rowItems.Length - attributesFirstIndex];
    for (int index = attributesFirstIndex; index < rowItems.Length; index++)
    {
        entity.Attributes[index - attributesFirstIndex] = rowItems[index];
    }

    return (T)entity;
}

Для не-поиска у меня есть более сложный класс BaseRepository, который наследуется от BaseLookup. С этим я не использую PopulateLookupEntity, но частный вспомогательный метод как это:

private IPlanningGridHeader TranslateCurrentDoodadRow()
{
    return new PlanningGridHeader()
    {
        PlanNumber = Convert.ToInt32(_dOOdad.PLANNUMBER),
        Active = _dOOdad.ACTIVE == 1M,
        Capturer = _dOOdad.CAPTURER,
        Region = _dOOdad.REGION,
        CorporateID = Convert.ToInt32(_dOOdad.CORPORATEID),
        StartDate = _dOOdad.STARTDATE.ConvertDb2Date(),
        EndDate = _dOOdad.ENDDATE.ConvertDb2Date(),
        AdvertStartDate = _dOOdad.ADVERTSTARTDATE.ConvertDb2Date(),
        AdvertEndDate = _dOOdad.ADVERTENDDATE.ConvertDb2Date(),
        BpcsDealNumber = Convert.ToInt32(_dOOdad.BPCSDEALNUMBER),
        Description = _dOOdad.DESCRIPTION,
        DeactivationReason = _dOOdad.DEACTIVATIONREASON,
        LastSavedUsername = _dOOdad.LASTUSER,
        LastSavedDateTime = _dOOdad.LASTDATE.ConvertDb2Date().AddDb2Time(_dOOdad.LASTTIME)
    };
}

Надеюсь это поможет:-)

Хотя он старый, но я рекомендую держаться подальше от этой библиотеки. В нем есть серьезная ошибка, которая вызывает утечку соединения, держу пари, что создатель не проверял методы ADO.NET при ее написании. Более того, он не знал, как иметь дело с DBNull, поэтому он изобрел "строковые свойства" наряду с обычными свойствами для решения проблемы NULL, превратил сгенерированный код и модель программирования в большой беспорядок, создал больше исключений NullReferenceException при обычном доступе разработчика. свойства со значением null.

Я собрал все эти проблемы из устаревшей системы, которой более 10 лет, с помощью MyGeneration Doodads. Я был очень счастлив, что наконец смог от него избавиться.

Если вы находитесь на пути к поиску библиотеки DAC для корпоративного приложения, просто не выбирайте эту библиотеку.

Другие вопросы по тегам