Хороший вопрос!
Что касается привязки данных, вы должны рассматривать ее как только один компонент вашей общей стратегии доступа к данным. Моя стратегия состоит из трех компонентов (я перехожу к вашей привязке данных в компоненте 2):
Во-первых, я всегда создаю (или использую, в основном) Уровень доступа к данным (DAL), чтобы упростить доступ к данным. Это , а не , потому что я могу когда-нибудь поменять вашу базу данных на другую - шансы на нее достаточно малы, чтобы она не гарантировала всю работу, которая потребуется (YAGNI). Вы делаете это так, чтобы вы могли: а) удалить весь беспорядок из обычного кода базы данных (например, получить строку соединения, установить и закрыть соединения и т. Д.) И б) упростить общие операции с выделенными функциями.
Во-вторых, вы абсолютно должны реализовать ObjectDataSources, которые инкапсулируют DataBinding для ваших элементов управления пользовательского интерфейса. Если вы создали хороший DAL, это становится довольно тривиальным. Например, вот ObjectDataSource, который использует мой DAL:
[DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
public List<EnrollListMemberData> GetNameList(int classID, DateTime classDate)
{
using (BSDIQuery qry = new BSDIQuery())
{
return
qry.Command(
"Select a.ClassDate, a.ClientID, b.FirstName, b.LastName, b.ID From ClassEnroll a inner join Folder b on (a.ClientID = b.ClientID) Where (a.ClassID=@ClassID) AND ")
.ParamVal(classID)
.Append("(DateDiff(d, a.ClassDate, @ClassDate) = 0) Order By LastName;")
.ParamVal(classDate)
.ReturnList<EnrollListMemberData>();
}
}
Несколько вещей, на которые следует обратить внимание: атрибут «DataObjectMethodAttribute» сделает этот метод видимым для среды времени разработки, так что вы увидите его в раскрывающемся списке источников данных при переходе по ссылке на свою таблицу ( или что угодно). Вам также понадобится атрибут [DataObjectAttribute] в классе, который предоставляет этот метод (этот класс, если он является частью моего бизнес-уровня). Наконец, это довольно простой пример, и он не имеет общих конструкций, таких как параметры startRowIndex и maximumRows для возврата постраничных результатов.
Обратите внимание, что конкретный вызов здесь сделан из моего DAL - это не LinqToSQL, хотя он имеет поверхностное сходство. Мне нравится SQL, и я не хочу идиомы C #, которые просто имеют произвольное отображение обратно в SQL в любом случае . Обратите внимание, что если бы я попытался реализовать все это в прямых вызовах ADO, эта функция была бы в три раза длиннее и содержала бы много кода, который на самом деле не был бы уместным для выражения моих целей.
В-третьих, я всегда помещаю операции многоэтапной базы данных в хранимые процедуры, чтобы минимизировать количество вызовов по проводам в базу данных. Например, я предоставляю функцию «Регистрация» в одном продукте, которая принимает запрос на регистрацию, проверяет его по таблице членства, извлекает предыдущую проверку в истории (сколько посещений за последний месяц?), Присуждает поощрительные баллы, если это необходимо, и т. д. и т. д. Выполнение нескольких запросов и изменений в базе данных в коде C # было бы ужасно сложным и довольно дорогим. В соответствии с нашей философией DAL, я также инкапсулирую вызов хранимой процедуры в моем DAL, так что фактический вызов из кода просто:
int status = dal.CheckIn (ИД пользователя, ref checkInHistory);
Как видите, использование хранимой процедуры и ее инкапсуляция в методе класса C # также облегчает чтение кода far . Мой код просто говорит о том, что он делает (как указано выше), вместо того, чтобы иметь более 100 строк кода для настройки запросов и т. Д.
Надеюсь, это поможет!