ЛАБОРАТОРНАЯ РАБОТА № 2

Тема: «Создание клиентской части распределенного приложения»

Цель: создать клиентские приложения для распределенных баз данных, которые должны реализовывать следующие функции:

добавление данных,

редактирование,

удаление,

просмотр,

поиск данных по одному или нескольким критериям,

соединение с удаленной базой данных и получение требуемых данных

отображение отчетов CristalReports.

·  Запустите интегрированную среду разработки приложений Visual Studio 2005.

·  Создайте новое приложение File -> New->Project -> Windows Application.

Создадим два подключения к базам данных Universitet.mdf и Институт_.mdb.

Для создания первого подключения воспользуемся мастером создания подключений. Для этого в обозревателе серверов (Server explorer) щелкните правой кнопкой мыши Подключения данных (Data Connection) и выберите команду Добавить подключение (Add connection).

В появившемся окне выбрать Microsoft SQL Server Database File (для появления данного окна нажмите на кнопкуChange). Нажмите на Browse и укажите созданный вами файл базы данных в лабораторной работе № 1 - Universitet. mdf.

После выполнения выше изложенных шагов, перетащите из ToolBox на поле формы или конструктора объект BindingSource.

В нижней части формы появится соответствующий значок, щелкните правой кнопкой мыши по данному значку, выберите строку Properties. В открывшемся окне щелкните в строке DataSource.

В открывшемся окне выберите Add Project data Source.

Затем выберите Database нажмите Next, укажите в строке путь к используемой базе данных, обычно он записан по умолчанию и нажмите Next.

НЕ нашли? Не то? Что вы ищете?

Далее необходимо выбрать объекты базы данных, которые войдут в объект DataSet.

И нажмите Finish.

В окне формы внизу появится значок

Создадим второе подключение вторым способом – программно. Для этого перейдите в программный код формы Form1.cs. На панели Solution Explorer щелкните правой клавишей на Form1.cs, выберите View Code.

Измените программный код следующим образом

using System;

using System. Collections. Generic;

using ponentModel;

using System. Data;

using System. Drawing;

using System. Text;

using System. Windows. Forms;

using System. Data. OleDb;

namespace lab_rab6

{

public partial class Form1 : Form

{

string InstConnectString = "Provider=Microsoft. Jet. OLEDB.4.0;Data Source=" + @"D:\Институт_Петров. mdb";

OleDbConnection con;

public Form1()

{

InitializeComponent();

con = new OleDbConnection(InstConnectString);

con. Open();

} } }

Укажите путь к вашей базе данных Институт_.mdb.

Далее будем создавать форму следующего вида:

Вернитесь в дизайнер формы. Form1.cs [Design].

Добавьте с панели инструментов ToolBox объект TabControl и расположите его на форме. В окне свойств (Properties) перейдите на строчку TabPages нажмите на . В окне tabPagesCollection Editor нажмите на кнопку ADD для добавления вкладок, измените свойства Name и Text. Для вкладки Данные Name = tabData, Text = Данные, на второй вкладке Студенты Name = tabStud, Text = Студенты, на третьей вкладке Name = tabExam, Text = Экзамены, на четвертой вкладке Name = tabPrep, Text = Преподаватели.

На вкладке Данные добавьте следующие объекты с панели инструментов, изменив их свойства:

Name

datGrid

Объект ComboBox

Name

cmbTable

Выберите свойство Items (Collection) и введите следующие пункты списка:

Добавьте кнопку (Button)

Name= butLoad, Text = «Загрузить данные».

Затем перейдите на вкладку Студенты и добавьте следующие объекты с панели инструментов, изменив их свойства:

Name

dataGridStud

На вкладку Экзамены добавьте две кнопки:

Кнопка Добавить запись

Name

butInsExam

Text

Добавить запись

Кнопка Загрузить данные

Name

butUpdExam

Text

Загрузить данные

Реализуем следующие функции приложения:

1.  Выбрав пункт меню и нажав кнопку Загрузить данные, в объекте dataGridView отображаются данные выбранной таблицы.

Дважды щелкните по кнопке «Загрузить данные» и в обработчике введите следующий код. А также добавьте объявление переменной OleDbDataAdapter datAdapTable;

