Файл: Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.01.2024

Просмотров: 954

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
программы, например, создалась ли таб­лица в БД, добавилась ли запись в таблице БД, правильно ли сформирован SQL-запрос. Не обязательно запускать MS Access, чтобы выполнить SQL-запрос или проверить правильность его синтаксиса. Это можно сделать в среде Visual Studio. Для этого в пункте меню View выбираем команду Server Explorer (Обозреватель баз данных), далее в списке подключений указываем полный путь к нужной БД. Затем, щелкая правой кнопкой мыши на значке нужной таблицы, в контекстном меню выбираем пункт Retrieve Data. При этом в панели инструментов (Toolbar) появляется значок SQL, после щелчка по этому значку (или нажатия комбинации клавиш <Ctrl>+<3>) получим окно SQL-запроса. В этом окне мы можем задавать SQL-запрос, а затем, например, щелкая правой кнопкой мыши, либо проверять его синтаксис, либо выполнять.

Убедиться в работоспособности программы можно, открыв решение БдДобавлЗаписи.sln в папке БдДобавлЗаписи.

Пример 71. Чтение всех записей из таблицы базы данных с помощью объектов классов Command, DataReaderи элемента управления DataGridView

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

Для решения этой задачи запустим Visual Studio 2010, закажем новый проект New Project шаблона Windows Forms Application С#. Из панели Toolbox добавим в проектируемую форму элемент управления DataGridView и растянем его на всю форму. На вкладке Forml.cs напишем программный код, представленный в листинге 10.5. С'

Листинг 10.5. Чтение всех записей из таблицы БД

// Программа читает все записи из таблицы базы данных с помощью объектов

// Сommand, DataReader и элемента управления DataGridView

using System;

using System.Data;

using System. Windows. Forms ;

// Добавляем эту директиву для краткости выражений:

using ОлеДиБи = System.Data.OleDb;

// Другие директивы using удалены, поскольку они не используются в данной программе

nfmespace BnReaderGridView

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

// Создаем объект Connection и передаем ему строку подключения:

var Подключение = new ОлеДиБи.OleDbConnection( "Data Source=\"C:\\vic.mdb\";User " + "ID=Admin;Provider=\"Microsoft.Jet.OLEDB.4.0\";");

Подключение.Open();

// Создаем объект Command, передавая ему SQL-команду

ОлеДиБи.OleDbCommand Команда = new ОлеДиБи.

OleDbCommand("Select * From [БД телефонов]", Подключение);


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

ОлеДиБи.OleDbDataReader Читатель = Команда.

ExecuteReader(); // (CommandBehavior.CloseConnection)

DataTable Таблица = new DataTable();

// Заполнение "шапки" таблицы

Таблица.Columns.Add(Читатель.GetName(0));

Таблица.Columns.Add(Читатель.GetName(1) );

Таблица.Columns.Add(Читатель.GetName(2) ) ;

while (Читатель.Read() == true)

// Заполнение клеток (ячеек) таблицы

Таблица.Rows.Add(new object[] {Читатель.GetValue(0), Читатель.GetValue(1), Читатель.GetValue(2)});

// Здесь три поля: 0, 1 и 2

Читатель.Close(); Подключение.Close();

dataGridViewl.DataSource = Таблица;

}

}

}

Как видно из программы, она очень похожа на предыдущую. После выполне­ния SQL-команды создаем объект DataTable, который в конце программного кода задаем как источник (DataSource) для сетки данных dataGridView1. Заполняем "шапку" таблицы, т. е. названия колонок, методом Add.

Далее, как и в предыдущей программе, в цикле While заполняем ячейки табли­цы. Фрагмент работы программы показан на рис. 10.14.



Рис. 10.14. Отображение таблицы базы данных на элементе DataGridView

В этой таблице мы можем сортировать записи по любой из колонок, щелкая мышью на названиях соответствующих колонок. Можем редактировать (изме­нять) содержание ячеек, но в базу данных эти изменения не попадут (сохранения не будет).

Одно из ключевых преимуществ использования объекта DataReader — это его скорость и небольшое использование памяти. Однако применение циклического считывания данных сводит эти преимущества на нет. Убедиться в работоспособности программы можно, открыв решение БдReaderGridView.sln в папке БдReaderGridView.

