ADO.NET. Управление базами данных. Связь по схеме OLE DB провайдера. Коррекция стилей DataGridView, страница 4

Итак, вы убрали учебный фрагмент (вывод информации о текущем состоянии DataSet). Теперь вспомните, что в предыдущем документе (ADO Intro 1) мы рассматривали, как управлять обликом (шириной колонок, цветом фона строк, и т. д.) таблицы, отображаемой в DataGridView. Примените рассмотренную там технологию для коррекции стилей нашей таблицы. Для удобства вновь создайте вспомогательный метод AddStyle. Его вызов вставьте в конец метода MainForm_Load, но перед привязкой данных к DataGridView. Для этого вам придется перенести объявление DataSet в блок данных класса формы. Начните так:

  void AddStyle ()

  {

   foreach (DataColumn dc in множества колонок первой таблицы)

Внутри функции AddStyle, как и ранее, пользуйтесь объектами вспомогательных классов, которые придают таблице желаемый вид. При работе с ними надо уделять повышенное внимание свойству DataPropertyName, так как ошибки при задании именно этого свойства наиболее вероятны и трудно локализуемы. Они приводят к тому, что столбцы просто не отображаются (загадочно исчезают).

Вспомните далее, что при создании таблицы в MS Access мы согласились с тем, что cпособ определения ключа будет автоматическим. Поэтому первое поле записи StudID имеет тип IDENTITY (Счетчик). Его значения генерируются и устанавливаются ядром СУБД и мы не властны их изменить. Для реализации этого ограничения необходимо запретить пользователю редактирвать значения первого столбца. Cделайте это путем установки флага ReadOnly.

Ограничение должно действовать только на первый столбец. Пользователь не сможет вводить данные в этот столбец таблицы, но он может, как вы знаете из опыта, пропускать (не вводить) и другие поля записи. Такой режим работы с таблицей во многих случаях считается нормальным.

Более сложный запрос

Текст команды Select, которую использует адаптер связи при чтении таблицы из базы данных, был тривиальным. Если вы чувствуете себя уверенно в составлении SQL-запросов, то можете создать более сложный запрос и подать его на вход адаптеру с тем, чтобы он принес в DataSet некую, несуществующую на самом деле таблицу. Для проверки этой возможности временно замените текст метода MainForm_Load на тот, что приведен ниже, и запустите приложение.

  void MainForm_Load(object sender, EventArgs e)

  {

   ds = new DataSet (); 

   OleDbConnection cn = new OleDbConnection (

    @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=..\..\Data\Students.MDB");

   OleDbDataAdapter da = new OleDbDataAdapter(

    @"SELECT Exams.ExamId, Exams.StudID, Exams.Course,

    Studs.Name, Studs.Phone

    FROM Exams INNER JOIN Studs

    ON Exams.StudID = Studs.StudID", cn);

   da.Fill(ds, "Studs");

   AddStyle ();

   gridStud.DataSource = ds;

   gridStud.DataMember = "Studs";

  }

Вы увидите результат объединения данных двух таблиц (рис. ниже). Такой сценарий допустим только в случае, если вы не собираетесь позволять пользователю редактировать данные в DataGridView. Благодаря DataBinding редактирование в DataGridView равносильно редактированию в DataSet.

 

Предположим обратное. Пусть пользователь изменил имя курса лекций в виртуальной объединенной таблице (вместо Math он ввел History). Что следует сделать, если он потребует ввести исправления в базу данных? По идее, надо пройтись по всем строкам таблицы экзаменов и произвести замены Math на History. Правильно-ли это? Может быть пользователь имел в виду только одного студента (который вместо математики сдал историю)? Рассмотрм другой сценарий. Пользователь добавил новую строку в виртуальную таблицу и требует обновить данные в базе. Что делать с полями, которые отсутствуют в виртуальной таблице, но присутствуют в реальной?

С учетом описанных проблем в ADO.NET принято отображать в каждом DataGridView только одну таблицу Для отображения данных нескольких, связанных таблиц, надо использовать несколько элементов отображения и синхронизировать их показания с помощью механизма Complex DataBinding. Но при реализации какого-то своего алгоритма вы можете пользоваться JOIN-queries и использовать возвращаемые ими результаты по своему усмотрению.