28
Темы лекции: ADO.NET, Office Interop. Практическое задание: ADO.NET, Office Interop. Тренер: Игорь Шкулипа, к.т.н. Платформа .Net и язык программирования C#. Занятие 12

C# Desktop. Занятие 12

Embed Size (px)

Citation preview

Темы лекции: ADO.NET, Office Interop.

Практическое задание: ADO.NET, Office Interop.

Тренер: Игорь Шкулипа, к.т.н.

Платформа .Net и язык программирования C#.

Занятие 12

http://www.slideshare.net/IgorShkulipa 2

Адаптер

Паттерн Adapter, представляет собой программную обертку надсуществующими классами, преобразуя их интерфейсы к виду,пригодному для последующего использования.

Пусть класс, интерфейс которого нужно адаптировать к нужномувиду, имеет имя Adaptee. Для решения задачи преобразованияего интерфейса паттерн Adapter вводит следующую иерархиюклассов:

◦ Виртуальный базовый класс Target. Здесь объявляетсяпользовательский интерфейс подходящего вида. Только этотинтерфейс доступен для пользователя.

◦ Производный класс Adapter, реализующий интерфейс Target.В этом классе также имеется указатель или ссылка наэкземпляр Adaptee. Паттерн Adapter использует этотуказатель для перенаправления клиентских вызовов вAdaptee. Так как интерфейсы Adaptee и Target несовместимымежду собой, то эти вызовы обычно требуютпреобразования.

http://www.slideshare.net/IgorShkulipa 3

Пример. Преобразование строки в структуру

class InputStringFullName

{

public string Text { get; set; }

public InputStringFullName()

{

Text = "";

}

public void Input()

{

Console.Write

("Input Full Name (Surname Name MiddleName): ");

Text = Console.ReadLine();

}

}

http://www.slideshare.net/IgorShkulipa 4

Класс структуры

class FullName

{

public string Name { get; set; }

public string Surname { get; set; }

public string Middle { get; set; }

public FullName(string surname, string name, string middle)

{

Name = name; Surname = surname; Middle = middle;

}

public void Print()

{

Console.WriteLine(Name);

Console.WriteLine(Middle);

Console.WriteLine(Surname);

}

}

http://www.slideshare.net/IgorShkulipa 5

Класс-адаптер

class FullNameAdapter : InputStringFullName

{

public FullNameAdapter(InputStringFullName stringFullName)

{

Text = stringFullName.Text;

}

public FullName GetFullName()

{

int iFirstSpace = Text.IndexOf(' ');

string strSurname = Text.Substring(0, iFirstSpace);

int iSecondSpace =

Text.Substring(iFirstSpace + 1).IndexOf(' ') + iFirstSpace + 1;

string strName =

Text.Substring(iFirstSpace, iSecondSpace - iFirstSpace);

string strMiddle = Text.Substring(iSecondSpace);

return new FullName(strSurname, strName, strMiddle);

}

}

http://www.slideshare.net/IgorShkulipa 6

Использование адаптера

class Program

{

static void Main(string[] args)

{

InputStringFullName isfn = new InputStringFullName();

isfn.Input();

FullNameAdapter fna = new FullNameAdapter(isfn);

FullName fn = fna.GetFullName();

fn.Print();

Console.ReadKey();

}

}

Результат:Input Full Name (Surname Name MiddleName): Ivanov Ivan Ivanovich

Ivan

Ivanovich

Ivanov

http://www.slideshare.net/IgorShkulipa 7

Команда

Паттерн Command преобразовывает запрос на выполнениедействия в отдельный объект-команду. Такая инкапсуляцияпозволяет передавать эти действия другим функциям иобъектам в качестве параметра, приказывая им выполнитьзапрошенную операцию. Команда – это объект, поэтому надней допустимы любые операции, что и над объектом.

Команда используется, если:

◦ Система управляется событиями. При появлении такогособытия (запроса) необходимо выполнить определеннуюпоследовательность действий.

◦ Необходимо параметризировать объекты выполняемымдействием, ставить запросы в очередь или поддерживатьоперации отмены и повтора действий.

◦ Нужен объектно-ориентированный аналог функцииобратного вызова в процедурном программировании.

http://www.slideshare.net/IgorShkulipa 8

Пример. Интерфейс «Игра»

public interface IGame

{

void New();

void Start();

void Pause();

void Resume();

void Finish();

void Break();

void BreakAndFinish();

void BreakAndStart();

}

http://www.slideshare.net/IgorShkulipa 9

Реализация интерфейса

