Методические указания к выполнению ЛР6 - Работа с объектно-реляционной базой данных (1033957), страница 3
Текст из файла (страница 3)
Как будет показано ниже, для запроса статического XML-документа с помощью LINQ to XML не понадобится прилагать почти никаких усилий. Ниже приведен пример выдачи запроса к файлу hamlet.xml для получения списка всех персонажей (актеров), которые принимают участие в пьесе. Каждый из этих персонажей представлен в XML-документе элементом <PERSONA>.
XDocument xdoc = XDocument.Load(@"C:\hamlet.xml");
var query = from people in xdoc.Descendants("PERSONA")
select people.Value;
Console.WnteLine("Найдено {0} персонажей", query.Count());
Console.WnteLine();
foreach (var item in query)
{
Console.WnteLine (item);
}
Console. ReadLme ();
В наши дни динамические XML-документы встречаются в Интернете очень часто. Они формируются в каналах блогов, подкастов и т.п. за счет отправки запроса по конкретному конечному ULR-адресу. Эти каналы могут просматриваться как в браузере посредством специального RSS-arpeгатора, так и в виде чистого XML. Ниже показан пример работы с RSS-каналом непосредственно из кода.
XDocument xdoc = XDocument.Load(@"http://geekswithblogs.net/evjen/Rss.aspx");
Работа с документом XML
При проработке примеров с XML-документом hamlet.xml можно было заметить, что он является довольно большим. Пока что в этой главе было показано лишь несколько способов, которыми можно запрашивать данные из XML-документов, а в следующем разделе демонстрируется методика чтения и записи данных в XML-документ.
Чтение данных из документа XML
Ранее уже было показано, насколько легко отправлять запросы в XML-документ с применением операторов запросов LINQ вроде следующего:
var query = from people in xdoc.Descendants("PERSONA")
select people.Value;
Этот запрос возвращает всех персонажей, найденных в документе. С использованием метода Element () объекта XDocument из XML-документа можно извлечь конкретные значения, с которым будет производиться работа. Например, следующий фрагмент XML показывает, каким образом в документе hamlet .xml представлен элемент <TITLE>:
<?xml version="1.0"?>
<PLAY>
<TITLE>The Tragedy of Hamlet, Prince of Denmark</TITLE>
<!—XML удален для ясности—>
</PLAY>
Нетрудно заметить, что элемент </TITLE> вложен в элемент <PLAY>. Следовательно, к нему легко добраться с помощью следующего фрагмента кода в консольном приложении:
XDocument xdoc = XDocument.Load(@"С:\hamlet.xml");
Console.WriteLine(xdoc.Element("PLAY").Element("TITLE").Value);
Запись данных в документ XML
Запись данных в документ XML осуществляется так же легко, как и чтение. Например, чтобы изменить имя первого персонажа в файле hamlet. xml, можно воспользоваться следующим кодом:
XDocument xdoc = XDocument.Load(@"C:\hamlet.xml");
xdoc.Element("PLAY").Element("PERSONAE").Element("PERSONA").SetValue("Bill Evjen, king of Denmark");
Console.WriteLine(xdoc.Element("PLAY").Element("PERSONAE").Element("PERSONA").Value);
В данном случае первый экземпляр элемента <PERSONA> перезаписывается значением Bill Evjen, king of Denmark с помощью метода SetValue() объекта Element(). После вызова метода SetValue() и применения значения к XML-документу это значение затем извлекается с использованием того же подхода, что раньше. После выполнения этого фрагмента кода можно увидеть, что значение первого элемента <PERSONA> изменилось.
Другим способом изменения документа (в рассматриваемом примере — для добавления в него элементов) является создание нужных элементов в виде объектов XElement и затем их добавление в документ.
XDocument xdoc = XDocument.Load(@"C:\hamlet.xml");
XElement xe = new XElement("PERSONA","Bill Evjen, king of Denmark");
xdoc.Element("PLAY").Element("PERSONAE").Add(xe);
var query = from people in xdoc.Descendants("PERSONA")
select people.Value;
Console.WriteLine("Найдено {0} персонажей", query.Count());
Console.WriteLine();
foreach (var item in query)
{
Console.WriteLine(item);
}
Практическое выполнение
Работа с коллекциями - LINQ to object
В среде MS Visual Studio создать консольное приложение на языке С#. Определить и инициализировать коллекцию (список строк). Используя технологию linq to objects выполнить набор запросов (через точечный синтаксис и запросом).
Открыть Visual Studio.
Создать новый проект (консольный).
Указать тип Visual C# - Windows – Console Application и имя проекта, нажать ОК.
Далее в коде функции Main ввести код программы.И затем запустить программу на выполнение.
Команда вывода данных (1-й параметр – строка вывода, остальные подставляются через фигурные скобки):
Console.WriteLine(" Test - {0} {1}", "Hello!", 123);
Команда ввода:
Console.ReadKey();
Общий код:
static void Main(string[] args)
{
Console.WriteLine(" Test - {0} {1}", "Hello!", 123);
Console.ReadKey();
}
результат:
Работа с базой данных - linq to sql
Открыть MS Visual Studio
Создать проект
Указать его имя и тип.
Контекст БД DataContext
DataContext - это класс, устанавливающий соединение с базой данных. Он также предоставляет несколько служб, обеспечивающих отслеживание идентичности, отслеживание изменении и обработку этих изменений.
DataContext — это класс, соединяющий с базой данных, отслеживающий то, что мы изменяем, и обновляющий базу данных при вызове метода SubmitChanges.
В LINQ to SQL принято использовать класс, производный от DataContext. Имя производного класса обычно совпадает с именем базы данных, на которую он отображается.
Добавить к проекту класс
И указать его тип – LINQ to SQL
Откроется окно конструктора
Вызвать Server Explorer (из меню Вид) для просмотра объектов БД (соединения с БД)
Выбрать нужное соединение (или создать новое) и в нем открыть БД и ее объекты
Вызвать Server Explorer (из меню Вид) для просмотра объектов БД (соединения с БД)
Перетащить из Server Explorer таблицы, функции и процедуры в окно конструктора.
Открыть окно проекции БД в класс контекста двойным щелчком по названию класса в Solution Erplorer.
Название класса контекста было указано при его создании (по умолчанию DataClasses1).
Откроется код класса контекста, в котором можно посмотреть названия классов и объектов таблиц и их полей.
Обращение к БД из программы
Добавить в проект ссылку на библиотеку
Из контекстного меню решения (проекта) выбрать Add Reference
В проекте перейти к редактированию экранной формы (двойным щелчком по ее названию в Solution Explorer). Поместить на нее таблицу И кнопку.
Для работы с БД создать контекст (переменная БД и ее инициализация при открытии формы)
LINQ to SQL подразумевает использование сущностных классов, причем каждый из них обычно отображается на единственную таблицу базы данных. Таким образом, мы имеем сущностные классы, отображенные на таблицы базы данных, и свойства сущностных классов, отображенные на столбцы этих таблиц. Это отображение “класс-таблица" и “свойство-столбец” являются сутью LINQ to SQL.
Обращение к таблице
Двойным щелчком по кнопке (в редакторе формы) перейти к коду ее обработчика и написать код заполнения таблицы данными из БД:
Обращение таблице через контекст :
Источник данных таблицы = Контекст.таблица
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication6
{
public partial class Form1 : Form
{
public DataClasses1DataContext db;
public Form1()
{
InitializeComponent();
db=new DataClasses1DataContext();
}
private void button1_Click(object sender, EventArgs e)
{
dataGridView1.DataSource = db.persons;
}
}
}
Запустить проект и проверить работу.
Добавить кнопки и в обработчике каждой указать запрос на извлечение данных (формат Linq в точечной нотации, в качестве коллекции указать таблицу).
Вывод в таблицу результата выполнения запроса.
Вызов процедуры или функции:
Обращение через контекст:
Контекст.процедура(параметры)
Вызов хранимых процедур и функций БД происходит через обращение к одноименным методам объекта-контекста. Типы входных и выходных параметров соответствуют объявленным в БД.
Скалярная функция возвращает одно значение, которое присваивается переменной.
Табличная – коллекцию (ее можно присвоить источнику данных или обработать в цикле).
Процедура – 1 значение, коллекцию или ничего ( в зависимости от конкретной ситуации).
Редактирование таблицы
Добавление объекта в таблицу
Создать объект через new,
Присвоить значения его полям,
Добавить через контекст в таблицу,
Сохранить изменения контекста в БД.
Удаление
Открыть объект через запрос к таблице БД,
Выбрать из результата запроса конкретный объект,
Удалить объект из таблицы через контекст,
Сохранить изменения контекста в БД.
Изменение
Открыть объект через запрос к таблице БД,
Выбрать из результата запроса конкретный объект (функция Single() обеспечивает извлечение одного объекта, а не коллекции),
Изменить значения полей объекта
Сохранить изменения контекста в БД.
Работа со связанными таблицами
В запросах к связанным таблицам можно переходить по связям 1-М в обоих направлениях.
Например, таблицы Builders и Road связаны М-1.
В запросе к Builders можно использовать поля road (значение внешнего ключа) и road1(ссылка на связанный объект в другой таблице):
dataGridView1.DataSource = from b in db.builders
where b.road1.src=="СПб"
select new { b.title, b.road, b.road1.id,
b.road1.src, b.road1.dest,
b.road1.type, b.road1.cost };
Из запроса к Road можно использовать поле builders (множество объектов в связанной таблице), например (выбрать дороги, которые строила компания CMYххх)
dataGridView1.DataSource = from r in db.roads
where r.builders.Count()>0 && r.builders.Any(x=>x.title.Contains("CMY"))
orderby r.src,r.dest
select new {r.src,r.dest,r.type,r.id,
t = r.builders.First(x => x.title.Contains("CMY")).title,
r.builders.Count };
Пример задания
1. Работа с коллекциями - LINQ to obiect
В среде MS Visual Studio создать консольное приложение на языке С#. Определить и инициализировать коллекцию (список строк). Используя технологию linq to objects выполнить набор запросов (через точечный синтаксис и запросом):
-
строки, содержащие подстроку,
-
отсортированные строки,
-
(точечный синтаксис) количество строк, являющихся уникальными,
-
группировка строк длиной 3 символа по первой букве. В результат — первая буква строки, количество строк в группе (генерация объектов «на лету»).
Результат отобразить на экране.
2. Работа с базой данных - linq to sql
2.1. Создать БД
В среде MS SQL Server Management Studio создать БД lab6_91 (или использовать созданную ранее) и добавить в нее таблицы
"Hotel"(отель), содержит свойства:
-
hname - название – строковое varchar(10), (КЛЮЧ),
-
hcity – город – строковое varchar(15),
-
stars – количество звезд – целое.
"Client" (клиент), содержит свойства:
-
fio - ФИО – строковое, varchar(50),
-
num - номер – целое,
-
ofhotel — отель — varchar(10),(ВНЕШНИЙ КЛЮЧ)
-
id - идентификатор (КЛЮЧ - PK) – целое, автоинкремент.