Доступ к данным при помощи ADO.NET

Содержание

Слайд 2

Цель Узнать о базовом доступе к данным при помощи классов ADO.NET.

Цель

Узнать о базовом доступе к данным при помощи классов ADO.NET.
Познакомиться с

моделью данных, сохраняемых в базе.
Разработать простое приложение CRUD.
Слайд 3

Классы ADO.NET Классы конкретных поставщиков данных (находятся в пространствах имен System.Data.OleDb,

Классы ADO.NET

Классы конкретных поставщиков данных (находятся в пространствах имен System.Data.OleDb,

System.Data.SqlClient, и т.п.)
Классы для автономной работы с данными (находятся в пространствах имен System.Data и System.Data.Common)
Слайд 4

Классы поставщиков данных Для поставщика SqlClient это: SqlConnection, SqlCommand, SqlDataReader, SqlDataAdapter.

Классы поставщиков данных

Для поставщика SqlClient это:
SqlConnection,
SqlCommand,
SqlDataReader,
SqlDataAdapter.

Все классы поставщиков наследуют

абстрактных предков, например,
DBConnection ? SqlConnection, DBCommand ? SqlCommand

Для поставщика SqlServerCe это:
SqlCeConnection,
SqlCeCommand,
SqlCeDataReader,
SqlCeDataAdapter.

Слайд 5

Класс Connection Устанавливает соединение с хранилищем данных методом Open(). Основное свойство

Класс Connection

Устанавливает соединение с хранилищем данных методом Open(). Основное свойство –

ConnectionString – строка соединения.
Позволяет начать транзакцию методом BeginTransaction() (завершение или откат транзакции выполняются методами объекта Transaction, который возвращает BeginTransaction()).


string conStr = "Data Source=|DataDirectory|GB.sdf";
SqlCeConnection connection = new SqlCeConnection(conStr);

На сайте http://www.connectionstrings.com/ можно найти примеры разнообразных строк соединения

Слайд 6

Класс Command Представляет собой SQL-оператор или хранимую процедуру. Sql-команда формируется свойствами

Класс 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);

Слайд 7

Класс DataReader using (SqlCeDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection)) { while (reader.Read()) {

Класс DataReader

using (SqlCeDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection))
{
while (reader.Read()) {
Id

= (int)reader["Id"];
}
}

Позволяет только читать данные из хранилища и только в одном направлении.
Собственно чтение выполняет метод Read().

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

Слайд 8

Пример В базе данных есть таблица Records

Пример

В базе данных есть таблица Records

Слайд 9

Получить коллекцию записей string conStr = "Data Source=|DataDirectory|GB.sdf"; SqlCeConnection connection =

Получить коллекцию записей

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 result = new List();
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);
}
}
Слайд 10

Приложение GuestBook – гостевая книга Разработать приложение «Гостевая книга» Каждый желающий

Приложение GuestBook – гостевая книга

Разработать приложение «Гостевая книга»
Каждый желающий может сделать

запись в гостевой книге, нужно только ввести текст записи и свое имя. Все могут читать внесенные записи. Гостевая книга хранится в базе данных.
Дополнительно: записи можно упорядочивать и фильтровать по вхождению заданной подстроки в имя гостя или в текст записи.
Слайд 11

GuestBook. Главная страница Создадим приложение MVC 4 (Basic). Назовем его GuestBook.

GuestBook. Главная страница

Создадим приложение MVC 4 (Basic). Назовем его GuestBook.

Слайд 12