public class SomeGame : Igame {

void IGame.New() {

Console.WriteLine("New Game."); }

void IGame.Start() {

Console.WriteLine("Game Started."); }

void IGame.Pause() {

Console.WriteLine("Game Paused."); }

void IGame.Resume() {

Console.WriteLine("Game Resumed."); }

void IGame.Finish() {

Console.WriteLine("Game Finished."); }

void IGame.Break() {

Console.WriteLine("Game Breaked."); }

void IGame.BreakAndFinish() {

Console.WriteLine("Game Breaked.");

Console.WriteLine("Game Finished."); }

void IGame.BreakAndStart() {

Console.WriteLine("Game Breaked.");

Console.WriteLine("New Game.");

Console.WriteLine("Game Started."); }

}

http://www.slideshare.net/IgorShkulipa 10

Классы команд

public class Icommand {

public ICommand(IGame game) { Game = game; }

public virtual void ExecuteCommand() { }

public IGame Game { get; set; }

}

class NewCommand : Icommand {

public NewCommand(IGame game) : base(game) { }

public override void ExecuteCommand()

{

Console.WriteLine("Executing New Command...");

Game.New();

}

}

class StartCommand : Icommand {

public StartCommand(IGame game) : base(game) { }

public override void ExecuteCommand()

{

Console.WriteLine("Executing Start Command...");

Game.Start();

}

}

http://www.slideshare.net/IgorShkulipa 11

Классы команд

class PauseCommand : ICommand{

public PauseCommand(IGame game) : base(game) { }

public override void ExecuteCommand() {

Console.WriteLine("Executing Pause Command...");

Game.Pause();

}

}

class ResumeCommand : ICommand{

public ResumeCommand(IGame game) : base(game) { }

public override void ExecuteCommand() {

Console.WriteLine("Executing Resume Command...");

Game.Resume();

}

}

class FinishCommand : ICommand{

public FinishCommand(IGame game) : base(game) { }

public override void ExecuteCommand() {

Console.WriteLine("Executing Finish Command...");

Game.Finish();

}

}

http://www.slideshare.net/IgorShkulipa 12

Классы команд

class BreakCommand : ICommand{

public BreakCommand(IGame game) : base(game) { }

public override void ExecuteCommand() {

Console.WriteLine("Executing Break Command...");

Game.Break();

}

}

class BreakAndFinishCommand : ICommand{

public BreakAndFinishCommand(IGame game) : base(game) { }

public override void ExecuteCommand() {

Console.WriteLine("Executing Break And Finish Command...");

Game.BreakAndFinish();

}

}

class BreakAndStartCommand : ICommand{

public BreakAndStartCommand(IGame game) : base(game) { }

public override void ExecuteCommand() {

Console.WriteLine("Executing Break And Start Command...");

Game.BreakAndStart();

}

}

http://www.slideshare.net/IgorShkulipa 13

Использование командclass Program

{

static void Main(string[] args)

{

IGame someGame = new SomeGame();

ICommand[] commands = new ICommand[10];

commands[0] = new NewCommand(someGame);

commands[1] = new StartCommand(someGame);

commands[2] = new BreakCommand(someGame);

commands[3] = new NewCommand(someGame);

commands[4] = new StartCommand(someGame);

commands[5] = new BreakAndStartCommand(someGame);

commands[6] = new PauseCommand(someGame);

commands[7] = new ResumeCommand(someGame);

commands[8] = new PauseCommand(someGame);

commands[9] = new BreakAndFinishCommand(someGame);

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

{

commands[i].ExecuteCommand();

}

Console.ReadKey();

}

}

Результат:Executing New Command...

New Game.

Executing Start Command...

Game Started.

Executing Break Command...

Game Breaked.

Executing New Command...

New Game.

Executing Start Command...

Game Started.

Executing Break And Start Command...

Game Breaked.

New Game.

Game Started.

Executing Pause Command...

Game Paused.

Executing Resume Command...

Game Resumed.

Executing Pause Command...

Game Paused.

Executing Break And Finish Command...

Game Breaked.

Game Finished.

http://www.slideshare.net/IgorShkulipa 14

ADO.NET

ADO.NET — это набор классов, предоставляющих службы доступа к даннымпрограммисту, работающему на платформе .NET Framework. ADO.NET имеетбогатый набор компонентов для создания распределенных приложений,совместно использующих данные. Это неотъемлемая часть платформы .NETFramework, которая предоставляет доступ к реляционным данным, XML-данным и данным приложений.

ADO.NET разделят доступ к данным и обработку данных на дискретныекомпоненты, которые могут использоваться отдельно или совместно.ADO.NET включает поставщиков данных .NET Framework для соединения сбазой данных, выполнения команд и получения результатов.

Эти результаты, помещенные в объект ADO.NET DataSet, обрабатываютсянепосредственно, чтобы они могли быть предоставлены пользователюнерегламентированным образом, объединенные с данными из многихисточников или передаваемые между уровнями.

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

Классы ADO.NET имеются в System.Data.dll и интегрируются с классами XML,имеющимися в System.Xml.dll.