Пример 72. Чтение данных из БД в сетку данных DataGridViewс использованием объектов классов Command, Adapterи DataSet

Рассмотрим пример чтения таблицы с помощью объекта Adapter из базы данных посредством выбора нужных данных и передачи их объекту DataSet. Очень удобно прочитать таблицу, записанную в DataSet, используя элемент управления DataGridView (сетка данных, т. е. таблица данных), указав в качестве источника данных для сетки DataGridView объект класса DataSet.

Поскольку нам нужен элемент управления DataGridView, мы создаем новый проект с экранной формой. Для этого, как обычно, запускаем Visual Studio 2010, заказываем новый проект New Project шаблона Windows Forms Application C#. Из панели Toolbox добавляем в форму элемент управления DataGridView растягиваем его на всю форму, как показано на рис. 10.15.





Рис. 10.15. Проектирование экранной формы

Далее пишем программный код, представленный в листинге 10.6.

Листинг 10.6. Чтение данных из БД в сетку данных DataGridView

//Программа читает из БД таблицу в сетку данных DataGridView
//с использованием объектов класса Command, Adapter и DataSet
using System.Data;

using System.Windows.Forms;

// Добавляем эту директиву для краткости выражений:

using ОлеДиБи = System.Data.OleDb;

// Другие директивы using удалены, поскольку они не используются в данной программе

namespace БдАдаптepGridView

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

this.Text = "Чтение таблицы из БД:";

var Подключение = new ОлеДиБи.OleDbConnection( "Data Source=\"C:\\vic.mdb\";User " + "ID=Admin;Provider=\"Microsoft.Jet.OLEDB.4.0\";");

Подключение.Open();

var Команда = new ОлеДиБи.OleDbCommand("Select * From [БД-телефонов]", Подключение);
// var Команда = new ОлеДиБи.01eDbCommand("SELECT * FRO" +
// "M [БД телефонов] WHERE (фио LIKE 'м%')", Подключение);

// Создаем объект Adapter и выполняем SQL-запрос

var Адаптер = new ОлеДиБи.OleDbDataAdapter(Команда);

// Создаем объект класса DataSet

DataSet НаборДанных = new DataSet();

// Заполняем DataSet результатом SQL-запроса

Адаптер.Fill(НаборДанных, "БД телефонов");

// Содержимое DataSet в виде строки XML для отладки:

string CтpoкaXML = НаборДанных.GetXml();

// Указываем источник данных для сетки данных:

dataGridViewl.DataSource = НаборДанных;

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

dataGridViewl.DataMember = "БД телефонов";

Подключение.Close();

}

}

}

Как видно из текста программы, вначале создаем объект класса Connection, передавая строку подключения. Затем, создавая объект класса Сommand, задаем SQL - команду выбора всех записей из таблицы БД телефонов. Здесь мы можем задать любую SQL-команду, в комментарии приведен пример такой команды, которая содержит select и like: выбрать из таблицы БД телефонов только записи, в которых поле ФИО начинается на "м". Оператор like используется для поиска по шаблону (pattern matching) вместе с символами универсальной подстановки (метасимволами) "звездочка" (*) и "знак вопроса" (?). Строка шаблона заключена в одиночные кавычки. Заметим также, что большинство баз данных использует символ "%" вместо значка "*" в like -выражениях.

Далее при создании объекта класса Adapter выполняем SQL-команду и при выполнении метода Fill заполняем объект класса
DataSet таблицей, полученной в результате SQL-запроса. Затем указываем в качестве источника данных для сетки данных dataGridView1 объект класса DataSet. Этого оказывается достаточно вывода на экран результатов SQL-запроса (рис. 10.16).



Рис. 10.16. Вывод результата SQL-запроса

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

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

Убедиться в работоспособности программы можно, открыв решение БдАдаптерGridView.sln в папке БдАдаптерGridView.

Пример 73. Обновление записей в таблице базы данных MS Access

Одним из четырех действий над данными в БД(Select, Insert, Update и Delete) является модификация (Update, обновление) данных. Автор поставил задачу написать маленькую программу для обновления записей в таблице базы данных, но с большим удобством (гибкостью) управления программным кодом.

