Главная страница

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


Скачать 7.39 Mb.
НазваниеСправочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги
Анкорлекция
Дата13.04.2023
Размер7.39 Mb.
Формат файлаdoc
Имя файлаЗиборов.doc
ТипСправочник
#1060897
страница14 из 31
1   ...   10   11   12   13   14   15   16   17   ...   31

Листинг 10.1. Чтение всех записей из таблицы БД MS Access и вывод их на консоль

//Программа читает все записи из таблицы БД MS Access и выводит их

//на консоль с помощью объектов Command и DataReader

using System;

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

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




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

namespace БДDataReader1

{

class Program

{

static void Main(string[] args)

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

var Подключение = new ОлеДиБи. OleDbConnectionC'Data Source=\"C:\\vic.mdb\" ,-User " +

" ID=Admin; Provider=\ "Microsoft. Jet -OLEDB. 4 . 0 \";") ;

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

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

var Команда = new ОлеДиБи.OleDbCommand("Select * From [БД телефонов]", Подключение);

// Выбрать все записи и сортировать их по колонке "ФИО":

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

// "Select * From [БД телефонов] order by ФИО", Подключение);

// Аналогично по колонке "Номер п/п": '

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

// "Select * From [БД телефонов] ORDER BY 'Номер п/п'",

// Подключение);

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

ОлеДиБи.OleDbDataReader Читатель = Команда. ExecuteReader(System.Data.CommandBehavior.CloseConnection);

Console.WriteLine("Таблица БД:\n");

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

// Цикл, пока не будут прочитаны все записи.

// Читатель.FieldCount - .кол-во полей в строке.

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

// Минус прижимает строку влево:

Console.WriteLine("{0,-3) {1,-15} {2,-15}", Читатель.GetValue(0) Читатель.GetValue(1), Читатель.GetValue(2) ) ;

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

// Приостановить выполнение программы до нажатия какой-нибудь клавиш

Console.ReadKey();

}

}

}

Как видно, вначале создаем объект Подключение класса Сonnection и передаем ему строку подключения. В строке подключения полный доступ к mdb-файлу заключен в двойные кавычки. Это сделано для того, чтобы корректно читались длинные имена папок и файлов, содержащие пробелы.

Далее создаем объект класса Сommand и передаем ему простейшую SQL-команду:

Select * From [БД телефонов]

То есть выбрать все записи из таблицы [БД телефонов]. Название таблицы в SQL-запросе заключено в квадратные скобки из-за пробела в имени таблицы. За­метьте, что в комментарии указаны возможные варианты SQL-запроса: сортиро­вать записи по колонке ФИО (order by фио) и по колонке Номер п/п (order by ‘Номер п/п' ).

Затем, используя объект класса DataReader, выполняем SQL-команду. Далее в цикле построчно читаем таблицу базы данных. При работе DataReader в памяти хранится только одна строка (запись) данных. Объект класса DataReader имеет бу­леву функцию Read, которая возвращает true, если существует следующая строка данных, и false, если такие строки (записи) уже исчерпались. Причем с помощью DataReader невозможно заранее узнать количество записей в таблице.

Результат работы программы показан на рис. 10.10.



Рис. 10.10. Отображение таблицы базы данных на консоли

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

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

Пример 68. Создание базы данных MS Access в программном коде

Создадим программу, которая во время своей работы создает базу данных Access, т. е. файл new_BD.mdb. Эта база данных будет пустой, т. е. она не будет содержать ни одной таблицы. Наполнять базу данных таблицами можно впоследствии как из программного кода Visual C# 2010, так и используя MS Access. Заметим, что в этом примере технология ADO.NET не использована.

Запускаем Visual Studio 2010 (загрузочный модуль devenv.exe), щелкаем пункт меню меню New Project и выбираем шаблон Console Application С#. Для добавления в наш проект DLL-библиотеки ADOX выполним следующее. В пункте меню Project выберем команду Add Reference, затем на вкладке СОМ дважды щелкнем ссылке Microsoft ADO Ext. 2.8 for DDL and Security, тем самым мы добавляем библиотеку в текущий проект. Убедиться в том, что теперь существует ссылка эту библиотеку, можно в окне Solution Explorer. Здесь, щелкнув на узле References, увидим ветвь ADOX. Теперь мы можем ссылаться на это имя в программном коде. Далее вводим программный код, приведенный в листинге 10.2.

Листинг 10.2. Создание БД во время работы программы

// Программа создает базу данных MS Access, т. е. файл new_BD.mdb.

// Эта база данных будет пустой, т. е. не будет содержать ни одной таблицы.

// Наполнять базу данных таблицами можно будет впоследствии

// как из программного кода С# 2010, так и используя MS Access.

// В этом примере технология ADO.NET не использована

using System.Windows.Forms; // - добавили эту директиву для MessageBox

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

namespace БДСоздание

{ // Для добавления ADOX: Project | Add Reference, на вкладке СОМ выбрать

// Microsoft ADO Ext. 2.8 for DDL and Security

class Program

{

static void Main(string[] args)

{

ADOX.Catalog Каталог = new ADOX.Catalog));

try

{

Каталог.Create("Provider=Microsoft.Jet." + "OLEDB.4.0;Data Source=C:\\new_BD.mdb");

MessageBox.Show("База данных С:\\new_BD.mdb успешно создана");

}

catch (System.Runtime.InteropServices.COMException Ex)

{ MessageBox.Show(Ex.Message); }

finally

{ Каталог = null; }

}

}

}