перед public Form1().

2. Возможность отображения в объекте datGridStud не всех данных из таблицы Студенты, а только №зачетки, фамилии, имени и группы.

Измените программный код класса public Form1() следующим образом:

Таким образом, для отображения выборочных данных в клиентском приложении необходимо:

1.  Создать соединение. OleDbConnection con = new OleDbConnection(InstConnectString);

2.  Открыть соединение.

3.  Создать объект DataTable для помещения в него данных таблицы Студенты.

4.  Создать адаптер данных, так как база данных создана в Access, используется OleDBProvider, поэтому OleDbDataAdapter. Указать какие данные поместить в адаптер, например как в данном случае в виде SQL –запроса и указать соединение.

5.  Создать схему представления данных с помощью объектов DataColumn.

6.  Заполнить объект Stud данными из адаптера DA.

7.  Указать объекту dataGridView источник данных для отображения, в данном случае это объект DataTable Stud.

Реализуем отображения всех данных из таблицы Exam на вкладке Экзамены.

Для этого перейдите на вторую вкладку в режиме дизайнера формы и поместите с панели Toolbox объект DataGridView. Измените свойство Name на dataGridExam

Дважды щелкните по кнопке Загрузить данные и введите следующий программный код, добавив предварительно объявление переменной DataTable Exam;

OleDbDataAdapter datAdapExam; перед public Form1(), в обработчике кнопки private void butUpdExam_Click(object sender, EventArgs e)введите:

Запустите приложение, нажав на F5.

На вкладке преподаватели добавьте объект DataGridView, измените свойство Name на dataGridPrep.

При добавлении откроется окно в котором необходимо раскрыть список Choose Data Source. И выбрать из списка таблицу Sotrudniki.

В форму добавятся объекты

Запустите приложение на выполнение F5 и убедитесь, что объект DataGridView заполнился данными из таблицы Sotrudniki.

Реализуем в приложении для вкладки Экзамены следующие возможности:

1.  по нажатию на кнопку Добавить запись – открывается окно с полями для ввода новых значений.

2.  Значение номера зачетки выбирается из поля со списком, в котором отображается данные, выбранные в объект DataTable Stud.

Для реализации первой возможности необходимо добавить в проект форму ProjectAdd Form в открывшемся окне выберите Windows Form и назовите InsertExam.

Расположите на форме следующие объекты:

Объект Label для вывода надписей: № зачетки, Предмет, Оценка, Дата сдачи.

Для этого свойству Text объекта Label присвойте соответствующие названия.

Для ввода номера зачетки перетащите объект – ComboBox.

Отображаться в списке будут данные из таблицы Студенты, а добавляться в таблицу будут числовые значения NumZac:

Name

cmbNumZac

Для отображения даты сдачи вставьте объект с панели ToolboxDateTimePicker.

Измените свойства:

Name

dateSD

MinDate

1.01.1960

Для поля оценка вставьте объект ComboBox - cmbOcenka, нажав на треугольник в правом верхнем углу, выберите Edit Items.

Введите значения и нажмите ОК.

Добавьте объекты TextBox для ввода значений: предмет и ФИО экзаменатора, с именами txtPredmet, txtFIOprep.

Добавьте кнопки со свойствами:

Name

butInsert

Text

ОК

Name

butClose

Text

Закрыть

Для отображения выборочных данных из таблицы Students:

Добавить using System. Data. OleDb; в программный код формы InsertExam

Изменить программный код следующим образом:

public partial class InsertExam : Form