http://www.slideshare.net/IgorShkulipa 15

Архитектура ADO.NET

Поставщиками данных .NET Framework являются компоненты, которыеспециально сконструированы для обработки данных и быстрого,однопроходного доступа к данным только для чтения.

http://www.slideshare.net/IgorShkulipa 16

Классы ADO.NET

• Connection обеспечивает обмен данными с источником данных.

• Command позволяет обращаться к командам базы данных длявозврата данных, изменения данных, выполнения хранимых процедури передачи или получения сведений о параметрах.

• DataReader обеспечивает высокопроизводительный поток данных изисточника данных.

• DataAdapter предоставляет мост между объектом DataSet иисточником данных. DataAdapter использует объекты Command длявыполнения команд SQL на источнике данных для загрузки DataSet сданными и согласования изменений данных, выполненных в DataSet,вновь с источником данных.

• Класс DataSet в ADO.NET специально сконструирован для доступа кданным независимо от источника данных. Поэтому он может бытьиспользован со многими и разными источниками данных, с XML-данными или для управления данными, локальными для приложения.DataSet содержит коллекцию одного или нескольких объектовDataTable, состоящих из строк и столбцов данных, а такжепервичный ключ, внешний ключ, ограничение и связанные сведения оданных в объектах DataTable.

http://www.slideshare.net/IgorShkulipa 17

Установка соединения

• Для подключения к Microsoft SQL Server используется объектSqlConnection поставщика данных .NET Framework для SQL Server.

• Для подключения к источнику данных OLE DB используется объектOleDbConnection поставщика данных .NET Framework для OLE DB.

• Для соединения с источником данных используется объектOdbcConnection поставщика данных .NET Framework для ODBC.

• Для соединения с источником данных Oracle используется объектOracleConnection поставщика данных .NET Framework для Oracle.

using System.Data.OleDb;

public sealed class OleDbConnection : DbConnection,

ICloneable, IDbConnection, Idisposable

Представляет открытое подключение к источнику данных.

http://www.slideshare.net/IgorShkulipa 18

Пример соединения

Используется база данных MS Access 2007-2013

OleDbConnection connection =

new OleDbConnection(

"Provider=Microsoft.Ace.OLEDB.12.0;" +

"Data Source=ADODatabase.accdb");

connection.Open();

connection.Close();

http://www.slideshare.net/IgorShkulipa 19

Получение данных с помощью DataReader

Для извлечения данных с помощью DataReader необходимо создатьэкземпляр объекта Command, а затем создать объект DataReader,вызвав метод Command.ExecuteReader для получения строк изисточника данных.

Метод Read объекта DataReader используется для получения строки изрезультатов запроса. Доступ к отдельным столбцам возвращеннойстроки осуществляется по имени или порядковому номеру столбцачерез объект DataReader. Однако для максимальнойпроизводительности объект DataReader предоставляет ряд методов,позволяющих обращаться к значениям столбцов в их собственныхтипах данных (GetDateTime, GetDouble, GetGuid, GetInt32 и т. д.).

Ссылка на полное описание класса SqlDataReader

http://www.slideshare.net/IgorShkulipa 20

Пример DataReader

OleDbConnection connection =

new OleDbConnection("Provider=Microsoft.Ace.OLEDB.12.0;" +

"Data Source=ADODatabase.accdb");

connection.Open();

OleDbCommand command =

new OleDbCommand("SELECT * FROM t_users;", connection);

OleDbDataReader dataReader = command.ExecuteReader();

while (dataReader.Read())

{

userListBox.Items.Add(dataReader.GetValue(1).ToString());

}

dataReader.Close();

connection.Close();

http://www.slideshare.net/IgorShkulipa 21

DataAdapter и DataSet

Набор данных ADO.NET DataSet является находящимся в памятипредставлением данных, предоставляющим согласованную реляционнуюпрограммную модель, независимую от источника данных. Набор данныхDataSet представляет собой полную совокупность данных, которая включаеттаблицы, ограничения и связи между таблицами. Набор данных DataSetявляется независимым от источника данных, поэтому DataSet можетвключать данные, локальные по отношению к приложению, а также данныеиз нескольких источников данных. Управление взаимодействием ссуществующими источниками данных осуществляется с помощьюDataAdapter.

Свойство SelectCommand объекта DataAdapter представляет собой объектCommand, получающий данные из источника данных. СвойстваInsertCommand, UpdateCommand и DeleteCommand, принадлежащиеDataAdapter, являются объектами Command, которые управляютобновлением данных в источнике данных в соответствии с изменениямиданных в DataSet.

Метод Fill объекта DataAdapter служит для заполнения набора данных DataSetрезультатами выполнения метода SelectCommand объекта DataAdapter.Метод Fill принимает в качестве аргумента подлежащий заполнению наборданных DataSet, а также объект DataTable или имя объекта DataTable,который должен быть заполнен строками, возвращенными методомSelectCommand.