Далее чтобы во время выполнения программы не появлялось черное окно DOS, в пунктах меню Project | ConsoleApplicationl Properties на вкладке Application в скрывающемся списке Application type выберем Windows Forms Application. Чтобы был доступен объект MessageBox для вывода сообщений, добавим в проект еще одну DLL-библиотеку. Для этого, как и в предыдущем случае, укажем пункты меню Project | Add Reference и на вкладке .NET дважды щелкнем по ссылке System.Windows.Forms.dll, а в тексте программы добавим директиву:

using System.Windows.Forms;

Ключевое слово using используется для импортирования пространства имен, которое содержит класс MessageBox.

Программа работает следующим образом: создаем экземпляр класса ADOX.catalog, одна из его функций Create способна создавать базу данных, если на ее вход подать строку подключения. Заметим, что в строку подключения входит также и полный путь к создаваемой БД. Функция Create заключена в блоки try...catch, которые обрабатывают исключительные ситуации. После запуска этого приложения получим сообщение о создании базы данных (рис. 10.11).

Если же тут же запустим наше приложение еще раз, то получим сообщение о том, что такая база данных уже существует (рис. 10.12), поскольку БД new_BD.mdb только что создана.



Рис. 10.11. Сообщение о создании базы данных Рис. 10.12. База данных существует

Данное сообщение генерировалось обработчиком исключительной ситуации. Программный код этой программы можно посмотреть, открыв решение БДСоздание.sln в папке БДСоздание.

Пример 69. Запись структуры таблицы в пустую базу данных MS Access. Программная реализация подключения к БД

Теперь здесь и далее мы используем только самую современную технологию ADO .NET. Создадим программу, которая записывает структуру таблицы, т. е. "папку" таблицы, в существующую БД. В этой БД может еще не быть ни одной таблицы, т. е. БД может быть пустой. Либо в БД могут уже быть таблицы, но название новой таблицы должно быть уникальным.

Создадим базу данных new_BD.mdb в корневом каталоге логического диска С:, используя MS Access или программным путем, как это было показано в предыдущем разделе. Никакие таблицы в базе данных создавать не станем, т. е. будем иметь пустую БД. Теперь запустим Visual Studio 2010, затем выберем пункт меню New Project. Далее, поскольку для этого приложения нам не нужна экранная форма с ее элементами управления, укажем среди шаблонов Console Application С#. За напишем программный код, представленный в листинге 10.3.

Листинг 10.3. Создание таблицы в БД MS Access

// Программа записывает структуру таблицы в пустую базу, данных MS Access.

// Программная реализация подключения к БД. В этой БД может

// еще не быть ни одной таблицы, т. е. БД может быть пустой. Либо в БД

// могут уже быть таблицы, но название новой таблицы должно быть уникальным

using System;

using System.Windows.Forms; // - добавили эту директиву для MessageBox
// Добавляем эту директиву для краткости выражений:

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

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

namespace БдСоздТаблицы

{ // ЗАПИСЬ СТРУКТУРЫ ТАБЛИЦЫ В ПУСТУЮ БД:

class Program

{

static void Main(string[] args)

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

var Подключение = new ОлеДиБи.OleDbConnection(

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\new_BD.mdb");

// Открытие подключения:

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

// Создание экземпляра объекта класса Command с заданием SQL-запроса:

var Команда = new ОлеДиБи.OleDbCommand("CREATE TABLE [" +

"БД телефонов] ([Номер п/п] counter, [ФИО] ch" + "аг(20), [Номер телефона] char(20))", Подключение);

try // Выполнение команды SQL:

{

Команда. ExecuteNonQuery ();

MessageBox.Show("Структура таблицы 'БД телефонов' записана пустую БД");

}

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

{ MessageBox.Show(Ситуация.Message); }

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

}

}

}