{

OleDbDataReader rdr;

OleDbConnection con;

OleDbCommand cmd;

string InstConnectString = @"Provider=Microsoft. Jet. OLEDB.4.0;Data Source=D:\Институт_Петров. mdb";

public InsertExam()

{

InitializeComponent();

con = new OleDbConnection(InstConnectString);

con. Open();

// Испольуем метод CreateCommand для создания команды

cmd = con. CreateCommand();

mandText = "Select Select №зачетки, Фамилия, Имя, Группа From Студенты";

//выполняем команду SQL

rdr = cmd. ExecuteReader();

// производим чтение из массива данных

while (rdr. Read())

{

string tmp = ""; //для каждого нового пункта списка очищаем

for (int i = 0; i < 4; i++)

{ if (tmp!= "")// если в массиве данных есть значения

tmp += " ";

tmp += rdr[i].ToString(); //формируем пункт поля со списком

}

cmbNumZac. Items. Add(tmp);//добавляем пункт списка к объекту

}

}

Дважды щелкнете по объекту cmbOcenka и введите следующий программный код:

private void cmbNumZac_SelectedIndexChanged(object sender, EventArgs e)

{

string res = cmbNumZac. SelectedItem. ToString();//считываем в переменную //выделенный пункт списка

cmbNumZac. ValueMember = res. Substring(0, 6); //вводимое в таблицу значение - это первые 6 символов пункта списка, которые соответсвуют шестизначному номеру зачетки

}

Дважды щелкнув по кнопке ОК, введите следующий программный код:

if(InsCmd. ExecuteNonQuery()==1)//если запрос написан без ошибок, значит он будет выполнен методом ExecuteNonQuery и вернет значение true или 1.

MessageBox. Show("Сведения успешно добавлены", "Добавление", MessageBoxButtons. OK);

DataTable Exam = new DataTable("Экзамены");

OleDbDataAdapter datAdapExam = new OleDbDataAdapter("SELECT * FROM Экзамены",con);

datAdapExam. Fill(Exam);

Дважды щелкнув по кнопке Закрыть, введите следующий программный код:

Реализуем программный код для кнопки вкладки Экзамены Добавить запись, дважды щелкнув, введите:

InsertExam InsExam = new InsertExam();

InsExam. Show();

//очищаем строки перед загрузкой обновленных значений таблицы

Exam. Rows. Clear();

Добавим в приложение меню, один пункт будет открывать отчет о количестве студентов в группах, второй отчет выводит результаты сдачи экзаменов студентов с группировкой по группе и по фамилии.

На панели Toolbox выберите объект MenuStrip, перетащите на форму. В появившейся заготовке вместо Type Here введите Отчеты. Затем переместитесь ниже и введите Отчет о количестве студентов, затем переместитесь еще строчкой ниже и введите Отчет о результатах сдачи экзаменов. Справа от меню Отчеты введите слово Выход.

Для того, чтобы создать отчет средствами Visual Studio необходимо:

Выбрать Project -> Add Windows Form из списка файлов выбрать CristalReport . В строке Name задать имя отчета, например,Otchet1.rpt Нажать кнопку Add. Выбрать Create Using Wizard. В появившемся окне выбрать Create New Connection.

Выбрать пункт Access/Exel (DAO). Затем в строке Database Name, нажать на кнопку и выбрать базу данных, которая будет являться источником данных.

Нажмите на кнопку Готово.

В следующем окне раскройте содержимое пункта Tables.

Выберите все таблицы из базы данных.

Нажмите на кнопку Далее.

В следующем окне отображаются связи между таблицами, при необходимости в этом окне можно изменить связи. В нашем примере этого не потребуется, нажимаем кнопку Далее.

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

Создадим отчет, который выводит информацию о количестве студентов в каждой группе.

Выбираем поля из таблицы Students: Gruppa, Familia.

Нажимаем кнопку Далее.

В следующем окне выбираем поля для группировки, в нашем примере группировка будет осуществляться по полю Gruppa

Нажимаем Далее.

В следующем окне выбирается поле и используемая для него агрегатная функция. В нашем примере необходимо посчитать количество студентов, поэтому из поля со списком выбираем функцию Count и выбираем поле Familia.

В следующем окне предлагается выбрать вид сортировки, оставляем все без изменения и нажимаем Далее.

В следующем окне предлагается возможность вставки диаграммы, оставляем без изменения и нажимаем Далее.

В следующем окне предлагается возможность задать условные значения на выбираемые данные

Раскройте список и ознакомьтесь с предлагаемыми условиями. В нашем примере необходимо оставить первоначальное значение.

В последнем окне предлагается выбрать стиль диаграммы, выбираем первый пункт и нажимаем кнопку Готово.