http://www.slideshare.net/IgorShkulipa 22

ПримерOleDbConnection connection =

new OleDbConnection("Provider=Microsoft.Ace.OLEDB.12.0;" +

"Data Source=ADODatabase.accdb");

connection.Open();

string selectString = "SELECT * FROM t_users";

OleDbDataAdapter dataAdapter =

new OleDbDataAdapter(selectString, connection);

DataSet result = new DataSet();

dataAdapter.Fill(result);

if (result.Tables.Count > 0)

{

for (int i = 0; i < result.Tables[0].Rows.Count; i++)

{

userListBox.Items.Add(result.Tables[0].Rows[i][1]);

}

}

connection.Close();

http://www.slideshare.net/IgorShkulipa 23

Command

public sealed class OleDbCommand : DbCommand,

ICloneable, IDbCommand, Idisposable

Представляет оператор SQL или хранимую процедуру, применяемую кисточнику данных.

OleDbCommand содержит следующие методы для выполнения команд надисточником данных:

ExecuteReader Выполняет команды, возвращающие строки.

ExecuteNonQueryВыполняет команды, таки как операторы SQL INSERT, DELETE, UPDATE и SET.

ExecuteScalarИзвлекает одно значение из базы данных (например, составное значение).

http://www.slideshare.net/IgorShkulipa 24

Добавление записейstring selectMaxID= "SELECT MAX(u_id) FROM t_users;";

OleDbDataAdapter dataAdapter =

new OleDbDataAdapter(selectMaxID, connection);

DataSet result = new DataSet();

dataAdapter.Fill(result);

int maxID = Convert.ToInt32(result.Tables[0].Rows[0][0].ToString());

string insertString =

"INSERT INTO t_users(u_id, u_name, u_password) VALUES ("+

(maxID+1).ToString() +

",\'" + userBox.Text + "\',\'" + passwordBox.Password + "\');";

OleDbCommand insertCommand = new OleDbCommand(insertString, connection);

insertCommand.ExecuteNonQuery();

http://www.slideshare.net/IgorShkulipa 25

Работа с Microsoft Office

Корпорация Майкрософт предлагает несколько основных сбороквзаимодействия (primary interop assembly, PIA), в которых содержитсяофициальное описание наиболее часто используемых библиотекMicrosoft Office XP. Microsoft Office XP PIA облегчают взаимодействиемежду управляемым кодом и СОМ-библиотеками Office XP.

• Microsoft.Office.Interop.Access.dll• Microsoft.Office.Interop.Excel.dll• Microsoft.Office.Interop.FrontPage.dll• Microsoft.Office.Interop.FrontPageEditor.dll• Microsoft.Office.Interop.Graph.dll• Microsoft.Office.Interop.Outlook.dll• Microsoft.Office.Interop.OutlookViewCtl.dll• Microsoft.Office.Interop.Owc.dll• Microsoft.Office.Interop.PowerPoint.dll• Microsoft.Office.Interop.Publisher.dll• Microsoft.Office.Interop.SmartTag.dll• Microsoft.Office.Interop.Visio.dll• Microsoft.Office.Interop.Word.dll

http://www.slideshare.net/IgorShkulipa 26

Добавление ссылки на библиотеку

http://www.slideshare.net/IgorShkulipa 27

Экспорт в Excelusing MOIE = Microsoft.Office.Interop.Excel;

...

MOIE.Application excel=new MOIE.Application();

excel.Visible = true;

excel.SheetsInNewWorkbook = 10;

excel.Workbooks.Add(Type.Missing);

MOIE.Workbook workBook = excel.Workbooks[1];

MOIE.Worksheet workSheet = workBook.Sheets[1];

for (int i = 0; i < userListBox.Items.Count; i++)

{

MOIE.Range range =

workSheet.get_Range("A" + (i+1).ToString(), Type.Missing).Cells;

range.Value2 = userListBox.Items[i].ToString();

if ((i % 2) == 0)

{

range.Font.Bold = true;

}

}

workBook.SaveAs("result.xlsx");

excel.Quit();

http://www.slideshare.net/IgorShkulipa 28

Лабораторная работа №12. ADO.NET и Office Interop

Спроектировать базу данных для хранения информации о документах надиске (имя, путь, дата создания, формат…), а так же для храненияинформации о ключевых словах и тематике документа.

Создать приложение для индексации (создания списка ключевых слов иопределения тематики) текстовых файлов (*.txt) и документов MSOffice (*.xls, *.xlsx, *.doc, *.docx, *.ppt, *.pptx) и записи результатов вбазу данных.

Реализовать хранение/чтение/редактирование информации о документах.