Шаблон программирования с использованием типизированных наборов данных в VS 2008

В настоящее время я делаю следующее, чтобы использовать типизированные наборы данных в vs2008:

Щелкните правой кнопкой мыши «app_code», чтобы добавить новый набор данных, назовите его tableDS.

Откройте tableDS, щелкните правой кнопкой мыши, добавьте «адаптер таблицы»

В мастере выберите заранее заданную строку подключения, «использовать операторы SQL»

выберите * from tablename и следующий + рядом, чтобы закончить. (Я создаю один адаптер таблицы для каждой таблицы в моей БД)

В моем коде я делаю следующее, чтобы получить строку данных, когда она мне нужна:

cpcDS.tbl_cpcRow tr = (cpcDS.tbl_cpcRow) (новый cpcDSTableAdapters.tbl_cpcTableAdapter ()). GetData (). Select ("cpcID =" + cpcID) [0];

Я считаю, что это приведет к получению всей таблицы из базы данных и фильтрации в dotnet (т.е. не оптимально), есть ли способ заставить tableadapter вместо этого заполнить набор результатов в базе данных (IE, что я хочу, это отправить select * из tbl_cpc, где cpcID = 1, в базу данных)

И в качестве примечания, я думаю, что это довольно хороший шаблон проектирования для получения данных из базы данных в vs2008. Кодировать, читать и обслуживать довольно легко. Но я хотел бы знать, есть ли другие шаблоны проектирования, которые лучше? Я использую наборы данных для чтения / обновления / вставки и удаления.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 758
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Небольшой сдвиг, но вы спрашиваете о разных шаблонах - как насчет LINQ? Поскольку вы используете VS2008, возможно (хотя и не гарантируется), что вы также сможете использовать .NET 3.5.

Контекст данных LINQ-to-SQL обеспечивает гораздо более управляемый доступ к данным (отфильтрованным и т. д.). Это вариант? Я не уверен, что сейчас выберу Entity Framework (глянь сюда).

Редактировать по запросу:

чтобы получить строку из контекста данных, вам просто нужно указать «предикат» - в данном случае совпадение первичного ключа:

int id = ... // the primary key we want to look for
using(var ctx = new MydataContext()) {
   SomeType record = ctx.SomeTable.Single(x => x.SomeColumn == id);
   //... etc

   // ctx.SubmitChanges(); // to commit any updates
}

Вышеупомянутое использование Single является преднамеренным - это конкретное использование [Single (предикат)] позволяет контексту данных полностью использовать локальные данные в памяти - то есть, если предикат находится только в столбцах первичного ключа, ему, возможно, не придется прикоснуться к базе данных вообще, если контекст данных уже видел эту запись.

Однако LINQ очень гибкий; вы также можете использовать «синтаксис запроса» - например, немного другой запрос (список):

    var myOrders = from row in ctx.Orders
                   where row.CustomerID = id && row.IsActive
                   orderby row.OrderDate
                   select row;

так далее

Контекст данных LINQ-to-SQL - это вариант. Не могли бы вы дать мне пример кода, делающего то же самое, что и выше? (Т.е. получить строку данных из таблицы tbl_cpc?)

devzero 17.11.2008 14:45

Есть две потенциальные проблемы с использованием типизированных наборов данных:

один - проверяемость. При использовании типизированных наборов данных довольно сложно настроить объекты, которые вы хотите использовать в модульном тесте.

Другой - ремонтопригодность. Использование типизированных наборов данных обычно является симптомом более глубокой проблемы. Я предполагаю, что все ваши бизнес-правила живут за пределами наборов данных, и довольно немногие из них принимают наборы данных в качестве входных и выводят некоторые агрегированные значения на их основе. Это приводит к повсеместной утечке бизнес-логики, и, хотя первые 6 месяцев все это будет непростой задачей, через некоторое время она начнет вас укусить. Такое использование DataSet принципиально не объектно-ориентировано.

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

Поскольку вам явно не нравятся наборы данных, как вы посоветуете мне получить данные из базы данных в коде?

devzero 17.11.2008 14:48

Очень немногие объектные технологии проще настраивать для тестирования, чем наборы данных. 1) заполнить данными (вручную или по запросу), 2) сохранить в xml, 3) повторно заполнить из этого сохраненного xml для ваших тестов (один пример). Кроме того, с их частичными классами глупо говорить, что DataSet «не объектно-ориентирован».

Mark A Johnson 10.01.2009 00:03

Вы можете добавить запрос с предложением where к tableadapter для интересующей вас таблицы.

LINQ хорош, но на самом деле это просто сокращенный синтаксис для того, что OP уже делает.

Типизированные наборы данных имеют смысл, если ваша модель данных не очень сложная. Тогда лучшим выбором будет написание собственного ORM. Я немного сбит с толку, почему Андреас считает, что типизированные наборы данных трудно поддерживать. Единственное, что их раздражает, это то, что команды вставки, обновления и удаления удаляются всякий раз, когда изменяется команда выбора.

Кроме того, преимущество в скорости создания типизированного набора данных по сравнению с вашим собственным ORM позволяет вам сосредоточиться на самом приложении, а не на коде доступа к данным.

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