    Для просмотра отчета перейдите на вкладку Main Report Preview. Для переключения в конструктор отчета, щелкните по вкладке Main Report.
    Отредактируйте англоязычные надписи, переименуйте их на русский. Для этого правой клавишей мыши щелкните по тексту и выберите пункт Edit Text Object.

Для изменения места расположения компонентов отчета, щелкните по объекту отчета и путем перетаскивания установите в необходимое место отчета. Обратите внимание, что на панели инструментов появились дополнительные кнопки для редактирования отчета.

·  В режиме конструктора удалите поля из секции Detalis.

Для открытия отчета в приложении добавим еще одну форму, на которой необходимо поместить объект CrystalReportViewer.

Выбрать Project -> Add Windows Form

С панели Toolbox перетащите и растяните на форме объект CrystalReportViewer.

Щелкните правой клавишей мыши по данному объекту и выберите свойство Choose a Crystal Report. В появившемся окне выберите из списка, созданный отчет Otchet. rpt

Для открытия созданного окна для отображения отчета, дважды щелкните по пункту меню Отчет о количестве студентов в дизайнере главной формы. Измените программный код:

private void отчетОКоличествеСтудентовToolStripMenuItem_Click(object sender, EventArgs e)

{

Form3 rep1 = new Form3(); //создаем экземпляр окна формы 3

rep1.Show(); // показать окно формы 3

}

Щелкните по пункту меню Выход и введите следующий программный код:

private void выходToolStripMenuItem_Click(object sender, EventArgs e)

{

this. Close(); //закрытие окна

}

Теперь создадим второй отчет для этого необходимо:

добавить в проект новую форму и добавить объект CrystalReportViewer.

Установите для свойства вьювера отчета DisplayGroupTree значение False.

Щелкните правой клавишей мыши по вьюверу отчета и выберите пункт Create a New Crystal Report.

В появившемся окне назовите отчет Otchet2.rpt и нажмите ОК.

Выберите пункт As a Blank Report (аналог создания отчета в режиме конструктора).

Для выбора источника данных для запроса вызовите окно Database Expert

Появится окно, в котором выберите таблицы Students и Exam.

На панели Field Explorer разверните вкладку Database Field и перетащите поля Predmet, Ocenka, DataSd в раздел Details. Добавьте группировку по полю Группа и Фамилия, для этого щелкните правой клавишей мыши по Group Name Filds и выберите Insert Group, из списка полей переместите в правый столбец поле Gruppa, затем Familia.

В раздел Report Header добавьте объект Text Object с надписью Успеваемость студентов В раздел Group Header2 поместите поле Name.

Для открытия созданного отчета через пункт меню Отчет о результатах сдачи экзаменов, необходимо дважды щелкните по пункту меню и ввести следующий программный код:

private void отчетОРезультатахСдачиЭкзаменовToolStripMenuItem_Click(object sender, EventArgs e)

{

Form4 rep2 = new Form4();

rep2.Show();

}

Создать отчет, подсчитывающий рейтинг студентов и определяющий номер курса. Добавить в проект файл Crystal Reports.

    В окне выбрать As a Blank Report. В конструкторе отчета перейти к DataBase Field - > Database Expert Добавить таблицы Студенты, Экзамены.

    Добавьте группировку в отчет по полю №_зачетки из таблицы Экзамены

Group Name Fields -> Insert Group -> из поля со списком выбрать №_зачетки -> OK.

