Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_1-44.docx
Скачиваний:
19
Добавлен:
21.04.2019
Размер:
1.07 Mб
Скачать

38. Ado.Net. Задание схемы набора данных вручную (тип и имя отдельных столбцов таблицы, ограничения на столбцы и связи между таблицами).

Вначале создадим объекты, соответствующие столбцам и таблицам, и поместим столбцы в таблицы:

DataColumn id_artists = new DataColumn(“id”, typeof(int));

DataColumn name = new DataColumn(“name”, typeof(string));

DataTableArtists = new DataTable(“Artists”);

Artists.Columns.Add(id_artists);

Artists.Columns.Add(name);

DataColumn id_disks = new DataColumn(“id”, typeof(int));

DataColumn title = new DataColumn (“title”, typeof(string));

DataColumn artists_id=new

DataColumn (“artists_id”, typeof(int));

DataColumn release_year = new

DataColumn(“release_year”, typeof(string));

DataTable Disks = new DataTable(“Disks”);

Disks.Column.Add(id_disks);

Disks.Column.Add(title);

Disks.Column.Add(artists_id);

Disks.Column.Add(release_year);

Теперь можно выполнить дополнительную настройку отдельных столбцов – задать максимальную длину, отсутствие нулевых значений:

id_artists.AllowDBNull = false;

name_AllowDBNull = false;

id_disks.AllowDBNull = false;

title.AllowDBNull = false;

name.MaxLength = 50;

title.MaxLength = 50;

release_year.MaxLength = 4; Если столбец является частью первичного ключа, его свойство AllowDBNull автоматически устанавливается в False. Установим первичные ключи наших таблиц

DataColumn[] Artists_PK = new DataColumn[1] {id_artists};

Artists.PrimaryKey = Artists_PK;

DataColumn[] Disks_PK = new DataColumn[1] {id_disks};

Disks.PrimaryKey = Disks_PK;

Изменим имя ограничения в одной из таблиц и добавим ограничение для столбца name таблицы Artists, полагая значения в этом столбце уникальными:

Artists.Constraints[0].ConstraintName = “PrimaryKey”;

UniqueConstraint uc = new UniqueConstraint(“Unique Name”, new DataColumn[]{name});

Artists.Constraints.Add(uc);

Создадим рассоединённый набор данных и поместим в него таблицы:

DataSet CD_Rent = new DataSet(“CD_Rent_Part”);

CD_Rent.Tables.Add(Artists);

CD_Rent.Tables.Add(Disks);

Между таблицами Artists и Disks существует связь по внешнему ключу. Таблица Disks является дочерней для таблицы Artists т.к. значения поля artists_id – это значения первичного ключа таблицы Artists.

Создадим объект DataRelation описывающий эту связь

// Используем самый простой конструктор, который устанавливает имя отношения, родительский и дочерний столбцы отношения

DataRelation Artists_to_Disks = new DataRelation(“Artists_to_Disks”, id_artists, artists_id);

// Добавляем отношение в набор данных

CD_Rent.Relations.Add(Artists_to_Disks);

После выполнения данного кода коллекция Constraints объекта Artists будет содержать 2 отношения с именами Primary Key и Unique Artist Name (оба – класса UniqueConstraint)

39. Ado.Net. Навигация, поиск и фильтрация данных в DataSet. Основные свойства и методы. Типизированный набор данных.

Типизированный набор данных – это класс, который является наследником класса DataSet. В отличие от DataSet, в типизированном наборе для доступа к отдельным компонентам служат свойства.

Создать типизированный DataSet можно несколькими способами:

  • в Visual Studio для этого используется специальный мастер (wizard)

  • в состав .NET Framework SDK входит утилита xsd.exe, формирующая типизированные наборы данных не основании XSD-файла со схемой набора

Имеется DataSet с заданной схемой и в этот набор данных загружены 2 таблицы из базы CD_Rent

SqlDataAdapter da = new SqlDataAdapter(“SELECT = FROM Artists”, “Server=(local); Database = CD_Rent;” + “Integrated Security=SSPI”);

da.MissingSchemaAction = MissingSchemaAction.Error;

da.Fill(CD_Rent, “Artists”);

da.SelectCommand.CommandText = “SELECT * FROM Disks”;

da.Fill(CD_Rent, “Disks”);

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

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

Метод GetParentRow() позволяет получить родительскую строку. Как и предыдущий метод GetParentRow() принимает в качестве параметра имя связи между таблицами либо объект описывающий связь, а возвращает все родительские строки определённой строки.

Для поиска информации в таблице как наборе данных можно использовать 2 метода:

  • Find() – позволяет искать строки по значениям первичного ключа

  • Select() – выступает в качестве фильтра возвращая строки данных, удовлетворяющих критериям поиска

