+ All Categories
Home > Documents > Высокоуровневые методы информатики и...

Высокоуровневые методы информатики и...

Date post: 15-Jan-2016
Category:
Upload: trish
View: 55 times
Download: 0 times
Share this document with a friend
Description:
Высокоуровневые методы информатики и программирования Лекция 28 Отсоединенный режим работы ADO.Net. Присоединенный режим работы с БД. Наша программа. Читаем в цикле используя операцию [ ]. DataReader. ExecuteScalar() - получаем одно значение. ExecuteReader(). - PowerPoint PPT Presentation
Popular Tags:
36
Высокоуровневые методы информатики и программирования Лекция 28 Отсоединенный режим работы ADO.Net
Transcript
Page 1: Высокоуровневые методы информатики и программирования Лекция  28

Высокоуровневые методы информатики и

программирования

Лекция 28

Отсоединенный режим работы ADO.Net

Page 2: Высокоуровневые методы информатики и программирования Лекция  28

Присоединенный режим работы с БД

Page 3: Высокоуровневые методы информатики и программирования Лекция  28

БД : MS SQL Server, Oracle, MS Access, Foxpro, DBase и т.п.

Connection

Command

DataReader

Наша программа

Command

ExecuteReader()

ExecuteNonQuery()

ExecuteScalar() - получаем одно значение

• SQL Select• хранимая процедура

• SQL Insert, Update, Delete

• хранимая процедура

Читаем в цикле используя операцию [ ]

Page 4: Высокоуровневые методы информатики и программирования Лекция  28

Отсоединенный режим работы с БД

Page 5: Высокоуровневые методы информатики и программирования Лекция  28

ExecuteXxx

Использование классов ADO.NET

DataBase

SQL Server организации

ConnectionDataReader

DataAdapter

DataSet

Command

Fill Update

Update, Insert, Delete

ClientProgram

Компьютер пользователя

ExecuteReader

Read

Provider

Page 6: Высокоуровневые методы информатики и программирования Лекция  28

Класс DataSet• Объекты класса DataSet позволяют создать базу данных в

оперативной памяти.– Данные извлекаются из базы данных и сохраняются в объекте DataSet. – Объект DataSet содержит набор данных отсоединенных от БД. – Затем программа может изменять эти данные

• Обновления сделанные в DataSet должны быть занесены обратно в БД для того, чтобы сохранить их постоянно.

• Класс DataSet является одним для всех провайдеров по работе с БД.

• Объекты класса DataSet включают объекты DataTable (таблицы данных) и DataRelation (связи между таблицами).

• Для заполнения объекта DataSet используется класс DataAdapter из провайдера.

Page 7: Высокоуровневые методы информатики и программирования Лекция  28
Page 8: Высокоуровневые методы информатики и программирования Лекция  28

CommandCommandCommand

БД : MS SQL Server, Oracle, MS Access, Foxpro, DBase и т.п.

Connection

DataAdapter

Наша программа

ExecuteNonQuery()

Метод Fill()

DataAdapter DataAdapter

DataSetDataTable DataTable DataTable

Метод Update()

Command

Page 9: Высокоуровневые методы информатики и программирования Лекция  28

Конструкторы класса DataSet

• DataSet ds = new DataSet();• DataSet ds = new DataSet("MyDataSet");

Page 10: Высокоуровневые методы информатики и программирования Лекция  28

DataSet

.Tables[...]

.Relations[...]

...

Структура класса DataSet

DataTable

.Columns[..]

.Rows[..]

DataTable

.Columns[...]

.Rows[...]

.DefaultView

...

DataRow

DataRowданные

DataColumn

schema

DataColumn

DataView

DataRelationDataRelation

Page 11: Высокоуровневые методы информатики и программирования Лекция  28
Page 12: Высокоуровневые методы информатики и программирования Лекция  28

Свойства класса DataSet

Основные:• Tables – коллекция таблиц DataTable• Relations – коллекция отношений DataRelation