Рассматриваемая в данном примере программа имеет форму, сетку данных —DataGridView, в которую из базы данных читается таблица при нажатии кнопки Читать из БД. Пользователь имеет возможность редактировать данные в этой таблице, после чего, нажав кнопку Сохранить в БД, данные в базе данных будут модифицированы, т. е. заменены новыми.

Для написания этой программы запускаем Visual Studio 2010, заказываем но­вый проект New Project шаблона Windows Forms Application C#. Из панели Toolbox добавляем в форму элемент управления DataGridView и две командные кнопки. Программный код программы представлен в листинге 10.7.

Листинг 10.7. Обновление записей в таблице базы данных MS Access

// Программа обновляет записи (Update) в таблице базы данных MS Access

using System;

using System.Data;

using System. Windows . Forms ;

// Добавляем эту директиву для краткости выражений:

using ОлеДиБи = System.Data.OleDb;

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

namespace БдUpdate

{

public partial class Form1 : Form


{

DataSet НаборДанных;

ОлеДиБи.OleDbDataAdapter Адаптер;

ОлеДиБи.OleDbConnection Подключение = new ОлеДиБи. 01eDbConnection( // Строка подключения:

"Data Source=\"C:\\vic.mdb\";User " + "ID=Admin;Provider=\"Microsoft.Jet.OLEDB.4.0\";");

ОлеДиБи.OleDbCommand Команда = new ОлеДиБи.OleDbCommand();

public Form1()

{

InitializeComponent();

Button1.Text = "Читать из БД"; button1.Tablndex = 0;

button2.Text = "Сохранить в БД";

}

private void button1_Click(object sender, System.EventArgs e)

{ // Читать из БД:

НаборДанных = new DataSet();

if (Подключение.State == ConnectionState.Closed) Подключение.Open();

Адаптер = new ОлеДиБи. OleDbDataAdapter ( "Select * From [БД телефонов]", Подключение);

// Заполняем DataSet результатом SQL-запроса

Адаптер.Fill(НаборДанных, "БД телефонов");

// Содержимое DataSet в виде строки XML для отладки:

string СтрокаХML = НаборДанных.GetXml();

// Указываем источник данных для сетки данных:

dataGridView1.DataSource = НаборДанных;

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

dataGridView1.DataMember = "БД телефонов";

Подключение.Close();

}

private void button2_Click(object sender, System.EventArgs e)

{ // Сохранить в базе данных

Команда.CommandText = "UPDATE [БД телефонов] SET [Ho" +

"мер телефона] = ?, ФИО = ? WHERE ([Номер п/п] = ?)";

// Имя, тип и длина параметра

Команда.Parameters.Add("Номер телефона", ОлеДиБи.OleDbType.VarWChar,

50, "Номер телефона");

Команда.Parameters.Add("ФИО", ОлеДиБи.OleDbType.VarWChar, 50, "ФИО");

Команда. Parameters. Add (new ОлеДиБи.OleDbParameter("Original_HoMep_n_n", ОлеДиБи.OleDbType.Integer, 0, System.Data.ParameterDirection. Input, false, (byte)0, (byte)0, "Номер п/п", System.Data.DataRowVersion.Original, null));

Адаптер.UpdateCommand = Команда;

Команда.Connection = Подключение;

try

{ // Update возвращает количество измененных строк

int kol = Адаптер.Update(НаборДанных, "БД телефонов"); MessageBox.Show("Обновлено " + kol + " записей");

}

catch (Exception Ситуация)

{ MessageBox.Show(Ситуация.Message, "Недоразумение"); }

}

}

}

Как видно, мы имеем две процедуры обработки событий: щелчок на кнопке Читать из БД и щелчок на кнопке Сохранить в БД. Чтобы объекты классов DataSet, DataAdapter, Connection и Command были видны в этих трех процедурах, объявляем эти объекты внешними внутри класса Form1.

При программировании чтения из базы данных вначале с помощью SQL-запpoca мы выбрали все записи из таблицы (Select * From [БД телефонов]) и с помощью объекта класса Adapter поместили в набор данных DataSet. А затем указали объект класса DataSet в качестве источника (DataSource) для сетки данных DataGridview1. Фрагмент работы программы после чтения из базы данных пред­ставлен на рис. 10.17.