Чтобы работала функция MessageBox. Show, следует в текущий проект добавить ссылку на DLL-библиотеку. Для этого в пункте меню Project выберем команду Аdd Reference и на вкладке .NET дважды щелкнем на ссылке System.Windows.Forms.dll. Кроме того, используя пункты меню Project | ConsoleApplicationl Properties, на появившейся вкладке Application в раскрывающемся спи­ске Application type выберем тип приложения Windows Forms Application.

Как видно из текста программы, вначале создаем экземпляр класса Connection с указанием строки подключения. Теперь мы имеем возможность управлять этой строкой программно. Далее создаем экземпляр класса Command с заданием SQL-запроса. В этом запросе создаем (create) новую таблицу с именем БД телефонов с тремя полями: Номер п/п типа счетчик (counter), ФИО и Номер телефона. Здесь имя таблицы и имена полей заключены в квадратные скобки, поскольку они со­держат пробелы.

Чтобы выполнить эту SQL-команду, вызываем метод ExecuteNonQuery, кото­рый заключим в блоки try. . .catch для обработки исключительных ситуаций. Ес­ли SQL-запрос благополучно выполнился, то получаем сообщение: "Структура таблицы 'БД телефонов' записана в пустую БД". А если, например, таблица с таким именем уже имеется в базе данных, то управление передается блоку catch (пере­хват исключительной ситуации), и мы получаем сообщение о том, что такая табли­ца базы данных уже существует (рис. 10.13).



Рис. 10.13. Сообщение о существовании таблицы

Таким образом, в данной программе сначала организовано подключение Connection к БД через строку подключения и открытие подключения Open. Затем задание SQL-запроса в объекте Сommand и выполнение запроса функцией ExecuteNonQuery. Если связывание данных организовать программно, то добива­йся более высокой гибкости, когда, например, на стадии разработки неизвестно заранее, где (на каком диске, в какой папке) будет находиться БД.

Убедиться в работоспособности программы можно, открыв решение БдСоздТаблицы.slп в папке БдСоздТаблицы.

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

Совсем маленькую программу из предыдущего раздела можно использовать для выполнения любого запроса к базе данных. Например, модифицируем всего лишь одну строчку программного кода программы из предыдущего примера для добавления новой записи в таблицу БД. Для этого при создании экземпляра объекте Соmmand зададим SQL-запрос на вставку (insert) новой записи в таблицу БД.

Заметим, что в SQL-запросе мы сознательно обратились к таблице по имени [ бд телефонов], т. е. со строчной буквы, хотя надо с прописной. Дело в том, что в именах таблиц следует точно указывать регистр символа, поскольку их поиск ведется с учетом регистра (case-sensitive search). Однако это не обязательно при на­личии только одной таблицы с таким именем, поскольку при этом используется поиск без учета регистра (case-insensitive search).

Свойству Сonnection объекта класса Сommand следует дать ссылку на объект класса Сonnection:

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

Причем для добавления записи в таблицу БД такая ссылка обязательна в отличие предыдущего примера, где мы создавали новую таблицу в существующей БД. Программный код будет выглядеть так, как представлено в листинге 10.4.

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

//Программа добавляет запись в таблицу базы данных MS Access. Для этого

//при создании экземпляра объекта Command задаем SQL-запрос

//на вставку (Insert) новой записи в таблицу базы данных

using System.Windows.Forms; // - добавили эту директиву для MessageBox

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

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

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

namespace БдДобавлЗаписи

