3

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

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

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

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

+2

Я не могу предложить любую помощь. Я был там и сделал это (с нуля). Я просто хотел сказать, что мне нравится этот вопрос. Типизированные наборы данных ADO.NET отлично смотрятся на поверхности, но реальная PITA в конечном счете. – Tergiver

+0

Мне удалось создать полноценное приложение asp.net на основе типизированных наборов данных * и *, работавших как с сервером oracle, так и с sql-сервером. Поговорите о кластере! –

ответ

2

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

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

+0

Спасибо. Я получаю много ошибок компиляции при обновлении до VS2010, потому что сгенерированные сигнатуры методов отличаются. Я действительно хотел бы реорганизовать DAL, но я не вижу ясного способа, как это сделать, потому что я не могу проверить свои изменения. – duraid

1

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 в сильном стиле, поскольку класс является автоматически сгенерированным классом, его поля отображаются непосредственно в таблицу или обрабатываются proc в вашей базе данных.

Вы можете использовать его в одном из следующих способов:

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 (переменная дт) от моего 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; 
    } 
} 

вы можете передать переменную дт с указанным выше способом и получить обратно 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; 
    } 
} 
+0

Вопрос был связан с генерируемыми строго типизированными наборами данных и данными (и адаптируемыми по дате адаптерами). Таким образом, ему не нужен новый способ создания строго типизированного datatable, но для замены их чем-то лучше. –

 Смежные вопросы

  • Нет связанных вопросов^_^