Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР7.doc
Скачиваний:
16
Добавлен:
05.05.2019
Размер:
851.46 Кб
Скачать

Представление базы данных на стороне клиента

Обратимся теперь к очень интересному вопросу, не относящемуся напрямую к взаимодействию с SQL Server. На стороне клиента также можно создавать базы данных, которые будут храниться в памяти. Содержимое такой базы данных можно заполнить вручную или получить с SQL Server. При этом используются такие классы, как столбец, таблица, база данных, связь, первичный ключ, строка. Например, для того чтобы работать со строками некоторой таблицы, мы должны предварительно создать объект "строка".

В листинге 5.5 представлена хорошо прокомментированная программа, демонстрирующая управление реляционной базой данных на стороне клиента. В программе создаются база данных bd и две таблицы t1 и t2. Таблицы помещаются в базу данных, и между ними устанавливается связь. Показано так же, как определить структуру таблиц и заполнить их содержимым.

Листинг 5.5

using System;

using System.Collections.Generic;

using System.Text;

using System.Data;

namespace sql11

{

class Program

{

static void Main(string[] args)

{

DataSet bd = new DataSet("workers");

// создаем две таблицы

DataTable t1 = new DataTable("names");

DataTable t2 = new DataTable("salaries");

// добавляем таблицы к базе данных

bd.Tables.Add(t1);

bd.Tables.Add(t2);

DataColumn dt;

// определяем столбцы первой таблицы

// столбец id - первичный ключ

dt = new DataColumn();

dt.DataType = System.Type.GetType("System.Int32");

dt.ColumnName = "id";

dt.AutoIncrement = true;

dt.Unique = true;

dt.AllowDBNull = false;

t1.Columns.Add(dt);

// столбец name

dt = new DataColumn();

dt.DataType = System.Type.GetType("System.String");

dt.ColumnName = "name";

dt.AllowDBNull = false;

dt.DefaultValue = " ";

t1.Columns.Add(dt);

// определяем столбцы второй таблицы

// столбец id - внешний ключ

dt = new DataColumn();

dt.DataType = System.Type.GetType("System.Int32");

dt.ColumnName = "id";

dt.AllowDBNull = false;

t2.Columns.Add(dt);

// столбец salary

dt = new DataColumn();

dt.DataType = System.Type.GetType("System.Double");

dt.ColumnName = "salary";

dt.AllowDBNull = false;

t2.Columns.Add(dt);

// определяем первичный ключ

DataColumn[] pk = new DataColumn[1];

pk[0] = t1.Columns["id"];

t1.PrimaryKey = pk;

// создаем связь между таблицами

DataRelation dr = new DataRelation("dr1",

bd.Tables["names"].Columns["id"], // главная таблица

bd.Tables["salaries"].Columns["id"] // подчиненная таблица

);

// добавить отношение к базе данных

bd.Relations.Add(dr);

// заполнение таблиц

// таблица names

DataRow row1 = t1.NewRow();

row1["name"] = "Ivanov";

t1.Rows.Add(row1);

row1 = t1.NewRow();

row1["name"] = "Petrov";

t1.Rows.Add(row1);

row1 = t1.NewRow();

row1["name"] = "Sidorov";

t1.Rows.Add(row1);

// таблица salaries:

// нужно добавить строку для работника по фамилии Sidorov

Int32 idd = 0;

for (int i = 0; i < t1.Rows.Count; i++)

{

DataRow cd = t1.Rows[i];

// для контроля выводим значения столбцов

Console.WriteLine("id={0},name={1}", cd["id"], cd["name"]);

// проверка значения столбца

if (cd["name"] == "Sidorov")

{

idd = (Int32)cd["id"];

break;

}

}

DataRow row2 = t2.NewRow();

row2["id"] = idd;

row2["salary"] = 9000.45;

t2.Rows.Add(row2);

// использование связи

// получить строку из таблицы names

DataRow rowl = bd.Tables["names"].Rows[2];

// получить строки, связанные с имеющейся строкой

DataRow[] rowr = rowl.GetChildRows(bd.Relations["dr1"]);

// вывести полученные строки

foreach (DataRow drw in rowr)

{

Console.WriteLine(drw["salary"]);

}

}

}

}

Логика работы с объектами в листинге 5.5 достаточно проста. Существуют объекты-контейнеры. Примером объекта-контейнера является база данных (DataSet). Данный контейнер может содержать в себе два вида объектов: таблицы (DataTable) и связи между таблицами (DataRelation). В свою очередь таблица также является контейнером и может содержать такие объекты, как столбец (DataColumn) и строка (DataRow).

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

При наличии связи между таблицами можно переходить не только от главной таблицы к подчиненной (метод GetСhildRows в листинге 5.5), но и от подчиненной таблицы к главной (метод GetParentRows).

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