Доступ к данным при помощи ado.net
DESCRIPTION
Доступ к данным при помощи ADO.NET. ASP . NET MVC 4.0 2014. Цель. Узнать о базовом доступе к данным при помощи классов ADO.NET. Познакомиться с моделью данных, сохраняемых в базе. Разработать простое приложение CRUD. Унификация доступа. Поставщики Источники. Программа. MS SQL. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/1.jpg)
Доступ к данным при помощи ADO.NET
ASP.NET MVC 4.02014
![Page 2: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/2.jpg)
2
Цель
• Узнать о базовом доступе к данным при помощи классов ADO.NET.
• Познакомиться с моделью данных, сохраняемых в базе.
• Разработать простое приложение CRUD.
![Page 3: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/3.jpg)
3
Унификация доступаПоставщики Источники
MS SQL
My SQL
Программа Oracle
![Page 4: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/4.jpg)
4
Классы ADO.NET
• Классы конкретных поставщиков данных (находятся в пространствах имен System.Data.OleDb,
System.Data.SqlClient, и т.п.)
• Классы для автономной работы с данными (находятся в пространствах имен System.Data и System.Data.Common)
![Page 5: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/5.jpg)
5
Классы поставщиков данных
Для поставщика SqlClient это:• SqlConnection,• SqlCommand, • SqlDataReader, • SqlDataAdapter.
Программа
ОбъектDataReader
ОбъектCommand
ОбъектConnection БД
Для поставщика SqlServerCe это:• SqlCeConnection,• SqlCeCommand, • SqlCeDataReader, • SqlCeDataAdapter.
![Page 6: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/6.jpg)
6
Класс Connection• Устанавливает соединение с хранилищем данных методом Open().
Основное свойство – ConnectionString – строка соединения.
• Позволяет начать транзакцию методом BeginTransaction() (завершение или откат транзакции выполняются методами объекта Transaction, который возвращает BeginTransaction()).
string conStr = "Data Source=|DataDirectory|GB.sdf"; SqlCeConnection connection = new SqlCeConnection(conStr);
На сайте http://www.connectionstrings.com/ можно найти примеры разнообразных строк соединения
![Page 7: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/7.jpg)
7
Класс Command• Представляет собой SQL-оператор или хранимую процедуру.
• Sql-команда формируется свойствами CommandText и CommandType.
• Параметры команды устанавливаются коллекцией Parameters.
• Объект Command связывается с объектом соединения свойством Connection.
• Чтобы выполнить команду, нужно использовать один из методов:
ExecuteNonQuery() – для изменения данных,
ExecuteReader() – создает поток DataReader для чтения данных из хранилища,
ExecuteScalar() – создает поток DataReader, из которого читает единственное значение – первый столбец первой строки.
string commandString = "SELECT Id, Text, Author, RecordDate FROM Records";
SqlCeCommand command = new SqlCeCommand(commandString, connection);
![Page 8: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/8.jpg)
8
Класс DataReader
Программа ОбъектDataReader
ОбъектCommand
ОбъектConnection
БД
using (SqlCeDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection)) { while (reader.Read()) { Id = (int)reader["Id"]; }}
Позволяет только читать данные из хранилища и только в одном направлении. Собственно чтение выполняет метод Read().
После открытия потока данных указатель находится перед первой записью.
![Page 9: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/9.jpg)
9
Пример
В базе данных есть таблица Records. Ниже показана ее структура.
![Page 10: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/10.jpg)
10
Получить коллекцию записей
string conStr = "Data Source=|DataDirectory|GB.sdf"; SqlCeConnection connection = new SqlCeConnection(conStr);
string sql = "SELECT Id, Text, Author, RecordDate FROM Records";
SqlCeCommand command = new SqlCeCommand(sql, connection); connection.Open();
List<Record> result = new List<Record>();
using (SqlCeDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection)) { while (reader.Read()) { Record record = new Record() { Id = (int)reader["Id"], Text = (string)reader["Text"], Author = (string)reader["Author"], RecordDate = (DateTime)reader["RecordDate"], }; result.Add(record); } }
![Page 11: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/11.jpg)
11
Приложение GuestBook – гостевая книга
Разработать приложение «Гостевая книга»• Каждый желающий может сделать запись в гостевой книге, нужно только
ввести текст записи и свое имя. Все могут читать внесенные записи. Гостевая книга хранится в базе данных.
• Дополнительно: записи можно упорядочивать и фильтровать по вхождению заданной подстроки в имя гостя или в текст записи.
![Page 12: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/12.jpg)
12
GuestBook. Главная страница
Создадим приложение MVC 4 (Basic). Назовем его GuestBook.
![Page 13: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/13.jpg)
13
Модель
public class Record { public int Id { set; get; } public string Text { set; get; } public string Author { set; get; } public DateTime RecordDate { set; get; } }
Модель гостевой книги представляет собой коллекцию объектов Record.
В качестве СУБД используем SqlServer CE 4.0 или SqlExpress.
![Page 14: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/14.jpg)
14
SqlServer CE 4.0
• SqlServer CE 4.0 представляет собой исполняемую программу, которая просто копируется в каталог bin веб-приложения, никакого другого развертывания не требуется.
• Сервер поддерживает многопоточные запросы, поэтому может использоваться в небольших ASP.NET приложениях.
• SqlServer CE допускает тот же доступ к данным, что и полная версия (ADO.NET, EF), но не имеет хранимых процедур и представлений.
• Бесплатен.
![Page 15: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/15.jpg)
15
Загрузка пакета через NuGet
PM> Install-Package SqlServerCompact
![Page 16: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/16.jpg)
16
Схема данных
Добавим в каталог App_Data базу данных в формате .sdf .
![Page 17: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/17.jpg)
17
Одним из важных этапов проектирования приложения является выбор архитектуры.
Классическим примером является многослойная архитектура.
На самом верху – уровень представления (Presentation Layer):Предназначен для взаимодействия с пользователем.
За уровнем представления следует уровень бизнес логики (Business Logic Layer):
Осуществляет логическую обработку поступающих команд и бизнес правил.
В самом низу располагается уровень доступа к данным (Data Access Layer):Осуществляет доступ к хранилищу данных в двустороннем направлении.
Многослйная архитектура
V
M
DAL
![Page 18: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/18.jpg)
18
Cлой доступа к данным public class Repository { public string conStr = "Data Source=|DataDirectory|GB.sdf";
public List<Record> GetRecords() { SqlCeConnection connection = new SqlCeConnection(conStr); string commandString = "SELECT Id, Text, Author, RecordDate FROM Records"; SqlCeCommand command = new SqlCeCommand(commandString, connection); connection.Open(); // List<Record> result = new List<Record>(); // using (SqlCeDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection)) { while (reader.Read()) { Record record = new Record() { Id = (int)reader["Id"], Text = (string)reader["Text"], Author = (string)reader["Author"], RecordDate = (DateTime)reader["RecordDate"], }; result.Add(record); } } return result; } }
Слой доступа выполнен по шаблону Repository – класс без состояния с интерфейсом, подобным коллекции.
![Page 19: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/19.jpg)
19
Слой доступа к даннымМетод Create() public void CreateRecord(Record record) { string commandString = @"INSERT INTO Records (Text, Author, RecordDate) VALUES (@Text, @Author, @RecordDate) "; using (SqlCeConnection connection = new SqlCeConnection(conStr)) {
SqlCeCommand command = new SqlCeCommand(commandString, connection); command.Parameters.AddWithValue("@Text", record.Text); command.Parameters.AddWithValue("@Author", record.Author); command.Parameters.AddWithValue("@RecordDate", record.RecordDate); connection.Open(); command.ExecuteNonQuery();
} }
Класс Command имеет коллекцию параметров.Параметризованные команды выполняются быстрее и позволяют избежать sql-инъекций.
![Page 20: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/20.jpg)
20
SQL-инъекцииЕсли вместо параметризованной формы команды
"INSERT INTO Records (Text) VALUES (@Text)"
использовать конкатенацию строк,
"INSERT INTO Records (Text) VALUES (" + text + ")"
то при определенных значениях строки text, например,
text = "'a'); DELETE * FROM Records--"
может получиться вредоносный код
"INSERT INTO Records (Text) VALUES ('a'); DELETE * FROM Records--)"
----------------------------------------------------------------; - граница начала нового оператора-- - комментирует оставшуюся часть оператора.
![Page 21: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/21.jpg)
21
Строка соединения в web.config
<connectionStrings> <add name="GB" connectionString="Data Source=|DataDirectory|GB.sdf" providerName="System.Data.SqlServerCe.4.0" /> </connectionStrings>
public string conStr = "Data Source=|DataDirectory|GB.sdf";
public string conStr = WebConfigurationManager.ConnectionStrings["GB"].ConnectionString;
Изменение в классе Repository:
Хранение строки соединения в web.config, позволяет изменять параметры соединения без перекомпиляции приложения.
WebConfigurationManager – класс для работы с файлами конфигурации web приложения.
![Page 22: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/22.jpg)
22
Контроллер Home
Repository repository = new Repository();
public ActionResult Index() { return View(repository.Read); }
![Page 23: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/23.jpg)
23
Представление Home/Index public ActionResult Index() { return View(new Repository().Read()); }
Метод контроллера
![Page 24: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/24.jpg)
24
Методы HomeController.Create()
Два метода Create() в HomeController:
// // GET: /Home/Create public ActionResult Create() { return View(); }
// // POST: /Home/Create [HttpPost] public ActionResult Create(Record record) { try { repository.Create(record); return RedirectToAction("Index"); } catch { return View(); } }
![Page 25: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/25.jpg)
25
Различие между GET и POST
GET
POST
В спецификации HTTP/1.1 говорится, что метод лишен действий – только получение запрашиваемой информации
Может выполнять некоторые действия
Запрос может кэшироваться браузером Запрос не кэшируется браузером
Ограниченная длина отправка данных- 8 K Лимит ограничен сервером – около 2 M
Можно увидеть переданные данные в адресной строке
Данные нельзя увидеть воочию
Может передать только ASCII символыМожет передавать любые данные, в том числе двоичные файлы
![Page 26: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/26.jpg)
26
Представление Home/Create
• Типизированное представление дает возможность сгруппировать данные, внесенные в форму пользователем, в объект Record и передать его во второй метод Create().
![Page 27: Доступ к данным при помощи ADO.NET](https://reader035.vdocuments.net/reader035/viewer/2022081514/5681362f550346895d9daaf3/html5/thumbnails/27.jpg)
27
СамостоятельноЗакончить гостевую книгу, сделав:
Удаление записей.Изменение записей.Проверку ввода.