1 / 36

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

Высокоуровневые методы информатики и программирования Лекция 28 Отсоединенный режим работы ADO.Net. Присоединенный режим работы с БД. Наша программа. Читаем в цикле используя операцию [ ]. DataReader. ExecuteScalar() - получаем одно значение. ExecuteReader().

trish
Télécharger la présentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Высокоуровневые методы информатики и программированияЛекция 28 • Отсоединенный режим работы ADO.Net

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

  3. Наша программа Читаем в цикле используя операцию [ ] DataReader ExecuteScalar() - получаем одно значение ExecuteReader() • SQL Insert, Update, Delete • хранимая процедура Command Command • SQL Select • хранимая процедура ExecuteNonQuery() Connection БД : MS SQL Server, Oracle, MS Access, Foxpro, DBase и т.п.

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

  5. Использование классов ADO.NET ExecuteReader Data Base Command DataReader Connection Read Update, Insert, Delete DataAdapter Provider SQL Server организации ExecuteXxx Fill Update Client Program DataSet Компьютер пользователя

  6. Класс DataSet • Объекты класса DataSetпозволяют создать базу данных в оперативной памяти. • Данные извлекаются из базы данных и сохраняются в объекте DataSet. • Объект DataSetсодержит набор данных отсоединенных от БД. • Затем программа может изменять эти данные • Обновления сделанные в DataSetдолжны быть занесены обратно в БД для того, чтобы сохранить их постоянно. • Класс DataSetявляется одним для всех провайдеров по работе с БД. • Объекты класса DataSetвключают объекты DataTable (таблицы данных) и DataRelation (связи между таблицами). • Для заполнения объекта DataSetиспользуется класс DataAdapterиз провайдера.

  7. Наша программа DataTable DataTable DataTable DataSet Метод Fill() Метод Update() Command Command DataAdapter DataAdapter DataAdapter Command Command Connection ExecuteNonQuery() БД : MS SQL Server, Oracle, MS Access, Foxpro, DBase и т.п.

  8. Конструкторы класса DataSet • DataSet ds = new DataSet(); • DataSet ds = new DataSet("MyDataSet");

  9. DataTable .Columns[..] .Rows[..] DataTable .Columns[...] .Rows[...] .DefaultView ... schema DataColumn DataColumn DataRow данные DataRow DataRelation DataRelation Структура класса DataSet DataSet .Tables[...] .Relations[...] ... DataView

  10. Свойства класса DataSet Основные: • Tables – коллекция таблиц DataTable • Relations – коллекция отношений DataRelation Дополнительные свойства: • ExtendedProperties– коллекция дополнительных свойств (имя, значение) • CaseSensitive– указывает, будет ли при сравнении строк в DataTable объектах учитываться регистр (большие и маленькие символы). • DataSetName – дружественное имя данного DataSet. Обычно задается в конструкторе класса. • EnforceConstraints – получает или задает значение указывающее на то, будут ли учитываться ограничивающие правила (constraintrules) при попытке выполнить любую операцию обновления. • HasErrors – получить значение указывающее на наличие ошибок в любой строке любой таблицы DataTables данного DataSet. • RemotingFormat – позволяет определить то, как будет сериализоваться содержание DataSet (binary или XML).

  11. Основные методы 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 в поток.

  12. Создание и заполнение таблицы с помощью 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");

  13. Использование классов ADO.NET ExecuteReader Data Base Command DataReader Connection Read Select Update, Insert, Delete DataAdapter Provider SQL Server организации ExecuteXxx Fill Update Client Program DataSet Компьютер пользователя

  14. КлассDataAdapter • Для организации взаимодействия DataSetс БД. • Организует взаимодействие одной таблицыDataSet с базой данных • Свойства • SelectCommandсодержит SQL SELECT оператор • InsertCommandсодержат SQL INSERT • UpdateCommandсодержат SQL UPDATE • DeleteCommandсодержат SQLDELETE операторы • Методы • Fill(ds)использует соединение для заполнения DataSet данными • Первый параметр – объект DataSet • Второй (необязательный) – название создаваемой таблицы • Update()посылает исправленные в DataSet данныев БД • Параметр – объект DataSet

  15. Конструкторы класса DataAdapter • Конструктор класса DataAdapterявляется перегруженным: • без параметров SqlDataAdapterda = new SqlDataAdapter(); • с одним параметром – объектом Command: SqlDataAdapterda = new SqlDataAdapter(cmd); • с двумя параметрами – SQL оператором и объектом Connection: SqlDataAdapterda = new SqlDataAdapter(sql, conn); • с двумя параметрами – SQL оператором и строкой соединения: SqlDataAdapterda = new SqlDataAdapter(sql, connString); • Параметры: • conn – объект Connection; • connString – строка соединения. • sql – оператор языка SQL; • cmd– объект Command;

  16. Методы Fill() и Update() • Метод int Fill(): • int Fill (DataSetds) – в DataSetсоздается и заполняется данными таблица БД (к данной таблице можно обращаться только по номеру); • int Fill (DataTabledt) – заносит в таблицу схему и данные; • int Fill (DataSetds, string srcTable) – в DataSetсоздается и заполняется данными таблица с именем srcTable (к данной таблице можно обращаться только по имени); • Метод int Update(): • int Update(DataSetds)– в БД сохраняются изменения всех таблиц DataSet; • int Update(DataSetds, string srcTable) – в БД сохраняются изменения таблицs с данным именем; • int Update(DataRow[] drs) – в БД сохраняются изменения сделанные в записях из массива.

  17. Последовательность работы с DataAdapter • Создать объект Connection. • Создать экземпляр класса и задать объект Commandс SQL командой Select. • Создать объект класса CommandBuilder и построитьв DataAdapter команды Insert, Updateи Delete. • Вызвать для DataAdapter метод Fill(), в который передать объект DataSet. • Выполнять работу с DataSet • После окончания работы вызвать для DataAdapter метод Update(), в котором передается использованный объект DataSet.

  18. Пример 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]); }

  19. КлассCommandBuilder • Данный класс используется для упрощения создания набора SQL команд. • Может применяться, когда используется оператор Selectдля одной таблицы БД. • По заданной в DataAdapterSQL команде selectсоздаются соответствующие ей команды • InsertCommandсодержат SQL INSERT • UpdateCommandсодержат SQL UPDATE • DeleteCommandсодержат SQLDELETE операторы • Эти команды требуются для выполнения метода Update (перенесение всех изменений из DataSet в БД). • Для создания новых команд нужно создать объект класса CommandBuilderи передать ему в качестве параметра объект DataAdapter. • Например: SqlCommandBuilderсв = new SqlCommandBuilder(da);

  20. Пример использования объекта DataAdapter // создаем DataAdapter SqlDataAdapterda = newOleDbDataAdapter (“select ProductID, ProductName, UnitPrice from Products”, conn); // автоматически строим командыInsert, Update,Delete SqlCommandBuilder 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”);

  21. Класс DataTable • Полное имя класса System.Data.DataTable. • Концептуально аналогичен таблице в БД. • Содержит две коллекции: • строк Rows; • столбцов Columns – объекты с описаниями полей записей. • Может использоваться, для представления самостоятельной таблицы или таблицы в DataSet. • Для получения значений колонок таблицы можно использовать индексаторы tbl[i][j], где • i – номер строки; • j – номер колонки (можно задать и название колонки). • Например: DataTabletbl; … int n = tbl.Rows[i][j]

  22. Класс DataColumn • Ссылки на объекты данного класса можно получить из таблицы Columnsс помощью индекса или с помощью названия колонки: DataSetds = new DataSet(); // заполняем DataColumncol = ds.Columns["ContactName"]; DataColumncol = ds.Columns[2]; • Для получения в записи Row значению поля из колонки colможно получить следующим образом: DataRow r = ds.Table[0].Rows[0]; r[0] = 1; r[“CustomerID”] = 1; DataColumncol = ds.Columns[“CustomerID"]; r[col] = 1;

  23. Классзаписей DataRow • Объект класса DataRow Запись (строка, data row) представляет собой запись данных из таблицы, в коллекции которой он хранится. • Записям таблицы DataTable хранятся в коллекции Rows. • Записи можно программно • добавлять к коллекции(add), • обновлять (update), • удалять из коллекции (delete). • Для получения доступа кконкретной записи используется операция [] с индексом. • Например, если dtявляется таблицей данных, то вторую запись можно получить следующим образом: DataRow row = dt.Rows[2];

  24. Класс 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(“имя таблицы”)

  25. Пример задания связи между записями • Задание связи Relationship с именем "RelOrdDet" между полями Orders.OrderIDи OrderDetails.OrderID using System.Data; … DataRelationrelOrdDet; 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";

  26. Объект DataSet

  27. Работа с данными в DataSet • Чтение данных • Изменение данных • Добавление записей в данные • Сортировка записей • Удаление данных

  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) { …. }

  29. Добавления записи в таблицу DataTable • Для добавления новой записи к таблице необходимо выполнить следующие действия: • Создать с помощью метода NewRow()класса DataTableпустую запись имеющую структуру, соответствующую данной таблице (число и тип полей). • Например: DataRow row = tbl.NewRow (); • Занести данные в поля созданной записи. • Например: row[“id”] = 44; row[“authir”] = “Терентьев И.А.”; row[“year”] = 2003; • Сохранить новую запись в коллекции Rowsтаблицы. • Например: tbl.Rows.Add(row);

  30. Пример добавления записи в таблицу DataTable // создаем dataset DataSetds = new DataSet(); // заполняем dataset данными для таблицы MyBooks … // получаем ссылку на таблицу MyBooks DataTabletbl = ds.Tables[“MyBooks”]; // создаем новую запись для данной таблицы DataRow row = tbl.NewRow (); // задаем значения полей row[“id”] = 44; row[“authir”] = “Терентьев И.А.”; row[“year”] = 2003; // заносим новую запись в таблицу tbl.Rows.Add(row); // сохраняем изменения в базу данных ad.Update(tbl);

  31. Удаление записей из таблицы DataTable • Для удаления записей можно использовать метод Remove()коллекции Rows: • Например: DataRow row = table.Rows[5]; table.Rows.Remove(row); • Для удаления записей можно использовать метод Delete() объекта DataRaw: • Например: DataRow row = table.Rows[5]; row.Delete();

  32. Класс представление таблицы DataView • Объект DataViewэто просмотр записей в объекте DataTable, с помощью фильтра и сортировки. • Конструктор класса DataView: // myDT – таблица данных DataViewmyDV = new DataView(myDT); • Свойство сортировки элементов Sort: • myDV.Sort = “имя поля”; • Можно несколько полей (через запятую) • Можно в обратном порядке (DESC) • Например: myDV.Sort = “ID, Name”; • Свойство отбора элементов (фильтр)RowFilterзадается в виде условия, в представление будут выбираться только элементы, которые удовлетворяют данному условию. • Например myDV.RowFilter = “City = ‘Tomsk’”; • Объект DataViewможно связать с элементами графического интерфейса, например, DataGridView. • Например: DataGridViewdgv = new DataGridView(); dgv.DataSource = myDV;

  33. Пример создания и связывания DataView с ЭУDataGridView //создаем DataView DataView view = newDataView(employee); //задаем правило отбора view.RowFilter = "LastName like 'A%' and Salary > 15"; //задаем порядок сортировки view.Sort = "LastName ASC, FirstName ASC, Salary DESC"; //связываем элемент управления с DataView dgv.DataSource = view;

  34. Совпадение изменений БД • Призанесенииизменений в БД могутвозникатьконфликты между разными пользователями. Например, два пользователя могут пытаться изменить одну и ту же запись в БД. • Как БД разрешает такие конфликты? Данные какого пользователя должны заносить первыми, какого – вторыми, и должны ли они вовсе заноситься? • Ответ не совсем однозначен. Все зависит от множества факторов. • However, ADO.NET provides a fundamental level of concurrency controlthat’s designed to prevent update anomalies. The details are beyond the scope of thisbook, but the following is a good conceptual start. • Basically, a dataset marks all added, modified, and deleted rows. If a row is propagatedto 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 optimisticconcurrency and is essentially the job of the data adapter. • When the Update methodis called, the data adapter attempts to reconcile all changes. This works well in an environmentwhere 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 formof locking to guarantee data integrity. • Disconnected processing with optimistic concurrency is essential to successfulmultitier systems. How to employ it most effectively given the pessimistic concurrency ofDBMSs is a thorny problem. Don’t worry about it now, but keep in mind that many issuesexist, and the more complex your application, the more likely you’ll have to become anexpert in concurrency.

More Related