ADOnet access.pptx
- Количество слайдов: 42
ADO. NET Access
Проблемы ADO До недавних пор применялся доступ к данным через постоянное соединение с источником данных. Недостатки такого подхода стали выявляться после появления приложений, ориентированных на Интернет. Хотя постоянное соединение и позволяет немного ускорить работу приложения, общий убыток от растраты системных ресурсов преимущество в скорости выполнения приложения сводит на нет. Соединение с парой клиентов обслуживается приложением хорошо, 10 клиентов обслуживаются хуже, 100 – много хуже. . . В ADO. NET используется другая модель доступа – доступ к отсоединенным данным. При этом соединение устанавливается лишь на то время, которое необходимо для проведения определенной операции над базой данных. 2
ADO. NET. Объектная модель 3
ADO. NET. Классы подсоединенных объектов • Connection – уникальный сеанс работы с БД • Command – выполняет SQL-операторы и хранимые процедуры над источником данных • Data. Reader – последовательный доступ только на чтение к результату запроса • Data. Adapter – наполнение отсоединенного набора данных(Data. Set) и внесение изменений в БД из Data. Set) 4
ADO. NET. Классы отсоединенных объектов • Data. Set (локальный набор данных)– реляционная БД в оперативной памяти • Data. Table – таблица в ОП • Data. Column – столбец локальной таблицы • Data. Row – строка локальной таблицы • Data. View – представление с возможностью навигации, поиска, сортировки и редактирования • Data. Relation – связь родитель/потомок между. Table в Data. Set • Constraint – ограничение на один или несколько столбцов для поддержания целостности 5
Провайдеры данных для Access 1. Microsoft Jet 4. 0. oledb Provider 2. Microsoft Office 12. 0 Access Database Engine Oledb Provider Графические интерфейсы для подключения не вполне доработаны в Win 7, в частности, есть специфика 32 разрядной и 64 разрядной версий. C: Windowssyswow 64rundll 32. exe "C: Program Files (x 86)Common FilesSystemOle DBoledb 32. dll", Open. DSLFile %CD%Podkl. udl Файл UDL [oledb] ; Everything after this line is an OLE DB initstring Provider=Microsoft. ACE. OLEDB. 12. 0; Data Source=G: WorkПредметыУДuch 2. accdb; Persist Security Info=False 6
Провайдеры данных для MS SQL Server • SQL Server. NET Data Provider – собственный провайдер для подключения к БД SQL Server ; • OLE DB. NET Data Provider - управляемый провайдер для источников данных OLE DB. Немного уступает по эффективности SQL Server. NET Data Provider, так как взаимодействует с базой данных через уровень OLE DB; • ODBC. NET Data Provider 7
Connection (тип Ole. Db. Connection) представляет соединение с источником (базой) данных и обеспечивает подключение к базе данных. Свойство Connection. String – параметры подключения: • Provider • Пользователь • Пароль • База данных и др. Provider=Microsoft. ACE. OLEDB. 12. 0; Data Source=G: WorkПредметыУДuch 2. accdb; Persist Security Info=False Методы Open(), Close(). 8
Пример (Access) string strconn = string. Format("Provider=Microsoft. ACE. OLEDB. 12. 0; Data Source={0}; ", text. Box 1. Text); Состояние Ole. Db. Connection My. Conn = new Ole. Db. Connection(strconn); соединения My. Conn. Open(); Message. Box. Show(Convert. To. String(My. Conn. State)); My. Conn. Close(); Message. Box. Show(Convert. To. String(My. Conn. State)); 9
Пример (MS SQL Server) string strconn = string. Format("Provider= sql. Ole. Db; Data Source={0}; Initial Catalog = {1}; User ID= {2}; Password = {3}", text. Box 4. Text, text. Box 1. Text, text. Box 2. Text, text. Box 3. Text); 10
Объекты Command, Data. Reader Объект Command предназначен для передачи команд серверу. Он имеет методы: • Execute. None – не возвращает значений. Используется для создания баз данных, таблиц и других объектов БД; изменения их структуры • Execute. Scalar – возвращает одно значение • Execute. Reader – возвращает объект Data. Reader - набор записей, который читаются с помощью метода Read() Основное свойство Command – Command. Text текст команды 11
Пример. Форма 12
Пример. Command. Execute. Non. Query. (Код) Создание таблицы … My. Conn. Open(); Ole. Db. Command my. Command = My. Conn. Create. Command(); my. Command. Text = "create table udal (p 1 int primary key, p 2 character varying); "; try { my. Command. Execute. Non. Query(); Message. Box. Show("Выполнено!", "Информация", Message. Box. Buttons. OK, Message. Box. Icon. Information); } finally { My. Conn. Dispose(); } 13
Пример. Command. Execute. Non. Query. (Код) Добавление записей … My. Conn. Open(); Ole. Db. Command my. Command = My. Conn. Create. Command(); try { my. Command. Text = "INSERT INTO udal VALUES(1, 'Дзю'); "; my. Command. Execute. Non. Query(); my. Command. Text = "INSERT INTO udal VALUES(2, 'Ли'); "; my. Command. Execute. Non. Query(); my. Command. Text = "INSERT INTO udal VALUES(3, 'Зуан'); "; my. Command. Execute. Non. Query(); Message. Box. Show("Выполнено!", "Информация", Message. Box. Buttons. OK, Message. Box. Icon. Information); } finally … 14
Пример. Command. Execute. Non. Query. (Код) Изменение записи … my. Command. Text = "Update udal set p 2='Деточкин' WHERE P 1=1; "; my. Command. Execute. Non. Query(); … Удаление таблицы … my. Command. Text = "drop table udal; "; my. Command. Execute. Non. Query(); … 15
Пример. Command. Execute. Scalar. (Код) string strconn = string. Format("Provider=Microsoft. ACE. OLEDB. 12. 0; Data Source={0}; ", text. Box 1. Text); Ole. Db. Connection cnn = new Ole. Db. Connection(strconn); cnn. Open(); Ole. Db. Command my. Command = new Ole. Db. Command("select count(*) from Поставщик; ", cnn); try { label 3. Text = "Записей " + Convert. To. String(my. Command. Execute. Scalar()); } finally { cnn. Dispose(); } 16
Чтение данных из БД. Объект Data. Reader … cnn. Open(); Ole. Db. Command my. Command = cnn. Create. Command(); my. Command. Text = "SELECT * FROM Поставщик; "; string str. L = ""; try { Ole. Db. Data. Reader mydata. Reader = my. Command. Execute. Reader(); if (mydata. Reader. Has. Rows) //есть ли записи? { label 3. Text = Convert. To. String(mydata. Reader. Get. Name(0)) + " " + Convert. To. String(mydata. Reader. Get. Name(1)) + " " + Convert. To. String(mydata. Reader. Get. Name(2)); list. Box 1. Items. Clear(); while (mydata. Reader. Read()) 17
{ str. L = ""; for (int i = 0; i < mydata. Reader. Field. Count; i++) //перебор полей { str. L += " " + Convert. To. String(mydata. Reader[i]); //обращение к полю } list. Box 1. Items. Add(str. L); combo. Box 1. Items. Add(str. L); } else { Message. Box. Show("Записей нет"); } mydata. Reader. Close(); //Data. Reader всегда надо закрывать, иначе Connection будет занят! } finally 18
Объект Data. Set содержит в качестве свойства коллекцию Tables – объектов Data. Table. Data. View создается на основе Data. Table и имеет методы для поиска и сортировки данных. Data. Set Data. Table Data. View Различают нетипизированные и строго типизированные Dataset Data. Row Data. Column Constraint Типизированные наборы данных имеют устойчивую структуру, отражаемую в схеме набора данных (файле с расширением. xsd) Data. Relation 19
Типизированный Dataset Преимущества типизированного Dataset Структура типизированного Data. Set известна на этапе проектирования. Это ускоряет процесс разработки клиента и уменьшает вероятность ошибки В большинстве случаев код проще и выполняется быстрее Проще взаимодействие с EF Пример обращения к полям таблиц нетипизированного и типизированного Data. Set: string Имя = (string)my. DS 1. Tables[“sotr"]. Rows[2][“i"]; string Имя = my. DS 1. sotr[2]. i; Третья строка 20
Dataset. Работа в отсоединенном режиме 21
Связь с источником данных. Класс Data. Adapter Объект Data. Adapter — один из важнейших элементов ADO. NET. Этот объект является посредником между источником данных и набором данных Data. Set. В приложениях Data. Adapter обеспечивает считывание информации из базы данных и пересылку ее в Data. Set, возврат изменений, сделанных пользователем, в исходную базу данных. Объект Data. Adapter может работать не только с базами данных, он способен связать объект Data. Set с любым источником и набором данных. В одном объекте Data. Set с помощью нескольких адаптеров данных можно свести информацию из различных БД 22
er 1 Data. Adapt БД 1 MS SQLServer Dataset Data. A d apter 2 Клиент БД 2 Access Серверы 23
Может быть и другая ситуация, когда на основе одного источника создается несколько наборов данных. Адаптеры данных относятся к подсоединенным объектам, они зависят от поставщика данных. В Access адаптер данных реализован классом Ole. Db. Data. Adapter. Он имеет несколько конструкторов с различным количеством и типом аргументов: New Ole. Db. Data. Adapter(String sqlзапрос, String строка_подключения); New Ole. Db. Data. Adapter(String sqlзапрос, Ole. Db. Connection mycn); New Ole. Db. Data. Adapter(Ole. Db. Command my. Cmd). Обычно объект Data. Adapter создается для каждой таблицы. Соответствие между таблицами и полями источника и объекта Data. Set устанавливается либо по умолчанию, либо с использованием свойств Table. Mappings и Column. Mappings адаптера данных. 24
Заполнение данными набора данных. Метод Fill Для заполнения объекта Data. Set данными из источника данных используется метод Fill объекта Data. Adapter. Он имеет несколько перегрузок, вот некоторые из них: • public int Fill( Data. Set my. DS ); - с указанием набора данных; • public int Fill( Data. Set my. DS, string mydata. Table. Name); - с указанием набора данных и таблицы, которая должна уже быть в наборе данных; • public int Fill( Data. Set my. DS, int start. Record, int max. Records, string src. Table ); Последняя разновидность отличается тем, что с ее помощью можно «залить» в таблицу набора данных не все записи из таблицы источника, а только часть таких записей. Параметр start. Record задает начальную запись, а параметр max. Records – 25 максимальное число считываемых записей.
Table. Adapter Наряду data. Adapter можно использовать объект Table. Adapter. Этот объект создается автоматически при конструировании данных с помощью графического интерфейса VS. 26
Пример using (Ole. Db. Connection cnn = new global: : System. Data. Ole. Db. Connection()) { cnn. Connection. String = global: : Windows. Forms. Application 1. Properties. Settings. Default. uch 2 Connection. String; string stsql = "SELECT * FROM Поставщик; "; Ole. Db. Data. Adapter da = new Ole. Db. Data. Adapter(stsql, cnn); da. Fill(uch 2 Data. Set, "Поставщики"); data. Grid. View 1. Data. Source = uch 2 Data. Set; data. Grid. View 1. Data. Member = "Поставщики"; 27
uch 2 Data. Set. Поставщики. Primary. Key = new Data. Column[] { uch 2 Data. Set. Поставщики. Columns[0] }; Message. Box. Show("Определен Первичный ключ " + uch 2 Data. Set. Поставщики. Columns[0]. Column. Name); } cnn. Connection. String = global: : Windows. Forms. Application 1. Properties. Settings. Default. uch 2 Connecti on. String; string stsql = "SELECT * FROM Поставщик; "; Ole. Db. Data. Adapter da = new Ole. Db. Data. Adapter(stsql, cnn); Int 32 s = Convert. To. Int 32(text. Box 1. Text); int dl = Convert. To. Int 32(text. Box 2. Text); da. Fill(uch 2 Data. Set, s, dl, "Поставщики"); data. Grid. View 2. Data. Source = uch 2 Data. Set; data. Grid. View 2. Data. Member = "Поставщики"; 28
Объект data. Table Обращение к ячейкам data. Table (типизированный) int ns = Convert. To. Int 32((text. Box 3. Text)); text. Box 4. Text = Convert. To. String(uch 2 Data. Set. Поставщик[ns]. Код_поставщика); text. Box 5. Text = Convert. To. String(uch 2 Data. Set. Поставщик[ns]. ФИО_поставщика); text. Box 6. Text = Convert. To. String(uch 2 Data. Set. Поставщик[ns]. Адрес); 29
Объект data. Table (продолжение) Добавление строки, объект Data. Row Если data. Table связан с data. Grid. View и свойство Allow. User. To. Add. Rows имеет значение True, то добавить запись можно прямо в data. Grid. View Добавление строки программно, пример: Data. Row dr = uch 2 Data. Set. Поставщик. New. Row(); dr["Код_поставщика"] = Convert. To. Int 32(text. Box 4. Text); //777 dr["ФИО_поставщика"] = text. Box 5. Text; // "Бойцов Мусий"; dr["Адрес"] = text. Box 6. Text; //"Адрес"; uch 2 Data. Set. Поставщик. Rows. Add(dr); Замечание. Объект data. Table позволяет использовать метод select для поиска, вычислений, в частности, агрегатных функций. С помощью конструкции вида uch 2 Data. Set. Товары. Columns. Add("Всего", typeof(decimal), "Кол_во_упак*Кол_во_в_упак*Цена_опт"); 30
Строки и столбцы Данные в таблице хранятся в записях. Ссылка на коллекцию записей таблицы возвращается ее свойством Rows. Отдельная запись представляется объектом типа System. Data. Row. Ссылка на коллекцию столбцов таблицы данных возвращается свойством Columns таблицы Характеристики отдельного столбца в структуре таблицы задаются объектом типа System. Data. Column. 31
Поиск записей в локальной таблице • Метод Find() коллекции Data. Row. Collection объекта Data. Table, возвращает строку с заданным значением (значениями) первичного ключа, переданными методу в виде одного объектного аргумента или массива. Для использования метода необходимо, чтобы у локальной таблицы, которой принадлежит коллекция Data. Row. Collection, был определен первичный ключ. • Метод Select() объекта Data. Table возвращает массив объектов Data. Row, удовлетворяющих заданным критериям отбора. По умолчанию строки в массиве упорядочены по значению первичного ключа или, если таковой отсутствует, располагаются в том порядке, в котором они были добавлены в таблицу. У метода есть необязательный аргумент, задающий порядок сортировки. Кроме того, имеется еще один необязательный аргумент, который позволяет отбирать строки с заданным состоянием (определяется значением перечисления Data. View. Row. State). 32
Объект data. View Для фильтрации и сортировки данных в объекте Data. Set используются объекты Data. View. Manager и Data. View. Объект Data. View – представление - создается для локальной таблицы. Для каждой таблицы может быть создано несколько представлений. Представление можно задать в качестве источника данных для data. Grid. View. Сортировка в Data. View выполняется с помощью метода sort, аргументы которого задают порядок сортировки По полям сортировки можно выполнить поиск записей. Для этого применяются методы Find() и Find. Rows(). Find() возвращает индекс первой строки, удовлетворяющей критерию поиска (индекс начинается с 0; в случае отсутствия совпадений возвращается значение -1), а метод Find. Rows() возвращает массив всех подходящих строк (или пустой массив, если ни в одной строке совпадения не найдено). Эти методы работают быстрее, чем метод Find() для таблицы 33
Создание data. View Data. View dv = new Data. View(ds. Tables["Товары"]); //Создание объекта Data. View dv. Sort = "ФИО_Поставщика desc"; // определение поля(полей сортировки). поставщик. Data. Grid. View. Data. Source = dv; //Задание источника данных 34
Состояния записи Состояние записи таблицы данных - свойство System. Data. Row. Version Значение свойства Added Deleted Modified Unchanged Detached Описание Новая строка Строка удалена методом Delete объекта Data. Row Изменено значение хотя бы одного столбца Строка не изменялась Строка не принадлежит таблице 35
Состояния поля записи Свойство System. Data. Row. Version Значение свойства Описание Current Default Текущее значение поля Значение поля по умолчанию Original Исходное значение (на момент считывание из БД) Предполагаемое значение Proposed 36
События, связанные с изменением записей Внесение изменений в записи таблицы данных влечет наступление следующих событий Событие Когда наступает Column. Changing Во время изменения значения столбца Column. Changed После изменения значения столбца Row. Changing Во время изменения записи. Если изменения выполняются вне метода Begin. Edit, то событие генерируется для каждого изменения столбца. Если используется метод Begin. Edit, то событие генерируется при вызове метода End. Edit. Row. Changed После изменения записи Row. Deleting При удалении записи Row. Deleted После удаления записи 37
Некоторые свойства и методы data. Grid. View Для сокрытия полей в объекте data. Grid. View используется синтаксис: поставщик. Data. Grid. View. Columns[2]. Visible = false; Выравнивание, формат чисел, цвет фона поставщик. Data. Grid. View. Columns[2]. Default. Cell. Style. Alignment = Data. Grid. View. Content. Alignment. Middle. Right; // по правому краю поставщик. Data. Grid. View. Columns[0]. Default. Cell. Style. Format = "#. 00"; //формат числа поставщик. Data. Grid. View. Rows. Default. Cell. Style. Back. Color = Color. Bisque; //цвет фона поставщик. Data. Grid. View. Alternating. Rows. Default. Cell. Style. Back. Color = Color. Aquamarine; //альтернативный цвет фона 38
Некоторые свойства и методы data. Grid. View (продолжение) Помимо текстовых, логических полей, полей даты ячейка или столбец data. Grid. View 1 может содержать кнопку. Добавление столбца кнопок: Data. Grid. View. Button. Column cb = new Data. Grid. View. Button. Column(); data. Grid. View 1. Columns. Add(cb); cb. Text = "Нажми на меня"; cb. Name = "кнопки"; cb. Use. Column. Text. For. Button. Value = true; А как написать обработку события щелчка по кнопке? 39
Извлечь данные из Data. Grid. View Программируется событие Cell. Click Message. Box. Show("Вы щелкнули по " + (e. Row. Index + 1) + " -й строке " + (e. Column. Index + 1) + "-й колонке n Содержимое ячейки: " + поставщик. Data. Grid. View[e. Column. Index, e. Row. Index]. Value); 40
Изменение данных в источнике с помощью объекта Data. Adapter Dataset Метод Update() Удаление команды адаптера Data. Adapter Добавление Удаление Изменение Data. Adapter Добавление Data. Table Изменение Data. Table База данных - источник 41
Пример string stsql = "SELECT * FROM Поставщик; "; Ole. Db. Data. Adapter da = new Ole. Db. Data. Adapter(stsql, cnn); da. Insert. Command = new Ole. Db. Command("Insert into Поставщик([Код_поставщика], [ФИО_поставщика], [Адрес]) values(@v 1, @v 2, @v 3)", cnn); da. Insert. Command. Parameters. Add(new Ole. Db. Parameter("v 1", Ole. Db. Type. Integer)); da. Insert. Command. Parameters. Add(new Ole. Db. Parameter("v 2", Ole. Db. Type. Var. Char)); da. Insert. Command. Parameters. Add(new Ole. Db. Parameter("v 3", Ole. Db. Type. Var. Char)); da. Insert. Command. Parameters[0]. Direction = Parameter. Direction. Input; da. Insert. Command. Parameters[1]. Direction = Parameter. Direction. Input; da. Insert. Command. Parameters[2]. Direction = Parameter. Direction. Input; da. Insert. Command. Parameters[0]. Source. Column = "Код_поставщика"; da. Insert. Command. Parameters[1]. Source. Column = "ФИО_поставщика"; da. Insert. Command. Parameters[2]. Source. Column = "Адрес"; 42
ADOnet access.pptx