{

class Program

{ // ДОБАВЛЕНИЕ ЗАПИСИ В ТАБЛИЦУ БД:

static void Main(string[] args)

{ // Создание экземпляра объекта Connection

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

var Подключение = new ОлеДиБи.OleDbConnection(

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\new_BD.mdb");

// Открытие подключения:

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

// Создание экземпляра объекта Command с заданием SQL-запроса:

var Команда = new ОлеДиБи.OleDbCommand( "INSERT INTO [бд телефонов] (" +

"Фио, [номер телефона]) VALUES ('Света-Х', '521-61-41')");

// Для добавления записи в таблицу БД эта команда обязательна:

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

// Выполнение команды SQL:

Команда. ExecuteNonQuery () ;

MessageBox.Show("В таблицу 'БД телефонов' добавлена запись");

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

}

}

}

Часто, отлаживая программный код на Visual Studio С#, при работе с БД появ­ляется необходимость проверки работы программы, например, создалась ли таб­лица в БД, добавилась ли запись в таблице БД, правильно ли сформирован 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.



Рис. 10.17. Фрагмент работы программы обновления данных

Представляет интерес программирование модификации записей базы данных. Эта возможность запрограммирована при обработке события "щелчок мышью на кнопке" Сохранить в БД. Здесь свойству CommandText присвоено значение текста SQL-запроса. В качестве заменителей параметров используются вопросительные знаки. Как видно, в данном SQL-запросе имеют место три вопросительных знака. Им соответствуют три параметра, которые должны указываться именно в порядке следования вопросительных знаков. Эти параметры задаем с использованием мето­да COMMAND.Parameters. Add. Здесь указываем имя поля (например, "Номер телефо­на", тип, длину параметра и значение по умолчанию. Заметим, что третий параметр ("Номер п/п") задается как новый, поскольку он не должен подлежать редактированию со стороны пользователя, а устанавливаться автоматически, независимо от пользователя.

Далее в блоке try. . .catch вызываем непосредственно метод Update, который возвращает количество (kol) обновленных записей. В случае неудачного обновления обрабатывается исключительная ситуация Exception, объект Exception обеспечивает соответствующее сообщение о недоразумении.

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

Пример 74. Удаление записей из таблицы базы данных с использованием SQL-запроса и объекта класса Command

Можно также удалять записи (строки из таблицы БД), формируя в программ соде соответствующий SQL-запрос, передаваемый в объект класса Сommand, но объект Сommand — обеспечивает привязку SQL-выражения к соединению с базой данных. Напишем самый простой пример такой программы, для этого запустим Visual Studio 2010 и закажем новый проект New Project. В данном случае экранная форма нам не нужна, поэтому выберем, как и в некоторых предыдущих примерах, шаблон Console Application С#. Для того чтобы во время выполнения данной программы не видеть черного DOS-экрана, в меню Project выберем команду ConsoleApplication1 Properties и на вкладке Application укажем в раскрывающемся списке Application type тип приложения Windows s Application. Чтобы иметь доступ к функции MessageBox.Show, добавим к проекту ссылку на динамическую библиотеку Forms.dll. Для этого выберем пункты Project | Add Reference и на вкладке .NET дважды щелкнем по ссылке на библиотеку System.Windows.Forms.dll. Отметим, что при этом в окне Sulution Explorer среди ссылок References появится соответствующая этой библиотеке ссылка.

Далее напишем программный код из листинга 10.8.

Листинг10.8. Удаление записей из таблицы БД

//Программа удаляет запись из таблицы БД с использованием SQL-запроса и обьекта класса Command

System.Windows.Forms; // - добавили эту директиву для MessageBox

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

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

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

namespасе БдУдаленЗаписи

{

class Program

{

static void Main(string[] args)

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

var Подключение = new ОлеДиБи.

OleDbConnection( // Строка подключения:

"Data Source=\"C:\\vic.mdb\";User " +

"ID=Admin;Provider=\"Microsoft.Jet.OLEDB.4.0\";");

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

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

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

"Delete * From [БД телефонов] Where " + "ФИО Like 'Vi%'", Подключение);

// Выполнение команды SQL

int i = Команда. ExecuteNonQuery ();

// i - количество удаленных записей

if (i > 0) MessageBox.Show(

"Записи, содержащие в поле ФИО фрагмент 'Vi*', удалены");

if (i == 0) MessageBox.Show(

"Запись, содержащая в поле ФИО фрагмент 'Vi*', не найдена");

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

}

}

)

Здесь при создании объекта класса Command задан SQL-запрос на удаление (Delete) всех записей, содержащий в поле ФИО фрагмент текста "Vi*", причем строчные и прописные буквы являются равнозначными, т. е. будут удалены записи, содержащие "Vi*", "vi*", "VI*" и прочие комбинации. Таким образом, поиск записей ведется без учета регистра (case-insensitive search).

Замечу, что здесь для выполнения команды SQL использован метод ExecuteNonQuery. Он возвращает в переменную i количество удаленных записей. Если i = 0, значит, записи с таким контекстом не найдены и ни одна запись не удалена.

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

1   ...   10   11   12   13   14   15   16   17   ...   31


написать администратору сайта