    Создать итоговое поле для подсчета среднего балла студентов. Running Total Fields -> New.

·  В заголовок отчета Report Header, добавьте объект Text Object. Введите «Рейтинг студентов».

·  В заголовок группы добавьте текст «Группа».

·  В область GroopFooter Section1 перетащите поля №_зачетки, Фамилия, Имя, RTotal0.

Создадим формулу. Formula Fields -> New -> Введите имя F1 ->Use Editor

Введите следующую формулу:

Введите формулу:

Switch ({#RTotal0}>4.5,"отличник",{#RTotal0}>=4 And {#RTotal0}<=4.5,"хорошист",{#RTotal0}>=3 And {#RTotal0}<4,"ударник" )

    Расположите F1 рядом с полем RTotal0.

Создадим формулу для вычисления номера курса. Formula Fields -> New -> Введите имя F2 ->Use Editor

Введите следующую формулу:

Функция Left( ) вырезает слева из указанного строкового источника, указанное во втором параметре количество символов, в нашем случае источник – значение поля Группа, количество символов – 2.

Закрыть окно построителя формул и сохранить изменения.

·  Перетащить формулу F2 в область отчета Group Header Section2.

·  Добавьте рядом текстовый объект и введите в нем курс.

В результате у вас должна получиться следующая структура отчета:

Просмотрите результат в предварительном просмотре

Дополнительный материал по созданию отчетов в Crystal Reports

http://www. *****/sql/cryrep/cryrep1.html

Теоретический материал

Схема типичной программы в такова.

Вначале создается соединение с базой данных – класс Connection, который обеспечивается необходимой информацией – строкой соединения. Создается объект Command и задается команда, которую необходимо выполнить в данной СУБД. Эта команда может быть запросом SQL или исполняемой процедурой. Нужно задать параметры этой команды, если они имеются. Если команда не возвращает данных, она просто выполняется с помощью одного из методов Execute. Например, это может быть удаление или обновление данных таблицы. Если команда возвращает выборку данных, их необходимо куда-то поместить. Если необходимо получить данные для последующего использования без связи с базой данных, то нужно создать класс DataAdapter и с его помощью сохранить данные в DataSet или в DataTable. Если нужно просто быстро выполнить команду, то создается класс DataReader, который требует сохранять соединение на все время работы, хранит выборку только для чтения и позволяет двигаться только вперед. Зато чтение с помощью DataReader выполняется в несколько раз быстрее, чем в DataAdapter. Задать полученный DataSet или DataReader как источник данных элемента управления или вывести их на страницу другим способом.

Объект Connection

Объект Connection для соединения с базой данных нуждается в строке соединения для указания пути к СУБД и входа в систему. Свойства класса Connection показаны в таблице. OleDbConnection, SqlConnection, OdbcConnection – наследники класса Connection, специфические для провайдеров OleDb, MS SQL, ODBC соответственно.

Свойство

Описание

DataSource

Путь к базе данных в файловой системе при использовании Oledb, имя экземпляра базы сервера при использовании SqlConnection

Database

Возвращает имя базы данных, используемой в объекте Connection после открытия

State

Возвращает текущее состояние соединения. Возможные значения – Broken – «Соединение с источником данных разорвано», значение 16

Closed – « Соединение закрыто », значение 0

Connecting – « Идет процесс подключения », значение 2

Executing – « Соединение находится в процессе выполнения команды 4 , Fetching – «Объект соединения занят выборкой данных» значение 8

Open – «Соединение открыто» значение 1.

ConnectionString

Строка соединения с СУБД

Все свойства, кроме ConnectionString, только для чтения.

Открытые методы

BeginTransaction

Перегружен. Начинает транзакцию базы данных

ChangeDatabase

Изменяет текущую базу данных для открытого OleDbConnection

Close

Закрывает подключение к источнику данных. Это рекомендуемый метод закрытия любого открытого подключения

CreateCommand

Создает и возвращает объект OleDbCommand, связанный с OleDbConnection

CreateObjRef (унаследовано от MarshalByRefObject)

Создает объект, который содержит всю необходимую информацию для конструирования прокси-сервера, используемого для коммуникации с удаленными объектами

Dispose (унаследовано от Component)

Перегружен. Освобождает ресурсы, используемые объектом Component

EnlistDistributed

Зачисляет в указанную транзакцию в качестве

Transaction

распределенной транзакции

Equals (унаследовано от Object)

Перегружен. Определяет, равны ли два экземпляра Object

GetHashCode (унаследовано от Object)

Служит хэш-функцией для конкретного типа, пригоден для использования в алгоритмах хэширования и структурах данных, например в хэш-таблице

GetLifetimeService (унаследовано от MarshalByRefObject)

Извлекает служебный объект текущего срока действия, который управляет средствами срока действия данного экземпляра

GetOleDbSchemaTable

Возвращает сведения схемы из источника данных так же, как указано в GUID, и после применения указанных ограничений

GetType (унаследовано от Object)

Возвращает Type текущего экземпляра

InitializeLifetimeService (унаследовано от MarshalByRefObject)

Получает служебный объект срока действия для управления средствами срока действия данного экземпляра

Open

Открывает подключение к базе данных со значениями свойств, определяемыми ConnectionString

ReleaseObjectPoolOleDb Connection

Статический. Означает, что пул объектов может быть освобожден, когда последнее основное подключение будет освобождено

ToString (унаследовано от Object)

Возвращает String, который представляет текущий Object

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

Источник данных (Data Provider) – это набор взаимосвязанных компонентов, обеспечивающих доступ к данным. Функциональность и само существование провайдера обеспечивается набором классов, специально для этой цели разработанных.

Объект DataSet – основной элемент в поддержке отсоединенного сценария работы с распределенными данными в . DataSet – это представление данных в памяти, предоставляющее полноценную реляционную модель, независимо от источника данных. Его можно использовать с несколькими различными источниками данных, например, данными из БД и XML. Кроме того, он представляет собой довольно мощную структуру данных, пригодную для автономного использования. DataSet может содержать несколько таблиц, связанных ограничениями и реляционными отношениями.

DataSet состоит из объектов типа DataTable и объектов DataRelation. К ним можно обращаться как к свойствам объекта DataSet. Свойство Tables возвращает объект типа DataTableCollection, который содержит все объекты DataTable используемой базы.

Объект типа DataTable представляет собой таблицу базы данных. Такой объект может быть создан программно или путем запроса к базе данных. Объект DataTable состоит из строк и столбцов. Строки представляют собой отдельные записи таблицы, столбцы — соответствующие поля.

Для получения совокупности столбцов объект DataSet имеет свойство Columns, возвращающее DataColumnCollection, которое в свою очередь состоит из объектов типа DataColumn. Каждый объект DataColumn представляет собой отдельный столбец таблицы, из которого можно получить любую запись.

Кроме набора таблиц DataSet имеет свойство Relations, которое возвращает объект типа Data Relation Collection, состоящий из объектов DataRelation. Каждый DataRelation объект хранит данные о связях между двумя таблицами посредством объектов DataColumn. Например, в базе данных Institute, которую предлагается вам создать, таблица Students имеет связь с таблицей Examen посредством столбца NumZac. Такое отношение называется на языке баз данных один ко многим (one-to-many). Любой результат экзамена может принадлежать только одному студенту, но один студент может сдать сколько угодно экзаменов.

DataSet —это образ реляционной базы данных. использует объект типа DataAdapter как мост между DataSet и источником данных, который является основной базой данных. DataAdapter содержит метод Fill( ) для обновления данных из базы и заполнения DataSet.

Таблица 1. Наиболее важные члены OleDbDataAdapter

Член

Описание

DeleteCommand

InsertCotnmand

SelectCommand

UpdateCommand

Используются для определения того, какая именно команда SQL будет передана на источник данных при вызове метода Update(). Каждое из этих свойств определяется при помощи объектов OleDbCommand.

Fill()

Заполняет указанную таблицу в DataSet определенным пользователем количеством записей

GetFillParameters()

Возвращает все параметры, использованные при выполнении запроса SELECT к источнику данных

Update ()

Вызывает соответствующие команды INSERT, UPDATE, DELETE к источнику данных для каждой вставленной, измененной или удаленной строки в таблице объекта DataSet.

При использовании свойств DeleteCommand, InsertCommand, UpdateCommand, SelectCommand объект OleDbDataAdapter автоматически переводит внесенные нами изменения в таблицу данных в DataSet в соответствующие команды на языке SQL, сохраняя, таким образом, внесенные нами в DataSet изменения в источнике данных. Эти свойства позволяют определить соответствующие команды SQL в деталях.

С# включает такой мощный инструмент для отображения данных, как элемент управления DataGrid. DataGrid может применяться как для разработки Windows Forms приложений, так и для разработки Web-приложений. DataGrid - это элемент управления, который сочетает в себе все возможности таблицы Excel.