Метод Find() предоставляемый классом DataRowCollection ищет строки таблицы с определённым значением первичного ключа искомой строки.

Метод Select() класса DataTable позволяет искать ряды по определённому критерию, метод возвращает массив найденных строк:

Строка-критерий может содержать слово LIKE, которое осуществляет поиск частичному совпадению

В этом случае используется шаблон, содержащий метасимволы * или % для обозначения начальной или конечной части строки DataRow[] result = Disks.Select(“title LIKE ‘U*’ “);

Иногда требуется заключить в символы-разделители имена столбцов, используемые в критерии поиска

Например, когда имя содержит пробел или другой символ не относящийся к алфавитно-цифровым или похоже на зарезервированное слово типа LIKE или SLIM

Так, если имя столбца – Space in Name и требуется выбрать все строки значение поля Space In Name которых ровно 3 воспользуйтесь следующим критерием поиска:

strCriteria = “[Space In Name] = 3”

Если имя столбца включает символ-разделитель поставьте в критерии поиска перед закрывающим символом –разделителем(]) управляющий символ (\)

Имя столбца – Bad]Column[Name

strCriteria = @[Bad\]Column[Name] = 5”;

Методу Select() можно просто передать строку запроса, а можно включить в неё порядок сортировки, а также параметр, определяющий состояние искомых строк (например, только добавленные строки или только изменённые)

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

DataRow[] result = Disks.Select(“release_year = 2005”, “title DESC”);

Пусть потребуется просмотреть только изменённые и удалённые записи таблицы. Воспользуемся константами ModifedOriginal и Deleted из перечисления DataViewRowState и укажем в качестве параметров фильтрации и сортировки пустые строки:

DataRow[] result = Disks.Select (“ “, “ “, DataViewRowState.ModifiedOriginal | DataViewRowState.Deleted);

Метод DataTable.Select() имеет ограничения:

  1. метод принимает динамические критерии поиска и поэтому не может быть сверхэффективным

  2. Windows- и Web-формы не поддерживают связывание с возвращённым значением метода Select() – массивом объектов DataRow.

40. ADO.NET. Класс DataView. Основные свойства и методы.

Объекты DataView:

  • позволяют фильтровать, сортировать (свойства Table, RowFilter, Sort и RowStateFilter) и вести поиск в содержимом таблиц – методы Find() и FindRows()

  • не являются SQL-запросами в отличие от представлений (view) в БД

  • с их помощью нельзя объединить данные двух таблиц и просмотреть отдельные столбцы таблицы

У объекта DataView нет собственной копии данных. При обращении через него к данным он возвращает записи хранящиеся в соответствующем объекте DataTable

Чтобы просмотреть данные некоторой таблицы его следует связать с этой таблицей

Существуют 2 способа:

  • используя свойство Table объекта DataView

  • или при помощи конструктора DataView

DataTable dt = CD_Rent.Tables[“Disks”];

// Первый вариант

DataView dv = new DataView();

dv.Table = dt;

// Второй вариант

DataView dv = new DataView(dt);

У DataView также есть конструктор, задающий значения свойств Table, RowFilter, Sort и RowStateFilter в одной строке кода.

DataTable dt = CD_Rent.Tables[“Disks”];

// Первый вариант

DataView dv = new DataView();

dv.Table = dt;

dv.RowFilter = “release_year = 2005”;

dv.Sort = “title DESC”;

dv.RowStateFilter = DataViewRowState.ModifiedOriginal;

//Второй вариант

DataView dv = new DataView(dt, “release_year = 2005”, “title DESC”, DataViewRowState.ModifiedOriginal);

Свойство RowStateFilter принимает значения из перечисления DataViewRowState. Это перечисление можно рассматривать как комбинацию свойства RowState объекта DataRow и перечисления DataRowVersion

Например:

Added – отображаются добавленные строки

ModifiedOriginal – отображаются изменённые строки с их оригинальными значениями

CurrentRows – отображаются строки, которые не были удалены (значение по умолчанию)

Свойство RowStateFilter работает в качестве двойного фильтра

Например, если задать ему значение ModifiedOriginal через объект DataView окажутся доступны только изменённые записи, и вы будете видеть их оригинальные значения.

Объект DataView возвращает данные с помощью объекта – DataRowView. Функциональность DataRowView в целом аналогична функциональности DataRow.

DataRowView через свойство Item, позволяет обращаться к содержимому поля как по имени, так и по порядковому номеру.

Свойство Count возвращает число строк, и индексатор Item с целым индексом. Используя эти свойства, можно создать простой цикл для просмотра всех строк:

DataView dv = new DataView(dt, “id>10”, “title DESC”, DataViewRowState.CurrentRows);

foreach (DataRowView drv in dv)

{

Console.WriteLine(drv[“title”]);}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]