C#:Что Еще Вы используете, кроме набора данных

StackOverflow https://stackoverflow.com/questions/18533

  •  09-06-2019
  •  | 
  •  

Вопрос

Я обнаружил, что меня все больше не удовлетворяет парадигма DataSet / DataTable / DataRow в .Net, главным образом потому, что это часто на пару шагов сложнее, чем то, что я действительно хочу сделать.В тех случаях, когда я привязываюсь к элементам управления, наборы данных в порядке.Но в других случаях, по-видимому, возникает изрядная умственная нагрузка.

Я немного поиграл с SqlDataReader, и это, кажется, хорошо для простых прогулок через select, но я чувствую, что там могут скрываться какие-то другие модели .Сети, о которых полезно узнать больше.Я чувствую, что вся справка, которую я нахожу по этому вопросу, просто использует DataSet по умолчанию.Возможно, это и DataReader действительно лучшие варианты.

Я не ищу разбивку на лучший / худший вариант, просто любопытно, каковы мои варианты и какой опыт у вас был с ними.Спасибо!

-Эрик Сиппл

Это было полезно?

Решение

С момента выхода .NET 3.5 я использую исключительно LINQ.Это действительно так вкусно;Я больше не вижу причин пользоваться этими старыми костылями.

Однако, каким бы замечательным ни был LINQ, я думаю, что любая ORM-система позволила бы вам избавиться от этого недостатка.

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

Мы отошли от наборов данных и создали наши собственные объекты ORM, свободно основанные на CSLA.Вы можете выполнить ту же работу либо с DataSet, либо с LINQ, либо с ORM, но повторно использовать его (как мы выяснили) намного проще."Меньше кода делает счастливее".

Я был сыт по горло наборами данных в .Net 1.1, по крайней мере, они оптимизировали его, чтобы он больше не замедлялся экспоненциально для больших наборов.

Это всегда была довольно раздутая модель - я не видел много приложений, которые использовали бы большинство ее функций.

SqlDataReader был хорош, но раньше я оборачивал его в IEnumerable<T> где T было некоторым типизированным представлением моей строки данных.

На мой взгляд, Linq - гораздо лучшая замена.

Я пользовался Объекты передачи данных шаблон (я полагаю, изначально из мира Java), с SqDataReader для заполнения коллекций DTO из уровня данных для использования в других уровнях приложения.Сами DTO представляют собой очень легкие и простые классы, состоящие из свойств с gets / sets.Они могут быть легко сериализованы / десериализованы и использованы для привязки к данным, что делает их довольно хорошо подходящими для большинства моих потребностей в разработке.

Я большой поклонник Дозвуковой.Хорошо написанный пакетный файл / CMD может сгенерировать целую объектную модель для вашей базы данных за считанные минуты;вы можете скомпилировать его в собственную библиотеку DLL и использовать по мере необходимости.Замечательная модель, замечательный инструмент.Сайта, делает его звук, как интернет ASP.NET , но в целом это прекрасно работает практически везде, если вы не пытаетесь использовать его рамках пользовательского интерфейса (который я слегка разочаровался в) или уровня приложений-автоматическое создание средства.

Для справки, вот версия команды, которую я использую для работы с ней (чтобы вам не пришлось слишком усердно бороться с ней на начальном этапе):

sonic.exe generate /server [servername] /db [dbname] /out [outputPathForCSfiles] /generatedNamespace [myNamespace] /useSPs true /removeUnderscores true

Это происходит каждый раз ...Затем создайте DLL из этого каталога - это часть проекта NAnt, запущенного CruiseControl.NET - и мы отправимся в путь.Я использую это в WinForms, ASP.NET и даже в некоторых утилит командной строки.Это создает наименьшее количество зависимостей и наибольшую "переносимость" (например, между связанными проектами).

Примечание

Вышеприведенному документу исполнилось уже больше года.Хотя я по-прежнему очень люблю SubSonic в своем сердце, я перешел на LINQ-to-SQL, когда у меня появилась роскошь работать в .NET 3.5.В .NET 2.0 я все еще использую SubSonic.Итак, мой новый официальный совет зависит от версии платформы.В случае .NET 3+ придерживайтесь принятого ответа.В случае .NET 2.0 используйте SubSonic.

Наборы данных отлично подходят для демонстрационных версий.

Я бы не знал, что с ним делать, если бы ты заставил меня им воспользоваться.

Я использую ObservableCollection