Дополнительные свойства:• ExtendedProperties – коллекция дополнительных свойств (имя, значение)• CaseSensitive – указывает, будет ли при сравнении строк в DataTable объектах

учитываться регистр (большие и маленькие символы).• DataSetName – дружественное имя данного DataSet. Обычно задается в

конструкторе класса.• EnforceConstraints – получает или задает значение указывающее на то, будут ли

учитываться ограничивающие правила (constraint rules) при попытке выполнить любую операцию обновления.

• HasErrors – получить значение указывающее на наличие ошибок в любой строке любой таблицы DataTables данного DataSet.

• RemotingFormat – позволяет определить то, как будет сериализоваться содержание DataSet (binary или XML).

Page 13: Высокоуровневые методы информатики и программирования Лекция  28

Основные методы DataSet• Clear() – полное удаление всех записей во всех DataTable таблицах DataSet.• Merge() – слияние данного DataSet с указанным DataSet.• GetChildRelations() – получить коллекцию дочерних отношений указанной

таблицы.• GetParentRelations() - получить коллекцию родительских отношений указанной

таблицы. • HasChanges() – определить, изменился ли DataSet, включая новые,

удаленные или измененные записи (rows).• AcceptChanges() – принятие (commits) всех изменений сделанных в этом

DataSet с момента загрузки в него данных или последнего вызова метода AcceptChanges().

• RejectChanges() – отменить все изменения, сделанные в данном DataSet с момента его создания или последнего вызова метода AcceptChanges().

• ReadXml() – чтение XML данных из потока (файла, оперативной памяти, или сети) в DataSet.

• ReadXmlSchema() – чтение структуры • WriteXml() – записать содержание DataSet в поток.• WriteXmlSchema() – записать структуру DataSet в поток.

Page 14: Высокоуровневые методы информатики и программирования Лекция  28

Создание и заполнение таблицы с помощью DataAdapter

SqlConnection conn = new SqlConnection(conString);

SqlDataAdapter da = new SqlDataAdapter("SELECT pub_id, pub_name FROM Publishers", conn);

DataSet pubsDataSet = new DataSet("Pubs");

da.Fill(pubsDataSet, "publishers");

Page 15: Высокоуровневые методы информатики и программирования Лекция  28

ExecuteXxx

Использование классов ADO.NET

DataBase

SQL Server организации

ConnectionDataReader

DataAdapter

DataSet

Command

Fill Update

Update, Insert, Delete

ClientProgram

Компьютер пользователя

ExecuteReader

Read

Provider

Select

Page 16: Высокоуровневые методы информатики и программирования Лекция  28

Класс DataAdapter• Для организации взаимодействия DataSet с БД.• Организует взаимодействие одной таблицы DataSet с

базой данных• Свойства

– SelectCommand содержит SQL SELECT оператор– InsertCommand содержат SQL INSERT– UpdateCommand содержат SQL UPDATE– DeleteCommand содержат SQL DELETE операторы

• Методы– Fill(ds) использует соединение для заполнения DataSet

данными• Первый параметр – объект DataSet• Второй (необязательный) – название создаваемой таблицы

– Update() посылает исправленные в DataSet данные в БД• Параметр – объект DataSet

Page 17: Высокоуровневые методы информатики и программирования Лекция  28

Конструкторы класса DataAdapter

• Конструктор класса DataAdapter является перегруженным:– без параметров

SqlDataAdapter da = new SqlDataAdapter();– с одним параметром – объектом Command:

SqlDataAdapter da = new SqlDataAdapter(cmd);– с двумя параметрами – SQL оператором и объектом Connection:

SqlDataAdapter da = new SqlDataAdapter(sql, conn);– с двумя параметрами – SQL оператором и строкой соединения:

SqlDataAdapter da = new SqlDataAdapter(sql, connString);

• Параметры: – conn – объект Connection;– connString – строка соединения.– sql – оператор языка SQL;– cmd – объект Command;

Page 18: Высокоуровневые методы информатики и программирования Лекция  28

Методы Fill() и Update()

