1. Вводная часть в этой работе будет рассмотрена работа с базами данных - polpoz.ru o_O
Главная
Поиск по ключевым словам:
страница 1страница 2
Похожие работы
1. Вводная часть в этой работе будет рассмотрена работа с базами данных - страница №1/2

Лабораторная работа № 10: Работа с базами данных XML и OLE
Содержание


  1. Вводная часть

  2. Создание приложения Windows Forms

  3. Модификация приложения Windows Forms: ODBC

  4. Модификация приложения Windows Forms: OLE

  5. Модификация приложения Windows Forms: XML

  6. Завершающая часть

  7. О приложении к Лабораторной работе № 10


1. Вводная часть
В этой работе будет рассмотрена работа с базами данных. А именно с текстовыми файлами *.xml и языком расширяемой разметки (от англ. eXtensible Markup Language – расширяемый язык разметки) XML, а также ADO.NET (ActiveX Data Objects .NET) и один из провайдеров данных ADO.NET: в частности OLE (Object Linking and Embedding) и ODBC (Open Database Connectivity).

По данной тематике (работе с базами данных в C#) на данный момент существует достаточное количество материалов, как в печатном издании, так и в сети Интернет (различных статей и курсов). В данной работе будут рассмотрены лишь основные обобщённые моменты работы с базами данных (через ODBC, OLE и XML).
Что такое ADO.NET?
ActiveX Data Objects .NET является набором классов, реализующих программные интерфейсы для облегчения подключения к базам данных из приложения независимо от особенностей реализации конкретной системы управления базами данных и от структуры самой базы данных, а также независимо от места расположения этой самой базы — в частности, в распределенной среде (клиент-серверное приложение) на стороне сервера.
ADO.NET широко используется совместно с технологией web-программирования с использованием объектов ASP.NET для доступа к расположенным на сервере базам данных со стороны клиента.

В ADO.NET используется доступ к отсоединенным данным. При этом соединение устанавливается лишь на то время, которое необходимо для проведения определенной операции над базой данных.

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

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

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

ADO.NET поддерживает следующие типа источников данных:




Имя провайдера

API-префикс

Описание источника данных

ODBC Data Provider

Odbc

Источники данных с ODBC-интерфейсом. Устаревший провайдер.

OleDb Data Provider

OleDb

Источники данных с OleDb-интерфейсом, для Access или Excel.

Oracle Data Provider

Oracle

Для баз данных Oracle.

SQL Data Provider

Sql

Для работы с Microsoft SQL Server.

Borland Data Provider

Bdp

Общий доступ к множеству баз данных, таких как Interbase, SQL Server, IBM DB2, и Oracle.

Нас пока интересует только ODBC и собственно OLE.


Что такое ODBC?
ODBC — это программный интерфейс (API) доступа к базам данных, разработанный фирмой Microsoft, в сотрудничестве с Simba Technologies на основе спецификаций Call Level Interface (CLI), который разрабатывался организациями SQL Access Group, X/Open и Microsoft. Впоследствии CLI был стандартизован ISO ISO/IEC 9075-3:2003. Стандарт CLI призван унифицировать программное взаимодействие с СУБД, сделать его независимым от поставщика СУБД и программно-аппаратной платформы.
В начале 1990 г. существовало несколько поставщиков баз данных, каждый из которых имел собственный интерфейс. Если приложению было необходимо общаться с несколькими источниками данных, для взаимодействия с каждой из баз данных было необходимо написать свой код. Для решения возникшей проблемы Microsoft и ряд других компаний создали стандартный интерфейс для получения и отправки источникам данных различных типов. Этот интерфейс был назван Open Database Connectivity, или открытый механизм взаимодействия с базами данных.
C помощью ODBC прикладные программисты могли разрабатывать приложения для использования одного интерфейса доступа к данным, не беспокоясь о тонкостях взаимодействия с несколькими источниками.

Это достигается благодаря тому, что поставщики различных баз данных создают драйверы, реализующие конкретное наполнение стандартных функций из ODBC API с учётом особенностей их продукта. Приложения используют эти функции, реализованные в соответствующем конкретному источнику данных драйвере, для унифицированного доступа к различным источникам данных.


MFC (Microsoft Foundation Classes, библиотека на языке С++, Microsoft) усовершенствовала ODBC для разработчиков приложений. Истинный интерфейс ODBC является обычным процедурным API. Вместо создания простой оболочки процедурного API разработчики MFC создали набор абстрактных классов, представляющих логические сущности в базе данных.
Что такое OLE?
OLE (произносится как oh-lay [олэй]) — технология связывания и внедрения объектов в другие документы и объекты, разработанная корпорацией Майкрософт.
В 1996 году Microsoft переименовала технологию в ActiveX.
OLE позволяет передавать часть работы от одной программы редактирования к другой и возвращать результаты назад. Например, установленная на персональном компьютере издательская система может послать некий текст на обработку в текстовый редактор, либо некоторое изображение в редактор изображений с помощью OLE-технологии.
Основное преимущество использования OLE (кроме уменьшения размера файла) в том, что она позволяет создать главный файл, картотеку функций, к которой обращается программа. Этот файл может оперировать данными из исходной программы, которые после обработки возвращаются в исходный документ.
OLE используется при обработке составных документов (compound documents), может быть использована при передаче данных между различными несвязанными между собой системами посредством интерфейса переноса (drag-and-drop), а также при выполнении операций с буфером обмена. Идея внедрения широко используется при работе с мультимедийным содержанием на веб-страницах (пример — Веб-ТВ), где используется передача изображения, звука, видео, анимации в страницах HTML (язык гипертекстовой разметки) либо в других файлах, также использующих текстовую разметку (например, XML и SGML). Однако, технология OLE использует архитектуру «толстого клиента», то есть сетевой ПК с избыточными вычислительными ресурсами. Это означает, что тип файла либо программа, которую пытаются внедрить, должна присутствовать на машине клиента. Например, если OLE оперирует таблицами Microsoft Excel, то программа Excel должна быть инсталлирована на машине пользователя.
Что такое XML?
XML (произносится [экс-эм-э́л]) — рекомендованный Консорциумом Всемирной паутины (W3C) язык разметки, фактически представляющий собой свод общих синтаксических правил. XML — текстовый формат, предназначенный для хранения структурированных данных (взамен существующих файлов баз данных), для обмена информацией между программами, а также для создания на его основе более специализированных языков разметки (например, XHTML). XML является упрощённым подмножеством языка SGML. Подробнее об XML будет рассказано ниже.
Что будет представлять собой приложение, разрабатываемое в данной работе?
Приложение будет представлять собой окно Windows Forms, поделённое на группы элементов, в каждой группе будут располагаться элементы управления для работы с той или иной задачей и базой данных.
2. Создание приложения Windows Forms
Запускаем Visual Studio 2010, откроется Начальная страница:
Для начала, надо создать проект, для этого выполним последовательно: Файл -> Создать -> Проект… (также можно просто нажать сочетание клавиш Ctrl+Shift+N или пункт «Создать проект…» на Начальной странице):

Рис. 2. 1. Создание нового проекта


Выберем слева в пункте Установленные шаблоны язык Visual C#, далее найдём в списке Приложение Windows Forms. Также здесь можно выбрать какой использовать «фреймворк» (набора компонентов для написания программ). В нашем случае выберем .NET Framework 4.

Рис. 2. 2. Окно создания нового проекта


В поле Имя вводим LWP10DB это название программы (выбрано по названию лабораторного практикума, номеру и названию работы). В поле Расположение указана конечная директория, где будет находиться весь проект. Выберем расположение удобное для быстрого поиска. В поле Имя решения вводится либо название программы «по умолчанию» из поля Имя автоматически, либо можно ввести своё собственное. Под этим именем будет создана конечная папка проекта (если Имя и Имя решения разные).

Рис. 2. 3. Вводим данные нового проекта приложения Windows Forms


После нажатия клавиши ОК мы увидим сформированный проект и исходный код приложения Windows Forms (не пустого изначально).

Рис. 2. 4. Обозреватель решений: состав проекта приложения Windows Forms сформированного средой разработки


Теперь, можно откомпилировать созданную программу, нажав клавишу F5 (Отладка -> Начать отладку или нажав на иконку . Тем самым мы запускаем приложение в режиме отладки (и производим компиляцию debug-версии программы) (Debug выбрано изначально).

Рис. 2. 5. Запуск приложения Windows Forms по конфигурации Debug


3. Модификация приложения Windows Forms: ODBC
Для начала изменим размер нашей единственной формы. Для этого можно потянуть за уголок в нужном направлении на странице визуального представления формы1. Но также размер можно менять на панели свойств этой формы. Для этого нужно поменять значение размера в пикселях (высоту и ширину) в поле Size.
ПРИМЕЧАНИЕ № 1: Для перехода на визуальное представление формы, необходимо двойным нажатием в обозревателе решений нажать на значок формы () или выбрать вкладку на панели вкладок с именем <имя формы>.cs [Конструктор].
Задаём следующие параметры формы на панели Свойства:


(Name)

изменим с Form1.cs2 на LWP10Main

^ Поменяем внутреннее имя формы.

Text

изменим с Form1 на Работа с базами данных (C#)

^ Поменяем заголовок формы (то что отображается в шапке приложения слева).

Icon

изменим изображение (иконку) приложения

^ Необходим файл значка *.ico.

Size

изменим со значений 300; 300 на 800; 600

^ Поменяем размер формы.
ПРИМЕЧАНИЕ № 2: Для того, чтобы поменять имя файла нашей формы, необходимо выполнить следующее: выделить в обозревателе решений значок формы () и нажать правую кнопку мыши, затем выбрать Переименовать. Ввести необходимое новое имя СОХРАНЯЯ расширение *.cs. После смены имени, автоматически поменяются имена проассоциированных непосредственно с формой файлов:


Получим нечто подобное:

Рис. 3. 1. Модифицированная форма приложения


Добавим на нашу форму ToolTip ().
Параметры добавленного элемента всплывающей подсказки таковы:


(Name):

Hint

Теперь приступим к формированию первой группы элементов и её функциональности. Для начала расставим элементы как показано на рисунке ниже:


Рис. 3. 2. Расстановка элементов первой группы (ODBC)



Здесь у нас четыре кнопки Button, один RichTextBox (слева внизу), и простой погашенный TextBox.
По порядку распишем Свойства каждого элемента:
Button:

(Name):

B_ODBC_Search

Text:

Выбрать базу данных (*.mdb)

Size:

200; 23

Button:

(Name):

B_ODBC_Connect

Text:

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

Size:

200; 23

Button:

(Name):

B_ODBC_Add

Text:

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

Size:

200; 23

Button:

(Name):

B_ODBC_Disconnect

Text:

Закрыть соединение

Size:

200; 23

TextBox:

(Name):

TB_ODBC_Path

ReadOnly:

True

RicTextBox:

(Name):

RTB_ODBC

ReadOnly:

True

GroupBox:

(Name):

GB_ODBC

Text:

ODBC

OpenFileDialog:

(Name):

OFD_ODBC

FileName:

LWP10-DB-ODBC

InitialDirectory:

D:\

Filter

База данных *.mdb|*.mdb

Теперь отправляемся в код формы (правая кнопка мыши на значке формы, далее Перейти к коду или нажмём на клавишу F7):




В самое начало кода добавим:
using System.Data.Odbc; // ODBC
Найдём:
public partial class LWP10Main : Form

{
Добавим после:


Double Counter = 4;

OdbcConnection ConnectionOBDC;


Изменим следующую функцию LWP10Main():
public LWP10Main()

{

InitializeComponent();



B_ODBC_Add.Enabled = false;

B_ODBC_Connect.Enabled = false;

B_ODBC_Disconnect.Enabled = false;

TB_ODBC_Path.Text = "D:\\LWP10-DB-ODBC.mdb";

}
Событие Click кнопки B_ODBC_Search («Выбрать базу данных»):
private void B_ODBC_Search_Click(object sender, EventArgs e)

{
if (OFD_ODBC.ShowDialog() == DialogResult.OK)

{

B_ODBC_Add.Enabled = true;



B_ODBC_Connect.Enabled = true;

B_ODBC_Disconnect.Enabled = true;

Directory.CreateDirectory(Path.GetDirectoryName(OFD_ODBC.FileName) + @"\Копии"); // Создаём директорию под изменённые БД

File.Copy(OFD_ODBC.FileName, Path.GetDirectoryName(OFD_ODBC.FileName) + @"\Копии\" + OFD_ODBC.SafeFileName, true); // Копируем туда выбранную БД (перезаписываем, в случае обнаружения похожего файла)

if (Path.GetDirectoryName(OFD_ODBC.FileName) == Directory.GetDirectoryRoot(OFD_ODBC.FileName)) // Проверяем путь, если находимся в корневой директории диска, режем один слеш

TB_ODBC_Path.Text = Path.GetDirectoryName(OFD_ODBC.FileName) + @"Копии\" + OFD_ODBC.SafeFileName;

else

TB_ODBC_Path.Text = Path.GetDirectoryName(OFD_ODBC.FileName) + @"\Копии\" + OFD_ODBC.SafeFileName;



}

}
Небольшое замечание по коду выше. После выбора БД в окне диалога, приложение будет создавать в директории с БД новую папку «Копии» и копировать туда выбранную в диалоге БД. Все операции с БД (из нашего приложения) будут происходить с копией, а не с оригиналом. Копия БД будет затираться всякий раз при открытии диалога выбора и выбора там БД.


Событие Click кнопки B_ODBC_Connect («Открыть соединение»):
private void B_ODBC_Connect_Click(object sender, EventArgs e)

{

String ConnetionStringODBC = null;



ConnetionStringODBC = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" + TB_ODBC_Path.Text + ";"; // Выбираем источник данных ("провайдера") и указываем путь к нему через TextBox

ConnectionOBDC = new OdbcConnection(ConnetionStringODBC); // Инициализируем объект соединения с новыми параметрами


try

{

ConnectionOBDC.Open(); // Открываем соединение



MessageBox.Show("Соединение с базой данных " + TB_ODBC_Path.Text + " успешно открыто!", "Работа с базами данных (C#) :: ODBC");

}

catch (Exception ex)



{

MessageBox.Show("Невозможно открыть соединение с базой данных " + TB_ODBC_Path.Text + " (" + ex.Message + ")!", "Работа с базами данных (C#) :: ODBC");

}

}
Событие Click кнопки B_ODBC_Add («Добавить запись»):


private void B_ODBC_Add_Click(object sender, EventArgs e)

{

String SQL_ODBC = "INSERT INTO \"Главная таблица\" VALUES( '" + Counter++ + "', 'Число', '999', 'ABC' );"; // Запрос на на добавление записей в нашу таблицу, ключевое поле будет числовым, начинается с 4 и далее растёт инкрементом



OdbcCommand Command = new OdbcCommand(SQL_ODBC, ConnectionOBDC); // Формируем команду
try

{

Command.ExecuteNonQuery(); // Выполняем команду



RTB_ODBC.Clear(); // Очищаем RichTextBox

RTB_ODBC.AppendText(Command.CommandText); // Вставляем результат выполнения команды с нашей базой

}

catch (Exception ex)



{

RTB_ODBC.Clear();

RTB_ODBC.AppendText(ex.Message);

}

}


Событие Click кнопки B_ODBC_Disconnect («Закрыть соединение»):
private void B_ODBC_Disconnect_Click(object sender, EventArgs e)

{

String SQL_ODBC = "DELETE FROM \"Главная таблица\" WHERE \"Главная таблица\".\"Первое поле\" = 'Число';"; // Запрос на удаление всего добавленного (чтобы не делать это вручную потом)



OdbcCommand Command = new OdbcCommand(SQL_ODBC, ConnectionOBDC); // Формируем команду
try

{

Command.ExecuteNonQuery(); // Выполняем команду



RTB_ODBC.Clear(); // Очищаем RichTextBox

RTB_ODBC.AppendText(Command.CommandText); // Вставляем результат выполнения команды с нашей базой

ConnectionOBDC.Close(); // Закрываем соединение

MessageBox.Show("Соединение с базой данных " + TB_ODBC_Path.Text + " успешно закрыто!", "Работа с базами данных (C#) :: ODBC");

}

catch (Exception ex)



{

RTB_ODBC.Clear();

RTB_ODBC.AppendText(ex.Message);

MessageBox.Show("Невозможно закрыть соединение с базой данных " + TB_ODBC_Path.Text + " (" + ex.Message + ")!", "Работа с базами данных (C#) :: ODBC");

}

}
Последнее что нам нужно, это база данных в формате Microsoft Access 2000. Сделаем её, например в Microsoft Office Access 2010. База будет содержать одну таблицу (Главная таблица) и четыре столбца: Ключевое поле (являющее ключевым, числовое), : Первое поле, Второе поле и Третье поле (все текстовые).



Заполним первые три записи (Ключевое поле: 1, 2 и 3):

Рис. 3. 3. База данных LWP10-DB-ODBC.mdb


Для сохранения в формат Access 2000 выполним: Файл -> Сохранить и опубликовать, далее выберем формат Базы данных Access 2000:

Рис. 3. 4. Сохранение в формате Access 2000


Компилируем приложение (Debug) и запускаем. Выбираем нашу базу кнопкой в левом верхнем углу приложения, затем жмём на Открыть соединение, далее несколько раз на Добавить запись (при этом наблюдая за тем что пишет RichTextBox). Если после нескольких добавлений открыть базу данных (не нажимая на Закрыть соединение или не закрывая само приложение), то можно увидеть новые записи:


Удаляем все новые записи кнопкой Закрыть соединение и тем самым также закрываем соединение с базой.

Рис. 3. 5. Окончательная работа блока: ODBC


4. Модификация приложения Windows Forms: OLE
Для соединения с базой данных Microsoft Office Access 2003 и ниже (файл *.mdb) в C# следует использовать класс OleDbConnection со следующими параметрами соединения:

Provider=Microsoft.Jet.OLEDB.4.0; Data Source=DataBaseFile

Здесь DataBaseFile — абсолютный путь к файлу базы данных Access. «Провайдер» соединения должен иметь значение Microsoft.Jet.OLEDB.4.0.

Для соединения с базой данных Microsoft Office Access 2007 и выше (файл *.accdb) в C# следует использовать класс OleDbConnection со следующими параметрами соединения:

Provider=Microsoft.ACE.OLEDB.12.0; Data Source=DataBaseFile

Здесь DataBaseFile — абсолютный путь к файлу базы данных Access. «Провайдер» соединения должен иметь значение Microsoft.ACE.OLEDB.12.0 либо для версии Access 2010: Microsoft.ACE.OLEDB.14.0.


Пример:
String ConnetionString = null;

ConnetionStringO = "Provider=Microsoft.ACE.OLEDB.12.0;" +

@"Data Source=D:\Database.accdb";

ConnectionOLE1 = new OleDbConnection(ConnetionStringOLE1);


Для отправки SQL-запросов и чтения их результатов используются объекты OleDbCommand и OleDbDataReader.
Для выполнения запросов на вставку, изменение, или удаление данных из базы данных следует использовать метод класса OleDbCommand: ExecuteNonQuery(). Его вызов выполняет указанный в свойстве CommandText класса OleDbCommand запроc и возвращает int-число затронутых запросом полей.
Пример:
OleDbConnection Conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=Database.mdb"); // Инициализируем параметры соединения

Conn.Open(); // Открываем соединение с базой даннфх

OleDbCommand Cmd = new OleDbCommand(); // Создаём команду

Cmd.CommandText = "INSERT INTO Main_Table VALUES (1,2,3)"; // Текст команды

int rowsAffected = Cmd.ExecuteNonQuery(); // Выполнение команды с возвратом в int

System.Windows.Forms.MessageBox.Show(rowsAffected.ToString()); // Вывод результата


Если база данных из примеры выше пустая, то int будет равно единице.
Во время выполнения команд вставки (SQL: INSERT INTO) можно использовать параметры, что может пригодиться, например, для добавления в базу данных файла изображения.
Пример:
OleDbCommand Сmd = new OleDbCommand("INSERT INTO Main_Table (columns) VALUES (@param)", Сonn);

Сmd.Parameters.Add("@param", "abc[[''[]''kl'm");

Сmd.ExecuteNonQuery();
При каких-либо ошибках в синтаксисе, или структуре SQL-запроса, программа падает в OS Loader Lock (фактически прерывается работа), и не дает никакой информации о произошедшей ошибке. Чтобы этого избежать и получить довольно исчерпывающую информацию о произошедшей ошибке, следует выполнять запросы в try-catch блоках. В коде работы подобные приёмы будут использованы повсеместно.
Теперь приступим к формированию второй группы элементов и её функциональности. Для начала расставим элементы как показано на рисунке ниже:

Рис. 4. 1. Расстановка элементов первой группы (OLE # 1)


Здесь представлены три кнопки Button, один ListBox (по центру), простой погашенный TextBox, как в предыдущей группе, и четыре TextBox’а для ввода с клавиатуры данных, которые будут добавлять в базу данных. Слева от каждого размещены по одному текстовому элементу: Label. Также с панели инструментов было добавлен ещё один OpenFileDialog-элемент.
Функциональность блока будет следующей. При нажатии на кнопку Выбрать базу данных, будет предложено выбрать одну из двух возможных типов базы: это база данных для старых версий Access (*.mdb) и для новых (*.accdb). После этого будет выдано сообщение об успехе или неудаче выбора с описанием причины ошибки в случае неудачи. Далее при нажатии Прочитать все записи, в центральный ListBox будут занесены все записи из базы данных. Ввод значений в TextBox’ы слева и нажатие кнопки Добавить записи сохранит в нашей базе новый записи. Будет использована та же самая база данных, что и для предыдущего блока: LWP10-DB-ODBC.mdb, а также копия этой же базы, сохранённая как файл *.accdb, для версии Access 2007 или Access 2010. База: LWP10-DB-OLE.accdb.
По порядку распишем Свойства каждого элемента:
Button:

(Name):

B_OLE_1_Search

Text:

Выбрать базу данных

Size:

200; 23

Button:

(Name):

B_OLE_1_Read

Text:

Прочитать все записи

Size:

200; 23

Button:

(Name):

B_OLE_1_Add

Text:

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

Size:

200; 23

TextBox:

(Name):

TB_OLE_1_Path

ReadOnly:

True

ListBox:

(Name):

LB_OLE_1

GroupBox:

(Name):

GB_OLE_1

Text:

OLE # 1

OpenFileDialog:

(Name):

OFD_OLE_1

InitialDirectory:

D:\

Filter

База данных *.mdb|*.mdb|База данных *.accdb|*.accdb

TextBox:

(Name):

TB_OLE_1_1

TextBox:

(Name):

TB_OLE_1_2

TextBox:

(Name):

TB_OLE_1_3

TextBox:

(Name):

TB_OLE_1_4

Откроем файл LWP10Main.cs и в самом начале добавим две ссылки:


using System.Data.OleDb; // OLE

using System.IO; // Для получения расширения файла базы данных


Найдём:
public partial class LWP10Main : Form

{

Double Counter = 4;



OdbcConnection ConnectionOBDC;
Добавим после:
String ConnetionStringOLE1 = null; // Переменная для сохранения данных соединения

OleDbConnection ConnectionOLE1; // Объект для открытия подключения к базе данных

String SQL_OLE = null; // Переменная для поискового запроса

String SQL_OLE_ADD = null; // Переменная для добавления данных


Найдём:
public LWP10Main()

{

InitializeComponent();



TB_ODBC_Path.Text = "D:\\LWP10-DB-ODBC.mdb";
Добавим после:
TB_OLE_1_Path.Text = "D:\\LWP10-DB-OLE.accdb";

B_OLE_1_Read.Enabled = false;

B_OLE_1_Add.Enabled = false;

TB_OLE_1_1.Text = Counter.ToString();

SQL_OLE = "SELECT * FROM [Главная таблица]";
Событие Click кнопки Выбрать базу данных:
private void B_OLE_1_Search_Click(object sender, EventArgs e)

{
if (OFD_OLE_1.ShowDialog() == DialogResult.OK)

{

B_OLE_1_Read.Enabled = true; // Активируем кнопку "Прочитать все записи"



B_OLE_1_Add.Enabled = true;

//TB_OLE_1_Path.Text = OFD_OLE_1.FileName;

Directory.CreateDirectory(Path.GetDirectoryName(OFD_OLE_1.FileName) + @"\Копии"); // Создаём директорию под изменённые БД

File.Copy(OFD_OLE_1.FileName, Path.GetDirectoryName(OFD_OLE_1.FileName) + @"\Копии\" + OFD_OLE_1.SafeFileName, true); // Копируем туда выбранную БД (перезаписываем, в случае обнаружения похожего файла)

if (Path.GetDirectoryName(OFD_OLE_1.FileName) == Directory.GetDirectoryRoot(OFD_OLE_1.FileName)) // Проверяем путь, если находимся в корневой директории диска, режем один слеш

TB_OLE_1_Path.Text = Path.GetDirectoryName(OFD_OLE_1.FileName) + @"Копии\" + OFD_OLE_1.SafeFileName;

else

TB_OLE_1_Path.Text = Path.GetDirectoryName(OFD_OLE_1.FileName) + @"\Копии\" + OFD_OLE_1.SafeFileName;


if (Path.GetExtension(OFD_OLE_1.FileName) == ".mdb") // Узнаём расширение файла выбранного в диалоге открытия (указываем полный путь) и сравниваем его с ".mdb"

{

ConnetionStringOLE1 = "Provider=Microsoft.Jet.OLEDB.4.0;" +



@"Data Source=" + TB_OLE_1_Path.Text + "";

MessageBox.Show("Выбрана база данных " + TB_OLE_1_Path.Text + " формата: *" + Path.GetExtension(TB_OLE_1_Path.Text) + "!", "Работа с базами данных (C#) :: OLE # 1");

}
if (Path.GetExtension(OFD_OLE_1.FileName) == ".accdb")

{

ConnetionStringOLE1 = "Provider=Microsoft.ACE.OLEDB.12.0;" +



@"Data Source=" + TB_OLE_1_Path.Text + "";

MessageBox.Show("Выбрана база данных " + TB_OLE_1_Path.Text + " формата: *" + Path.GetExtension(TB_OLE_1_Path.Text) + "!", "Работа с базами данных (C#) :: OLE # 1");

}

}

}


Событие Click кнопки Показать все записи:
private void B_OLE_1_Read_Click(object sender, EventArgs e)

{

LB_OLE_1.Items.Clear();



ConnectionOLE1 = new OleDbConnection(ConnetionStringOLE1);
try

{

ConnectionOLE1.Open(); // Открываем соединение



MessageBox.Show("Соединение с базой данных " + TB_OLE_1_Path.Text + " успешно открыто!", "Работа с базами данных (C#) :: OLE # 1");

}

catch (Exception ex) // Ловим исключение и вытаскиваем ошибку через ex.Message



{

MessageBox.Show("Невозможно открыть соединение с базой данных " + TB_OLE_1_Path.Text + " (" + ex.Message + ")!", "Работа с базами данных (C#) :: OLE # 1");

}

OleDbCommand Command = new OleDbCommand(SQL_OLE, ConnectionOLE1); // Формируем SQL-команду для текущего подключения



OleDbDataReader DataReader = Command.ExecuteReader(); // Формируем объект для чтения данных из базы данных

LB_OLE_1.Items.Add(Command.CommandText); // Посылаем текст команды в ListBox

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

while (DataReader.Read())

{

LB_OLE_1.Items.Add(DataReader["Ключевое поле"].ToString() + " | " + DataReader["Первое поле"].ToString() + " | " + DataReader["Второе поле"].ToString() + " | " + DataReader["Третье поле"].ToString());



}

// Закрываем потоки чтения и соединения

DataReader.Close();

ConnectionOLE1.Close();

}
Событие Click кнопки Добавить записи:
private void B_OLE_1_Add_Click(object sender, EventArgs e)

{

LB_OLE_1.Items.Clear(); // Очищаем ListBox перед использованием



ConnectionOLE1 = new OleDbConnection(ConnetionStringOLE1); // Передаём параметры объекту соединения
try

{

ConnectionOLE1.Open(); // Открываем соединение



MessageBox.Show("Соединение с базой данных " + TB_OLE_1_Path.Text + " успешно открыто!", "Работа с базами данных (C#) :: OLE # 1");

}

catch (Exception ex)



{

MessageBox.Show("Невозможно открыть соединение с базой данных " + TB_OLE_1_Path.Text + " (" + ex.Message + ")!", "Работа с базами данных (C#) :: OLE # 1");

}

SQL_OLE_ADD = "INSERT INTO [Главная таблица] VALUES('" + Counter.ToString() + "', '" + this.TB_OLE_1_2.Text + "', '" + this.TB_OLE_1_3.Text + "', '" + this.TB_OLE_1_4.Text + "');";



OleDbCommand Command = new OleDbCommand(SQL_OLE_ADD, ConnectionOLE1);
try

{

Command.ExecuteNonQuery(); // Выполняем команду



}

catch (Exception ex)

{

MessageBox.Show("Невозможно выполнить команду с базой данных " + TB_OLE_1_Path.Text + " (" + ex.Message + ")!", "Работа с базами данных (C#) :: OLE # 1");



}

LB_OLE_1.Items.Add(Command.CommandText); // Отправляем текст команды в ListBox

Counter++;

TB_OLE_1_1.Text = Counter.ToString();

}
Компилируем приложение (Debug) и запускаем:

Рис. 4. 2. Окончательная работа блока: OLE # 1


Предположим, что работа в таком виде с базами данных нас не устраивает. Например, весьма неудобно для базы, где в таблице есть более сотни столбцов, делать эту самую сотню TextBox’ов. В этом случае, когда требуется наглядность данных в приложении и малые трудозатраты лучше нужно использовать элемент управления DataGridView и связанные с ним другие элементы, такие как например DataSet.

Оба элемента можно найти на панели элементов на вкладе Данные.



Собственно DataGridView полезен не только для работы с базами данных. Это просто элемент для предоставления данных в программе (в том числе и в визуальной форме).

Для демонстрации работы с этими элементами организуем третью группу элементов: OLE # 2. Приложение же будет выполнять тот же запрос, что и в предыдущем примере, но будет помещать результат в объект DataSet, который подключается к элементу управления DataGridView, а тот автоматически отображает все данные. Для сохранения данных в базе будет использоваться метод «двухсторонней привязки3 данных», который позволит не только просматривать открывшуюся таблицу, но и вводить изменения в элемент DataGridView, добавляя новые строки, изменяя содержимое имеющихся строк и удаляя ненужные. Объекты класса DataAdapter способны выполнять как операцию SELECT, получая данные запроса из базы данных, так и команды INSERT, UPDATE и DELETE, изменяя содержимое таблицы базы данных.
Но прописывать данные команды самостоятельно надобности нет. Пространство имен System.Data содержит небольшой, но очень полезный класс CommandBuilder, который умеет создавать команды SQL и автоматически их выполнять.
ПРИМЕЧАНИЕ № 3: Подключение источника данных к визуальному элементу управления называется привязкой, или связыванием данных.
Теперь приступим к формированию третьей группы элементов и её функциональности. Для начала расставим элементы как показано на рисунке ниже:

Рис. 4. 3. Расстановка элементов первой группы (OLE # 2)


Здесь представлены три кнопки Button, один, простой погашенный TextBox, как в предыдущей группе и два DataGridView. Также с панели инструментов было добавлен ещё один OpenFileDialog-элемент и один DataSet. Сразу оговоримся, для работы с добавлением данных через DataGridView база данных была переделана и название таблиц и столбцов были изменены (убраны символы кириллицы). Это связано с тем, что при работе с базой, в которой есть не английские символы в названиях таблиц (и столбцов) можно столкнуться с ошибками (не всегда). Сама же база осталась без изменений, Название: LWP10-DB-OLE-Special.accdb. Содержание таблицы Main_Table:


Функциональность блока будет следующей. Выбираем базу данных как в предыдущих случаях и жмём на Показать все записи. Всплывающее сообщение с результатами, за которым идёт добавление всех данных базы в левый (по рисунку 4. 3) DataGridView. Правый же будет загружен сразу при старте приложения (база будет взята по статическому пути D:\LWP10-DB-Special.accdb. Вносим изменения в ячейки (в правом DataGridViewv) и жмём на Сохранить записи. Результат можно будет увидеть перезагрузив приложение, либо открыв базу через Access. Изменения ячеек в левом DataGridView не будут нигде сохранены.
По порядку распишем Свойства каждого элемента:
Button:

(Name):

B_OLE_2_Search

Text:

Выбрать базу данных

Size:

200; 23

Button:

(Name):

B_OLE_2_Read

Text:

Прочитать все записи

Size:

200; 23

Button:

(Name):

B_OLE_2_Save

Text:

Сохранить записи

Size:

200; 23

TextBox:

(Name):

TB_OLE_2_Path

ReadOnly:

True
следующая страница >>


izumzum.ru