Затем я снова оказываюсь в пространстве клиентских приложений, WPF и Silverlight.Таким образом , передача набора данных или datatable через сервис является ...отвратительно.

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

Я использовал типизированные и нетипизированные наборы данных, DataViewManagers, DataViews, DataTables, DataRows, DataRowViews и практически все, что вы можете сделать со стеком, поскольку он впервые появился в нескольких корпоративных проектах.Мне потребовалось некоторое время, чтобы привыкнуть к тому, как все это работает.Я написал пользовательские компоненты, которые используют стек, поскольку ADO.NETdid не совсем дает мне то, что мне действительно нужно.Один из таких компонентов сравнивает наборы данных, а затем обновляет внутренние хранилища.Я действительно знаю, как хорошо работают все эти элементы, и те, кто видел, что я сделал, очень впечатлены тем, что мне удалось выйти за рамки этого, считают, что это было полезно только для демонстрационного использования.

Я использую ADO.NET привязку в Winforms, а также использую код в консольных приложениях.Совсем недавно я объединился с другим разработчиком, чтобы создать пользовательский ORM, который мы использовали против сумасшедшей модели данных, предоставленной нам подрядчиками, которая совсем не походила на наши обычные хранилища данных.

Сегодня я искал замену на ADO.NET и я не вижу ничего, чему я должен серьезно попытаться научиться, чтобы заменить то, что я использую в настоящее время.

Я широко использую их, но я не использую ни одну из "продвинутых" функций, которые Microsoft действительно продвигала, когда впервые появился фреймворк.По сути, я просто использую их как списки хэш-таблиц, которые нахожу весьма полезными.

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

Конечно, я один из тех странных людей, которые на самом деле предпочитают поток данных экземпляру объекта entity.

До linq я использовал DataReader для заполнения списка моих собственных пользовательских объектов домена, но после linq я использовал L2S для заполнения объектов L2S или L2S для заполнения объектов домена.

Как только у меня появится немного больше времени для исследования, я подозреваю, что объекты Entity Framework станут моим новым любимым решением!

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

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

Мне нравятся некоторые Subsonic, хотя для проектов меньшего масштаба, наряду с демонстрациями / прототипами, я также нахожу Linq to Sql чертовски полезным.Хотя я страстно ненавижу EF.:P

Я использовал типизированные наборы данных для нескольких проектов.Они хорошо моделируют базу данных, применяют ограничения на стороне клиента и в целом являются надежной технологией доступа к данным, особенно с учетом изменений в .NET 2.0 с помощью TableAdapters.

Типизированные наборы данных пользуются дурной славой у людей, которые любят использовать для их описания эмоциональные слова вроде "раздутый".Я признаю, что мне нравится использовать хороший O / R mapper больше, чем использовать наборы данных;просто "кажется" лучше использовать объекты и коллекции вместо типизированных таблиц данных, потоков данных и т.д.Но я обнаружил, что если по какой-либо причине вы не можете или не хотите использовать O / R mapper, типизированные наборы данных - хороший надежный выбор, они достаточно просты в использовании и обеспечат вам 90% преимуществ O / R mapper.

Редактировать:

Некоторые здесь предполагают, что программы чтения данных являются "быстрой" альтернативой.Но если вы используете Reflector для просмотра внутренних компонентов DataAdapter (которыми заполняются таблицы данных), вы увидите, что он использует...DataReader.Типизированные наборы данных мочь они занимают больше памяти, чем другие варианты, но я еще не видел приложения, в котором это имело бы ощутимое значение.

Используйте лучший инструмент для этой работы.Не принимайте своего решения на основе эмоциональных слов вроде "грубый" или "раздутый", которые не имеют под собой фактической основы.

Я просто создаю свои бизнес-объекты с нуля и почти никогда больше не использую DataTable и особенно DataSet, за исключением первоначального заполнения бизнес-объектов.Преимуществами создания собственного являются тестируемость, безопасность типов и intellisense, расширяемость (попробуйте добавить в набор данных) и читабельность (если только вам не нравится читать такие вещи, как Convert.Десятичный (dt.Rows[i]["бла"].toString())).

Если бы я был умнее, я бы также использовал ORM и сторонний DI-фреймворк, но просто пока не ощущал в них необходимости.Я делаю множество проектов меньшего размера или дополнений к более крупным проектам.

Я НИКОГДА не использую наборы данных.Это большие тяжеловесные объекты, которые можно использовать только (как кто-то указал здесь) для "демонтажа".Здесь показано множество отличных альтернатив.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top