Как избавиться от строго типизированных табличных адаптеров и таблиц данных - PullRequest
3 голосов
/ 08 ноября 2010

В нашей организации мы поддерживаем веб-сайт VS 2005, который сильно зависит от строго типизированных табличных адаптеров и таблиц данных. Само собой разумеется, что это кошмар ремонтопригодности по многим причинам:

  • Чтобы сгенерировать новые адаптеры таблиц, нам нужно подключиться к базе данных MSSQL2005 и менее, а поскольку мы обновили нашу базу данных до MSSQL2008, это действительно ад.
  • Мы находимся в конце 2010 года, и нам действительно нравится использовать VS2010 для этого проекта, но его модернизация не приводит к сбою. Я думаю, мы могли бы поработать над тем, чтобы заставить это работать, но мы бы лучше вместе избавились от этой ужасной технологии.
  • Сгенерированный код огромен и выглядит ужасно, и я сомневаюсь, что кто-нибудь может понять это без чего-то вроде ЛСД.

На данный момент мы действительно хотели бы сделать минимум, чтобы помочь нам избавиться от этих табличных адаптеров, потому что у нас нет времени, и это менее приоритетно для управления, потому что оно «работает». Поэтому предполагать, что nHibernate - это революция, которую мы, вероятно, не совершим.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 09 ноября 2010

У меня было решение VS 2005 со многими строго типизированными наборами данных и адаптерами таблиц. Я обновил его до VS 2008 несколько лет назад без каких-либо серьезных проблем, и я недавно обновил его до 2010 года без каких-либо серьезных проблем. У меня действительно были некоторые проблемы с сохранением изменений свойств моего столбца после обновления 2010 года, поэтому я решил не открывать какие-либо наборы данных, если только мне не пришлось вносить изменения.

Я бы посоветовал сначала попробовать обновить систему до 2008 года, а затем - до 2010 года. Если это не удастся, возможно, пришло время реорганизовать ваш DAL ...

1 голос
/ 10 ноября 2010

Delucia,

Я не уверен, какой ответ / решение вы ищете, потому что, с одной стороны, вы говорите, что сильно полагаетесь на набор типизированных данных, но затем хотите избавиться от них,:)

Итак, я постараюсь ответить на ваш вопрос, предоставив решение, которое я использовал в прошлом, поэтому здесь.

    /// <summary>
///This class is a wrapper around a DataTable,
///Associated with the stored procedure - usp_GET_FEATURES
///This class provides a strongly typed interface to access data from the DataTable
///containing the result of the given stored procedure.
/// </summary>
public class FeaturesDtw : BaseDataTableWrapper
{
    public Int32 Id { get { return (Int32)DataRow[0]; } }
    public String Title { get { return (String)DataRow[1]; } }
    public String ShortDesc { get { return (String)DataRow[2]; } }
    public String Description { get { return (String)DataRow[3]; } }
    public String ImageFilePath { get { if (DataRow[4] != DBNull.Value) return (String)DataRow[4]; else return default(String); } }
    public String ImageFileName { get { if (DataRow[5] != DBNull.Value) return (String)DataRow[5]; else return default(String); } }
    public String ImageMimeType { get { if (DataRow[6] != DBNull.Value) return (String)DataRow[6]; else return default(String); } }
    public DateTime DateCreated { get { return (DateTime)DataRow[7]; } }

    public FeaturesDtw()
        :base()
    {
    }

    public FeaturesDtw(DataRow row)
        :base(row)
    {
    }
}

Класс, который вы видите вышеЯ вызываю обертку DataTable.По сути, это дает вам возможность работать с DataTable строго типизированным способом, так как этот класс является автоматически сгенерированным классом, его поля отображаются непосредственно в таблицу или обработанный процесс в вашей базе данных.одним из следующих способов:

  var dt = DataModule.GetFeaturesDataSet().Tables[0];
  FeatureDtw featureDtw = new FeatureDtw();
  foreach(DataRow row in dt.Rows)
  {
    featureDtw.DataRow = row;
    var id = featureDtw.Id;
    var title = featureDtw.Title;
  }

В приведенном выше коде я получаю DataTab (переменная dt) из моего DAL, а затем использую обертку, чтобы получить поля строго типизированным способом.

ИЛИ

private IEnumerable<T> GetEnumerableDtw<T>(DataTable dt) where T : BaseDataTableWrapper, new()
{
  foreach (DataRow row in dt.Rows)
  {
    var baseDataTableWrapper = new T();
    baseDataTableWrapper.DataRow = row;
    yield return baseDataTableWrapper;
  }
}

Вы можете передать переменную dt вышеуказанному методу и получить обратно IEnumerable, и вы можете использовать его как любой обычный IEnumerable, за исключением того, что данные действительно поступают из DataTable.

В обоих случаях он строго типизирован.Конечно, в обоих случаях предполагается, что вы не собираетесь использовать DataTable для отправки данных обратно, а только для извлечения данных.

Надеюсь, что имеет смысл?

Базовый классперечислены ниже

    /// <summary>
///This class Base Class for all DataTable Wrappers
/// </summary>
public class BaseDataTableWrapper
{
    public DataRow DataRow { get; set; }

    public BaseDataTableWrapper()
    {
    }

    public BaseDataTableWrapper(DataRow row)
        :this()
    {
        DataRow = row;
    }
}
...