Очистка текстового окна для произвольных запросов
48. Для того, чтобы пользователь мог ввести свой произвольный, нестандартный запрос, ему нужно чистое окно. Конечно, он может просто удались данные из тестового окна, но лучше предусмотреть для него функцию очистки. Итак, для пункта меню «Очистить окно» пишем:
Создание отчетов с помощью GrystaiReports,
49. Для того, чтобы разобраться с созданием отчетов, создадим один из отчетов данного приложения. Он назвается «Отчет о покупках», Любой отчет выглядит, как форма, вызываемая из меню главной формы.
50. В конечном варианте этот отчет выглядит следующим образом:
51. Форма создается таким же образом, каким создается форма с таблицами. В MenuStrip прописаны функции возвращения на основную форму и выхода из приложения. На форму добавляется объект Toolbox CrystalRepoitViewer.
52. В меню CrystalReportViewer добавляется выводимый отчет.
53. Связь этой формы с основной прописывается аналогично связям форм с таблицами с основной формой.
54. Для того, чтобы в выпадающем меню выбора отчетов таковые находились, необходимо их создать. Для этого нужно вызвать Project > Add New Item > CrystalRepoit
55. При добавлении нового отчета нужно выбрать создание отчета с помощью
конструктора.
56. Далее установить соединение с базой данных. Делается это следующим образом:
57. Выбирается способ соединения Microsoft OLE DB Provider For SQL Server и вносится имя текущего сервера и название базы данных.
58. После установки соединения, в нем выбираются нужные таблицы.
59. После нажатия на кнопку «Далее» в похожих окнах выбираются столбцы для отчета.
60. Вы увидите связи между выбраными таблицами:
61. Жмем кнопку «Далее»
62. Выбираем поля для отображения в отчете и нажимаем кнопку «Далее»:
63. В следующем окне можно обозначить поля для группировок и нажать кнопку «Далее».
64. Если в отчете необходимы поля, по которым будет происходить суммирование, то их нужно отметить:
65. Дважды нажимаем кнопку «Далее», выбираем вид отчета (внешний) и затем нажимаем кнопку «Готово»:
66. Так выглядит форма для отчета. Необходимо настроить размер полей и добавить заголовок.
67. Переходим на main Report Preview и проверяем результат:
68. Отчет готов. Оталось его присоединить к меню.
69. В форме с отчетом прописываем:
70. Теперь нужно указать отображение на вызов каждого отчета: (в главной форме)
71. Не забудьте сделать кнопки/пункты меню для возрата на главную форму и выходя из приложения.
Приложение
72. В качестве приложений приведем скриншоты всех форм, задействованных в рассмотренном приложении.
Заключение
В данном документе были описаны основные приемы создания интерфейса для работы с базам данных. Все функции, необходимыя для связи с SQL Server а также просто функции, необходимые для работы программы приведены и объяснены. Остальной дизайн и функциональность остаются на усмотрение разработчика.
Приложение 3
Пример создания приложения к базе данных в среде C#.
Отчет по практике
«Создание приложения для работы с базой данных»
Выполнил: (ФИО)
студент группы
2 курса факультета
«бизнес-информатика»
Проверил: (ФИО)
Г. Москва
200_ г.
СОДЕРЖАНИЕ:
Возможности приложения. 55
Создание главного меню.. 55
Связывание базы данных и формы Tables и отображение данных в DataGrid. 56
Добавление новой записи в таблицу. 61
Редактирование записей в таблицах. 62
Удаление записей из таблиц. 63
Составление и выполнение запросов. 64
Создание отчетов. 66
Экспорт данных в Excel 72
Экспорт данных в HTML.. 74
Вступление
Приложение «Фонотека» разрабатывалось в среде MS Visual Studio 2005 на языке Visual C# и предназначено для работы с базой данных «media2» (расположенной на сервере User1), созданной с помощью Enterprise Manager. БД содержит информацию о музыкальных композициях, исполнителях и альбомах. На рисунке ниже представлены содержащиеся в БД таблицы и связи между ними.
Возможности приложения
Программа «Фонотека» позволяет выполнять следующие действия:
- Просмотр таблиц и их редактирование, в том числе: добавление, удаление и изменение записей;
- Создание запросов к базе данных на языке SQL и их выполнение (также предусмотрен выбор из нескольких готовых запросов);
- Экспорт таблиц в Excel и в формат Web-страниц (HTML);
- Создание отчетов.
Подробнее функциональные возможности приложения и пути их реализации будут рассмотрены ниже.
Создание главного меню
Меню приложения создается довольно просто – на форму Main добавляется объект MenuStrip; пункты меню ввожу с клавиатуры:
Каждый пункт меню вызывает отдельную форму или событие:
- Таблицы – форму Tables,
- Запросы – форму Query,
- Отчеты
- Все композиции,
- Информация об исполнителях, формы RepSongs, RepSingers, RepAlbums
- Информация об альбомах;
- Экспорт
- В Excel – форму Export;
- В HTML – форму ExportToHtml;
- Выход – выход из приложения.
Переход на другую форму (например, на Tables) осуществляется с помощью такого обработчика:
private void таблицыToolStripMenuItem_Click(object sender, EventArgs e)
{
Tables tables = new Tables();
tables.Show();
this.Visible = false;
}
Связывание базы данных и формы Tables и отображение данных в DataGrid
Связывание формы с БД – это ключевая операция, необходимая для корректной работы приложения. Просмотр и редактирование БД, выполнение запросов и экспорт осуществляется посредством доступа к SQL базе данных “media2”.
Рассмотрю подробнее механизм связывания.
После создания формы Tables добавляю на нее объект SqlConnection; в окне Properties в качестве значения ConnectionString выбираю New Connection и в открывшемся окне указываю необходимые параметры:
Следующий шаг – добавление SqlDataAdapter на форму. Как только объект помещается на форму, открывается окно, где необходимо указать базу данных:
Далее мастер предлагает выбрать способ доступа к базе данных; выбираю Use SQL Statements и в следующем окне пишу нужный запрос. Например, чтобы добавить в DataSet информацию обо всех столбцах таблицы «Список_песен», нужно написать такой запрос:
После нажатия Next мастер выполнит нужные операции или укажет на ошибку. После создания адаптера нужно сгенерировать для него набор данных. Для этого внизу окна Properties для созданного sqlDataAdapter1 нажимаю Generate DataSet.
В открывшемся окне отображается список таблиц, добавленных в новый набор данных (dataSet11). Пока добавлена только одна таблица:
Теперь, чтобы при запуске приложения данные из БД «media2» загружались в форму, нужно в обработчик события Tables_Load добавить следующую строку:
this.sqlDataAdapter1.Fill(dataSet11);
Таким образом, связывается БД и форма; однако данные пока не отображаются. Для их отображения добавляю на форму объект DataGrid, и в качестве его свойства DataSource выбираю Other Data Sources ® Project Data Sources ® DataSet1 ® Список_песен:
В результате готовая форма Tables выглядит так:
Чтобы поместить на одну форму все пять таблиц базы данных, я использую контейнер TabControl: на каждую tabPage я помещаю таблицу DataGrid и связываю ее с отдельным адаптером. Таким образом, на форме Tables содержится пять адаптеров, а в dataSet11 – все пять таблиц. После запуска приложения каждая таблица заполнится данными, если перед этим добавить в обработчик событий Tables_Load следующие строки:
this.sqlDataAdapter1.Fill(dataSet11);
this.sqlDataAdapter2.Fill(dataSet11);
this.sqlDataAdapter3.Fill(dataSet11);
this.sqlDataAdapter4.Fill(dataSet11);
this.sqlDataAdapter5.Fill(dataSet11);
Добавление новой записи в таблицу
На форме Tables помещаю кнопку addBtn и в обработчике события addBtn_Click пишу код, вызывающий форму AddRecord. Эта форма выглядит следующим образом:
Она также содержит контейнер TabControl; переключаясь между страницами, можно добавить новую запись в одну из пяти таблиц базы данных.
Рассмотрю подробнее механизм добавления новых записей на примере добавления записи в таблицу «Добавить композицию».
Прежде всего, необходимо создать SqlConnection для формы, пять SqlDataAdapter’ов (для каждой из пяти таблиц) и набор данных (DataSet1 общий для всего проекта). Только после этого можно продолжать работу. Эти объекты нужны для добавления, изменения и удаления записей.
Поля формы можно заполнить, либо введя новое значение, либо выбрав одно из предложенных в ComboBox’ах (причем эти значения обновляются в течение редактирования). Чтобы добавить в таблицу «Список_песен» новую запись, следует в обработчик addBtn_Click добавить такой код:
DataRow rowB = dataSet11.Tables["Список_песен"].NewRow();
rowB["Название_песни"] = this.textBox1.Text;
rowB["Альбом"] = this.comboBox3.Text;
rowB["Исполнитель"] = this.comboBox2.Text;
rowB["Жанр"] = this.comboBox1.Text;
dataSet11.Tables["Список_песен"].Rows.Add(rowB);
sqlDataAdapter1.Update(dataSet11);
Однако в БД между таблицами существуют связи, и в самих таблицах существуют ограничения. Поэтому, чтобы успено добавить запись, нужно заполнить все поля формы, иначе программа сообщит об ошибке. Далее, если пользователь пытается ввести новое значение, которого нет в связанной таблице, то нужно сначала добавить это значение в связанную таблицу. Например, пользователь пытается в таблице «Список_песен» в поле «Альбом» добавить значение, которого нет в связанной таблице «Список_альбомов».
Для обработки подобных ситуаций я использую такой алгоритм:
if
ВСЕ поля НЕпусты
{
try
{
Добавить новую записть в таблицу «Жанр» из поля;
}
Catch (срабатывает, если така запись уже существует)
{
}
try
{
Добавить новую записть в таблицу «Исполнитель» из поля;
}
catch
{
}
try
{
Добавить новую записть в таблицу «Год_выпуска» из поля;
}
catch
{
}
try
{
Добавить новую записть в таблицу «Список_альбомов» из трех полей;
}
catch
{
}
Добавить новую запись в таблицу «Список_песен»;
Очистить все поля;
}
else
MessageBox.Show("Заполните ВСЕ поля");
}
Подобным образом записи добавляются и в другие таблицы.
Редактирование записей в таблицах
В процессе просмотра данных в форме Tables в DataGrid’ах можно редактировать данные. Однако, если просто внести изменения в DataGrid, реальных изменений в самой базе данных не произойдет. Для того, чтобы сохранить изменения, добавляю на форму кнопку editBtn и в обработчике editBtn_Click прописываю такой код:
private void editBtn_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Сохранить изменения в таблицах?", "???", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes)
{
try
{
dataGrid1.DataSource = dataSet11.Tables[0];
sqlDataAdapter1.Update(dataSet11);
dataGrid2.DataSource = dataSet11.Tables[1];
sqlDataAdapter2.Update(dataSet11);
dataGrid3.DataSource = dataSet11.Tables[2];
sqlDataAdapter3.Update(dataSet11);
dataGrid4.DataSource = dataSet11.Tables[3];
sqlDataAdapter4.Update(dataSet11);
dataGrid5.DataSource = dataSet11.Tables[4];
sqlDataAdapter5.Update(dataSet11);
}
catch
{
MessageBox.Show("Проерьте правильность введенных данных.\r\nВозможно, сначала необходимо\r\nдобавить новые данные в базу данных");
}
}
}
Удаление записей из таблиц
Прежде всего, стоит отметить, что, если обработчики кнопок «Добавить запись» и «Обновить записи» действуют сразу для пяти таблиц, то кнопка «Удалить запись» своя для каждой страницы TabControl.
Это вызвано тем, что при щелчке на кнопку удаляется текущая запись таблицы (а она для каждой таблицы установлена по умолчания как первая). Если пользователь пытается удалить связанную запись, программа сообщит об ошибке.
Для удаления записи использую такой код (удаление из первой таблицы):
private void button1_Click(object sender, System.EventArgs e)
{
try
{
CurrencyManager cm = (CurrencyManager)dataGrid1.BindingContext[dataGrid1.DataSource];
if (cm.Count > 0)
if (MessageBox.Show("Удалить текущую строку?", "???", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes)
cm.RemoveAt(cm.Position);
sqlDataAdapter1.Update(dataSet11);
}
catch
{
MessageBox.Show("Ой! Произошла ошибка! Возможно, Вы пытаетесь удалить связанную запись. ");
}
}
Составление и выполнение запросов
Прежде всего, помещаю на форму Query объекты SqlConnection и SqlComand. Также добавляю объекты ComboBox и TextBox. С помощью ComboBox’а пользователь может выбрать готовый запрос, который на языке SQL отобразится в TextBox’е (может понадобиться ввести необходимые параметры) или написать в TextBox’е свой запрос.
Запрос передается на обработку после клика по кнопке «Выполнить запрос» (Name=executeBtn), после чего открывается форма QueryResult c результатом запроса, или выводится сообщение о принятых изменениях.
Если в тексте запроса допущена какая-либо ошибка, приложение выдаст MessageBox c сообщением.
В обработчике executeBtn пишу такой код:
SqlDataReader ds;
if (this.textBox1.Text == "")
{
MessageBox.Show("Введите, пожалуйста, запрос!");
return;
}
SqlConnection sqlConnection1 = new SqlConnection(this.sqlConnection1.ConnectionString);
sqlConnection1.Open();
try
{
SqlCommand comm = new SqlCommand(this.textBox1.Text, sqlConnection1);
ds = comm.ExecuteReader();
}
catch
{
MessageBox.Show("В тексте запроса допущена ошибка! ");
return;
}
QueryResult result = new QueryResult();
result.Prepare(ds);
ds.Close();
result.Show();
this.Visible = false;
}
Форма ResultQuery одержит функцию Prepare():
public void Prepare(SqlDataReader ds)
{
View=ds;
DataTable dt;
int i;
list = new ArrayList(0);
foreach (DbDataRecord d in ds)
{
list.Add(d);
}
this.dataGrid1.DataSource = list;
this.dataGrid1.ReadOnly = true;
this.dataGrid1.AllowSorting = true;
if (ds.RecordsAffected != -1)
MessageBox.Show("Внесены изменения в " + ds.RecordsAffected + " записей");
}
Создание отчетов
В моем приложении есть три отчета: «Информация обо всех композициях», «Информация обо всех исполнителях» и «Информация обо всех альбомах». Я рассмотрю создание отчетов на примере отчета по исполнителям.
Создаю новую форму (Name=RepSongs), и помещаю на нее объект CrystalReportViewer. Кликая на название проекта в Solution Explorer правой кнопкой, выбираю Add New Item ® Add и в открывшемся окне выбираю Crystal Report:
Появляется окно лицензионного соглашения, после чего предлагается выбрать способ создания нового отчета; выбираю пункт As a Blanc Report:
После создания нового отчета слева появляется окно Field Explore, и в нем я выбираю пункт Database Fields ® Database Expert:
В появившемся окне выбираю Create New Connection ® OLE DB (ADO) ® Make New Connection, после чего из списка выбираю Microsoft OLE DB Provider for SQL Server:
В следующем окне задаю имя своего сервера (USER1) и название базы данных и нажимаю «Готово»:
Снова открываю окно Database Expert. Из появившегося списка выбираю те таблицы, которые будут мне нужны при создании отчета:
Если выбрано более одной таблицы, то во вкладке Links следует уточнить связи между таблицами:
После этого можно уже непосредственно составлять отчет.
После составления шаблона отчета, надо подключить его к форме. Для этого добавим в обработчик события загрузки формы следующий код:
private void RepSongs_Load(object sender, EventArgs e)
{
CrystalSingers1 songRep = new CrystalSingers1();
crystalReportViewer1.ReportSource = songRep;
}
Отчет подключен, и теперь при клике на пункт меню Отчеты ® Информация обо всех исполнителях открывается форма, в которой содержится готовый отчет:
Отсюда можно сохранить отчет в различных форматах (.rpt, .pdf, .xls, .doc, .rft), распечатать его или обновить.
Экспорт данных в Excel
При выборе пункта меню Экспорт ® в Excel открывается окно Export, в котором предлагается с помощью флажков выбрать таблицы для экспорта. После нажатия кнопки «Экспорт в Excel» (Name=expExcelBtn) открываются одно или несколько новых приложений Excel с данными в зависимости от количества отмеченных таблиц.
Код обработчика expExcelBtn1_Click выглядит так:
private void expExcelBtn1_Click(object sender, EventArgs e)
{
if (this.checkBox1.Checked == true)
{
Excel.Application excel = new Excel.Application();
int rowIndex = 1;
int colIndex = 0;
excel.Application.Workbooks.Add(true);
DataTable table = GetData();
foreach (DataColumn col in table.Columns)
{
colIndex++;
excel.Cells[1, colIndex] = col.ColumnName;
}
foreach (DataRow row in table.Rows)
{
rowIndex++;
colIndex = 0;
foreach (DataColumn col in table.Columns)
{
colIndex++;
excel.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString();
}
}
excel.Visible = true;
}
if (this.checkBox2.Checked == true)
{
Аналогичный код для таблицы «Список_альбомов», используется GetData1();
}
....................
}
Используемая в обработчике функция GetData() существует в пяти экземплярах (GetData(), GetData1(), GetData2(), GetData3 и GetData4() для каждой из пяти таблиц). Вариант для первой таблицы («Список_песен») выглядит так:
private System.Data.DataTable GetData()
{
try
{
sqlDataAdapter1.Fill(dataSet21, "Список_песен");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
return dataSet21.Tables[0];
}
Разумеется, и в этой форме используются объекты SqlConnection, SqlDataAdapter (5 экземпляров) и DataSet.
Экспорт данных в HTML
Как и при экспорте в Excel, в окне ExportToHtml предлагается выбрать таблицы:
После выбора нужных таблиц и нажатия кнопки внизу формы в корневой директории приложения (в проекте это папка /bin/debug/) создается (или обновляется) файл tables.htm, содержащий выбранные таблицы. Если пользователь не выделил ни одной таблицы, программа сообщает об ошибке.
Файл tables.htm создается путем простого построчного заполнения текстового файла html-дескрипторами. Данные берутся из DataSet, также используется набор функций GetData().
Фрагмент кода представлен ниже:
int i,j;
string name="tables.htm";
FileStream file = new FileStream(name, FileMode.Create);
StreamWriter wr = new StreamWriter(file);
wr.WriteLine("<HTML>");
wr.WriteLine("<HEAD>");
wr.WriteLine("<TITLE>Generated file</TITLE>");
wr.WriteLine("</HEAD>");
wr.WriteLine("<BODY BGCOLOR=#87CEFA TEXT=#0000FF>");
wr.WriteLine("<FONT FACE=Comic Sans MS>");
if (this.checkBox1.Checked == true)
{
DataTable table = GetData();
wr.WriteLine("<CENTER><B>Таблица «" + table.TableName + "»</B></CENTER>");
wr.WriteLine("<BR>");
wr.WriteLine("<CENTER><TABLE cols=" + table.Columns.Count + " cellspacing=1px border=1 BGCOLOR=#B0C4DE>");
for (j = 0; j < table.Columns.Count; j++)
{
wr.WriteLine("<td>");
wr.WriteLine("<B>" + table.Columns[j].ColumnName+"</B>");
wr.WriteLine("</td>");
}
for (i = 0; i < table.Rows.Count; i++)
{
wr.WriteLine("<tr>");
for (j = 0; j < table.Columns.Count; j++)
{
wr.WriteLine("<td>");
wr.WriteLine("" + table.Rows[i][j]);
wr.WriteLine("</td>");
}
wr.WriteLine("</tr>");
}
wr.WriteLine("</TABLE></CENTER>");
}
....................
wr.WriteLine("</FONT>");
wr.WriteLine("</BODY>");
wr.WriteLine("<HTML>");
wr.Flush();
file.Close();
Литература
a) Основная литература:
1.Веллинг,Люк, Томсон, Лора. Разработка Web-приложений с помощью PHP и MySql, 3-е издание.: Пер с англ. –М.: Издательский дом “Вильямс”, 2009. – 880с.: ил.- Парал. тит.англ.
2.Флэнаган Д. JavaScript. Подробное руководство. – Пер. с англ. –СПб: Символ – Плюс, 2009. – 992с., ил.
3.Вержбицкий В.М. Численные методы. Линейная алгебра и нелинейные уравнения: Учеб. пособие для вузов. – М.: ОНИКС 21 век, 2005. – 431 с.
4.Лапчик М.П., Рагулина М.И., Хеннер Е.К. Численные методы. – М.: ACADEMA, 2009. – 384 с.
б) Дополнительная литература:
Самарский А.А. и др. Введение в численные методы. – СПб.: Лань, 2009. –