Модель public class Record { public int Id { set; get;

Модель

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.

Слайд 13

SqlServer CE 4.0 SqlServer CE 4.0 представляет собой исполняемую программу, которая

SqlServer CE 4.0

SqlServer CE 4.0 представляет собой исполняемую программу, которая просто

копируется в каталог bin веб-приложения, никакого другого развертывания не требуется.
Сервер поддерживает многопоточные запросы, поэтому может использоваться в небольших ASP.NET приложениях.
SqlServer CE допускает тот же доступ к данным, что и полная версия (ADO.NET, EF), но не имеет хранимых процедур и представлений.
Бесплатен.
Слайд 14

Загрузка пакета через NuGet Microsoft SQL Server Compact Edition

Загрузка пакета через NuGet

Microsoft SQL Server Compact Edition

Слайд 15

Схема данных Добавим в каталог App_Data базу данных в формате .sdf .

Схема данных

Добавим в каталог App_Data базу данных в формате .sdf .

Слайд 16

Одним из важнейших аспектов проектирования приложения является выбор архитектуры. Классическим примером

Одним из важнейших аспектов проектирования приложения является выбор архитектуры.
Классическим примером является

многослйная архитектура.
На самом верху – уровень представления (Presentation Layer):
Предназначен для взаимодействия с пользователем.
За уровнем представления следует уровень бизнес логики (Business Logic Layer):
Осуществляет логическую обработку поступающих команд и бизнес правил.
В самом низу располагается уровень доступа к данным (Data Access Layer):
Осуществляет доступ к хранилищу данных в двустороннем направлении.

Многослйная архитектура

Слайд 17

Слой доступа к данным В слое доступа всю техническую работу по

Слой доступа к данным

В слое доступа всю техническую работу по общению

с базой будут выполнять классы ADO.NET
Слайд 18

Cлой доступа к данным public class Repository { public string conStr

Cлой доступа к данным

public class Repository
{
public string conStr

= "Data Source=|DataDirectory|GB.sdf";
public List GetRecords() {
SqlCeConnection connection = new SqlCeConnection(conStr);
string commandString = "SELECT Id, Text, Author, RecordDate FROM Records";
SqlCeCommand command = new SqlCeCommand(commandString, connection);
connection.Open();
//
List result = new List();
//
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 – класс без состояния с интерфейсом, подобным коллекции.

Слайд 19

Слой доступа к данным Метод Create() public void CreateRecord(Record record) {

Слой доступа к данным

Метод 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-инъекций.

Слайд 20

SQL-инъекции Если вместо параметризованной формы команды "INSERT INTO Records (Text) VALUES

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--)"
; - граница начала нового оператора
-- - коментирует оставшуюся часть оператора.
Слайд 21

Строка соединения в web.config connectionString="Data Source=|DataDirectory|GB.sdf" providerName="System.Data.SqlServerCe.4.0" /> public string conStr

Строка соединения в web.config


connectionString="Data Source=|DataDirectory|GB.sdf"

providerName="System.Data.SqlServerCe.4.0" />

public string conStr = "Data Source=|DataDirectory|GB.sdf";
public string conStr =
WebConfigurationManager.ConnectionStrings["GB"].ConnectionString;

Изменение в классе Repository:

Хранение строки соединения в web.config, позволяет изменять параметры соединения без перекомпиляции приложения.

WebConfigurationManager – класс для работы с файлами конфигурации web приложения.

Слайд 22

Контроллер Home Repository repository = new Repository(); public ActionResult Index() { return View(repository.Read); }

Контроллер Home

Repository repository = new Repository();
public ActionResult Index()
{

return View(repository.Read);
}
Слайд 23

Представление Home/Index public ActionResult Index() { return View(new Repository().Read()); }

Представление Home/Index

public ActionResult Index()
{
return View(new Repository().Read());
}

Слайд 24

Методы HomeController.Create() Два метода Create() в HomeController // // GET: /Home/Create

Методы 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();
}
}
Слайд 25

Различие между GET и POST

Различие между GET и POST

Слайд 26

Представление Home/Create Типизированное представление дает возможность сгруппировать данные, внесенные в форму

Представление Home/Create

Типизированное представление дает возможность сгруппировать данные, внесенные в форму пользователем,

в объект Record и передать его во второй метод Create().