• Метод int Fill():– int Fill (DataSet ds) – в DataSet создается и заполняется данными

таблица БД (к данной таблице можно обращаться только по номеру);

– int Fill (DataTable dt) – заносит в таблицу схему и данные;– int Fill (DataSet ds, string srcTable) – в DataSet создается и

заполняется данными таблица с именем srcTable (к данной таблице можно обращаться только по имени);

• Метод int Update():– int Update(DataSet ds) – в БД сохраняются изменения всех таблиц

DataSet;– int Update(DataSet ds, string srcTable) – в БД сохраняются

изменения таблицs с данным именем;– int Update(DataRow[] drs) – в БД сохраняются изменения

сделанные в записях из массива.

Page 19: Высокоуровневые методы информатики и программирования Лекция  28

Последовательность работы с DataAdapter

• Создать объект Connection.• Создать экземпляр класса и задать объект Command

с SQL командой Select. • Создать объект класса CommandBuilder и построить

в DataAdapter команды Insert, Update и Delete.• Вызвать для DataAdapter метод Fill(), в который

передать объект DataSet.• Выполнять работу с DataSet• После окончания работы вызвать для DataAdapter

метод Update(), в котором передается использованный объект DataSet.

Page 20: Высокоуровневые методы информатики и программирования Лекция  28

ПримерSqlDataAdapter ad = new SqlDbDataAdapter

(“select ProductID, ProductName, UnitPrice from Products”, conn);

SqlCommandBuilder bld = new SqlCommandBuilder (ad);

DataSet ds = new DataSet();

ad.Fill (ds) ; // можно задать и другое имя таблиц - , “Products”);

DataTable tbl = ds.Tables["Products"];for (int i = 0; i < tbl.Rows.Count; i++){ Console.WriteLine("id={0};name={1};цена={2}", tbl.Rows[i][0],

tbl.Rows[i][1], tbl.Rows[i][2]);}

Page 21: Высокоуровневые методы информатики и программирования Лекция  28

Класс CommandBuilder

• Данный класс используется для упрощения создания набора SQL команд.

• Может применяться, когда используется оператор Select для одной таблицы БД.

• По заданной в DataAdapter SQL команде select создаются соответствующие ей команды– InsertCommand содержат SQL INSERT– UpdateCommand содержат SQL UPDATE– DeleteCommand содержат SQL DELETE операторы

• Эти команды требуются для выполнения метода Update (перенесение всех изменений из DataSet в БД).

• Для создания новых команд нужно создать объект класса CommandBuilder и передать ему в качестве параметра объект DataAdapter.– Например:

SqlCommandBuilder св = new SqlCommandBuilder(da);

Page 22: Высокоуровневые методы информатики и программирования Лекция  28

Пример использования объекта DataAdapter

// создаем DataAdapterSqlDataAdapter da = new OleDbDataAdapter

(“select ProductID, ProductName, UnitPrice from Products”, conn);

// автоматически строим команды Insert, Update,DeleteSqlCommandBuilder cb = new SqlCommandBuilder(oDA);

DataSet ds = new DataSet();

da.Fill(ds);

decimal newPrice = (decimal) tbl.Rows[0][“UnitPrice "] + 1.0M;tbl.Rows[0]["UnitPrice"] = newPrice;

da.Update(ds, “Products”);

Page 23: Высокоуровневые методы информатики и программирования Лекция  28

Класс DataTable

• Полное имя класса System.Data.DataTable.• Концептуально аналогичен таблице в БД.• Содержит две коллекции:

– строк Rows;– столбцов Columns – объекты с описаниями полей записей.

• Может использоваться, для представления самостоятельной таблицы или таблицы в DataSet.

• Для получения значений колонок таблицы можно использовать индексаторы tbl[i][j], где – i – номер строки;– j – номер колонки (можно задать и название колонки).

• Например:DataTable tbl;

int n = tbl.Rows[i][j]

Page 24: Высокоуровневые методы информатики и программирования Лекция  28

Класс DataColumn

• Ссылки на объекты данного класса можно получить из таблицы Columns с помощью индекса или с помощью названия колонки:

DataSet ds = new DataSet();

// заполняем

DataColumn col = ds.Columns["ContactName"];

DataColumn col = ds.Columns[2];

• Для получения в записи Row значению поля из колонки col можно получить следующим образом:

DataRow r = ds.Table[0].Rows[0];

r[0] = 1;

r[“CustomerID”] = 1;

DataColumn col = ds.Columns[“CustomerID"];

r[col] = 1;

Page 25: Высокоуровневые методы информатики и программирования Лекция  28

Класс записей DataRow

• Объект класса DataRow Запись (строка, data row) представляет собой запись данных из таблицы, в коллекции которой он хранится.

• Записям таблицы DataTable хранятся в коллекции Rows. • Записи можно программно

– добавлять к коллекции(add), – обновлять (update), – удалять из коллекции (delete).

• Для получения доступа к конкретной записи используется операция [ ] с индексом.– Например, если dt является таблицей данных, то вторую

запись можно получить следующим образом:

DataRow row = dt.Rows[2];

Page 26: Высокоуровневые методы информатики и программирования Лекция  28

Класс DataRelation

• Для создания связи между первичным ключом и внешним ключом нужно

создать объект класса DataRelation.– Например:

DataColumn ParentColumn = ds.Tables[“Customers”].Columns[“CustomerID”];

DataColumn ChildColumn = ds.Tables[“Orders”].Columns[“CustomerID”];

DataRelation myRel = DataRelation(“CusOderRel”, ParentColumn, ChildColumn);

• Затем созданное отношение между ключами нужно сохранить в

коллекции Relations объекта DataSet, который содержит первичный ключ.– Например:

myDS.Relations.Add(myRel);

• Объект Row имеет методы– GetChildRows(“имя таблицы”)

– GetParentRow(“имя таблицы”)

Page 27: Высокоуровневые методы информатики и программирования Лекция  28

Пример задания связи между записями

• Задание связи Relationship с именем "RelOrdDet" между полями Orders.OrderID и OrderDetails. OrderID

using System.Data;…

DataRelation relOrdDet;

DataColumn colMaster2;

DataColumn colDetail2;

colMaster2 = ds.Tables["Orders"].Columns["OrderID"];

colDetail2 = ds.Tables["OrderDetails"].Columns["OrderID"];

relOrdDet = new DataRelation("RelOrdDet",colMaster2,colDetail2);

ds.Relations.Add(relOrdDet);

• Связывание данных с помощью Relationship grdOrderDetails.DataSource = dsView;

grdOrderDetails.DataMember = "Customers.RelCustOrd.RelOrdDet";

Page 28: Высокоуровневые методы информатики и программирования Лекция  28

Объект DataSet

Page 29: Высокоуровневые методы информатики и программирования Лекция  28

Работа с данными в DataSet

• Чтение данных

• Изменение данных

• Добавление записей в данные

• Сортировка записей

• Удаление данных

Page 30: Высокоуровневые методы информатики и программирования Лекция  28

Выборка массива записей из таблицы DataTable

• Для фильтрации и сортировки записей в таблице используется метод Select()

public DataRow[ ] Select(

string filterExpression, // условие выборки

string sort); // сортировка

• Например:string filterStr = “id = 1”;

string sortStr = “ . . . ”;

DataRow[] sotr = emploees.Select(filterStr, sortStr);

if(sotr.Length != 0)

{ …. }

Page 31: Высокоуровневые методы информатики и программирования Лекция  28

Добавления записи в таблицу DataTable

• Для добавления новой записи к таблице необходимо выполнить следующие действия:– Создать с помощью метода NewRow() класса DataTable пустую

запись имеющую структуру, соответствующую данной таблице (число и тип полей).• Например:

DataRow row = tbl.NewRow ();

– Занести данные в поля созданной записи.• Например:

row[“id”] = 44;

row[“authir”] = “Терентьев И.А.”;

row[“year”] = 2003;

– Сохранить новую запись в коллекции Rows таблицы.• Например:

tbl.Rows.Add(row);

Page 32: Высокоуровневые методы информатики и программирования Лекция  28

Пример добавления записи в таблицу DataTable

// создаем dataset

DataSet ds = new DataSet();

// заполняем dataset данными для таблицы MyBooks

// получаем ссылку на таблицу MyBooks

DataTable tbl = ds.Tables[“MyBooks”];

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

DataRow row = tbl.NewRow ();

// задаем значения полей

row[“id”] = 44;

row[“authir”] = “Терентьев И.А.”;

row[“year”] = 2003;

// заносим новую запись в таблицу

tbl.Rows.Add(row);

// сохраняем изменения в базу данных

ad.Update(tbl);

Page 33: Высокоуровневые методы информатики и программирования Лекция  28

Удаление записей из таблицы DataTable

• Для удаления записей можно использовать метод Remove() коллекции Rows:– Например:

DataRow row = table.Rows[5];

table.Rows.Remove(row);

• Для удаления записей можно использовать метод

Delete() объекта DataRaw:– Например:

DataRow row = table.Rows[5];

row.Delete();

Page 34: Высокоуровневые методы информатики и программирования Лекция  28

Класс представление таблицы DataView

• Объект DataView это просмотр записей в объекте DataTable, с помощью фильтра и сортировки.

• Конструктор класса DataView:// myDT – таблица данныхDataView myDV = new DataView(myDT);

• Свойство сортировки элементов Sort:– myDV.Sort = “имя поля”;– Можно несколько полей (через запятую)– Можно в обратном порядке (DESC)– Например:myDV.Sort = “ID, Name”;

• Свойство отбора элементов (фильтр) RowFilter задается в виде условия, в представление будут выбираться только элементы, которые удовлетворяют данному условию.– Например

myDV.RowFilter = “City = ‘Tomsk’”;

• Объект DataView можно связать с элементами графического интерфейса, например, DataGridView.– Например:

DataGridView dgv = new DataGridView(); dgv.DataSource = myDV;

Page 35: Высокоуровневые методы информатики и программирования Лекция  28

Пример создания и связывания DataView с ЭУ DataGridView

//создаем DataViewDataView view = new DataView(employee);

//задаем правило отбораview.RowFilter = "LastName like 'A%' and Salary > 15";

//задаем порядок сортировкиview.Sort = "LastName ASC, FirstName ASC, Salary DESC";

//связываем элемент управления с DataViewdgv.DataSource = view;

Page 36: Высокоуровневые методы информатики и программирования Лекция  28

Совпадение изменений БД• При занесении изменений в БД могут возникать конфликты между разными

пользователями. Например, два пользователя могут пытаться изменить одну и ту же запись в БД.

• Как БД разрешает такие конфликты? Данные какого пользователя должны заносить первыми, какого – вторыми, и должны ли они вовсе заноситься?

• Ответ не совсем однозначен. Все зависит от множества факторов. • However, ADO.NET provides a fundamental level of concurrency control that’s designed to

prevent update anomalies. The details are beyond the scope of this book, but the following is a good conceptual start.

• Basically, a dataset marks all added, modified, and deleted rows. If a row is propagated to the database but has been modified by someone else since the dataset was filled, the data manipulation operation for the row is ignored. This technique is known as optimistic concurrency and is essentially the job of the data adapter.

• When the Update method is called, the data adapter attempts to reconcile all changes. This works well in an environment where users seldom contend for the same data.

• This type of concurrency is different from what’s known as pessimistic concurrency, which locks rows upon modification (or sometimes even on retrieval) to avoid conflicts. Most database managers use some form of locking to guarantee data integrity.

• Disconnected processing with optimistic concurrency is essential to successful multitier systems. How to employ it most effectively given the pessimistic concurrency of DBMSs is a thorny problem. Don’t worry about it now, but keep in mind that many issues exist, and the more complex your application, the more likely you’ll have to become an expert in concurrency.


Recommended