Вы находитесь на странице: 1из 35

Технология ADO.

NET

ВВЕДЕНИЕ
ADO.NET
2

ADO.NET – это программный интерфейс (API),


предназначенный для обеспечения доступа к
данным.
Поддерживаемые технологии
 SQL Server
 Oracle
 OLE DB
 XML
Модели доступа к данным
3

Присоединенная
 Предполагается наличие постоянного соединения между
источником и приемником данных вне зависимости от
того, осуществляется ли непосредственная передача
данных в текущий момент времени
Отсоединенная
 Соединение устанавливается только на момент обмена
данными
Присоединенная модель
4

Примеры
 Интернет-соединение
 Телефонный разговор
 Чат
 Удаленная хирургия
 Правительственные линии связи
Присоединенная модель
5

Плюсы
 При запросе данных не тратится время на установку
соединения
 Всегда доступны свежие данные
Минусы
 Необходимо постоянное наличие соединения и средств
для его обеспечения
 При отсутствии необходимости передачи данных
соединение все равно остается занятым
Отсоединенная модель
6

Примеры
 Почтовый сервер
 Доступ к web-приложениям
 Библиотека
 Системы контроля версий
Отсоединенная модель
7

Плюсы
 Более низкие требования к соединению
 Можно работать при отсутствии связи
 Можно обработать больше запросов
Минусы
 Больше времени непосредственно на доступ к данным
 Локальная копия данных может быть неактуальной
 Возможно наличие конфликтов
Классы ADO.NET
8

Основные классы доступа к данным


 Connection (SqlConnection)
 Command (SqlCommand)
 Parameter (SqlParameter)
 DataReader (SqlDataReader)
 Transaction (SqlTransaction)
Доступ к базе
9

Порядок действий:
1. Получить строку подключения
2. Создать объект SqlCommand (задать ему строку
подключения, собственно SQL команду, параметры)
3. Установить соединение
4. Скачать или записать данные (выполнить команду)
5. Разорвать соединение
Строка подключения
10

Место хранения:
 Конфигурационный файл
 Ввод данных пользователем
Основные элементы
 Data Source
 Initial Catalog
 Integrated Security
 User ID
 Password
Строка подключений
11

Формат
«Setting1 = Value1; Setting2 = Value2;…»
Пример
“Data Source=.\SqlExpress; Initial Catalog=Northwind; User
ID=User; Password=12345”
“Data Source=Nt-server; Initial Catalog=Base; Integrated
Security=True”
Строка подключения в конфигурационном
файле
12

<?xml version="1.0" encoding="utf-8" ?>


<configuration>
<connectionStrings>
<add name="connectionString" connectionString="Data
Source=Nt-server; Initial Catalog=Base; Integrated
Security=True"/>
</connectionStrings>
</configuration>
Загрузка строки подключения
13

string connectionString =
System.Configuration.ConfigurationManager.
ConnectionStrings["connectionString"].
ConnectionString;
Неправильная установка соединения
14

SqlConnection connection = new


SqlConnection(connectionString);

connection.Open();

// действия с базой

connection.Close();
Правильная установка соединения (вариант 1)
15

try
{
SqlConnection connection = new
SqlConnection(connectionString);
connection.Open();
// действия с базой
}
finally
{
connection.Close();
}
Правильная установка соединения (вариант
2)
16

Интерфейс IDisposable

using(SqlConnection connection = new


SqlConnection(connectionString))
{
connection.Open();
// действия с базой
}
Класс SqlCommand
17

Основные свойства
 CommandText
 CommandType (Storage Procedure, Text, TableDirect)
 Connection
 Parameters
Класс SqlCommand
18

Основные методы
 ExecuteNonQuery (int)
 ExecuteReader (DataReader)
 ExecuteScalar (object)
 ExecuteXmlReader (XmlDataReader)
Класс SqlDataReader
19

Свойства
 FieldCount
 HasRows
Основные методы
 [] параметры int и string
 Get…(int columnNumber)
 NextResult
 Read
Пример
20

string connectionString = System.Configuration.ConfigurationManager.


ConnectionStrings["connectionString"].ConnectionString;
using(SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandType = CommandType.Text;
command.CommandText = "SELECT * FROM users";
connection.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine("{0} - {1}", reader["name"], reader["surname"]);
}
}
SQL Injection
21

Грубейшая ошибка:
command.CommandText = "SELECT * FROM users WHERE name = ‘"
+ txtName + "’";
Причина
Иванов’; DROP TABLE users; SELECT * FROM users WHERE
name=‘user
Правильное решение
command.CommandText = "SELECT * FROM users WHERE name =
@name";
command.Parameters.Add(new SqlParameter("@name",
txtName.Text));
Хранимые процедуры
Трехслойная архитектура
22

Presentation Layer (PL)


Business Logic Layer (BLL)
Data Access Layer (DAL)
Presentation Layer
23

Цели
 Отображение данных пользователю
 Манипуляции, связанные с отображением (сортировка,
фильтрация)
 Получение данных
 Первичная «защита от дурака»
Чего быть не может
 Обращений к базе
 Операций, имеющих отношение к логике работы
программы
Business Logic Layer
24

Цели
 Предоставление данных PL
 Функциональное обеспечение работы системы (вся логика)
Чего быть не может
 Обращения к базе данных
 Любого кода, имеющего отношения к интерфейсу
(Console.WriteLine, TextBox1.Text…)
Data Access Layer
25

Цели
 Обращения к базе (чтение/сохранение данных)
Чего быть не может
 Функциональной логики
 Любого кода, имеющего отношения к интерфейсу
(Console.WriteLine, TextBox1.Text…)
Два подхода к формированию Бизнес-логики
26

Anemic – есть сущности (Entities) и есть код для


их обработки (Logic Classes)
Rich – Entities и Logic Classes объединены
DataReader vs DataAdapter

 DataReader (SqlDataReader и OleDbDataReader)


обеспечивают поточный (stream-based) доступ к
результатам запросов БД.
 Плюсы: быстрота и эффективность
 Минусы: допускает только чтение, причем только вперед.
Нельзя возвращаться на предыдущую запись и считывать
из нее значения или изменять выходные данные и
перезаписывать их в БД.

27
DataReader vs DataAdapter

 В ADO.NET, кроме поточного доступа, поддерживается доступ к


данным, основанный на наборах (set-based).
 Размещает всю выборку в памяти и позволяет перемещаться в
результирующем наборе в любом направлении.
 Он также позволяет редактировать данные, полученные с
помощью запросов к БД, передавать изменения обратно источнику
данных.
 Для работы с наборами данных предназначены два класса: DataSet
и DataAdapter

28
Класс DataSet

 Определен в пространстве имен System.Data


 Можно представить себе как копию БД в оперативной памяти.
 Текущие данные хранятся в объектах DataTable, похожих на таблицы в БД.
 Свойство DataSet.Tables позволяет обращаться к списку DataTables в DataSet.
 Записи в DataTable представлены объектами DataRow, а поля — объектами
DataColumn.
 Свойства Rows и Columns объекта DataTable представляют собой наборы
DataRows и DataColumns, которые и составляют таблицу.
 У DataTable также есть свойство Constraints, позволяющее применять
ограничения для отдельных столбцов.
 UniqueConstraint
 ForeignKeyConstraint
 Свойство Relations класса DataSet содержит набор объектов DataRelation,
каждый из которых определяет связь между двумя таблицами DataTable

29
DataSet

30
Класс DataAdapter

 Играет роль моста между объектом DataSet и физическим


источником данных.
 Используется в двух вариантах в зависимости от провайдера:
 SqlDataAdapter – для БД SQL Server 7.0 и выше
 OleDbDataAdapter - для всех остальных БД
 Назначение объекта DataAdapter
 Заполнение таблиц DataTable в объекте DataSet результатами
запроса к БД
 Запись измененных данных из таблиц DataTable обратно в БД
 Основные методы класса DataAdapter
 Fill
 Update

31
Назначение DataAdapter

32
Метод Fill класса DataAdapter

SqlDataAdapter adapter = new SqlDataAdapter ("select * from titles",


"server=localtiost;database=pubs;uid=sa;pwd=");
DataSet ds = new DataSet ();
adapter.Fill (ds, "Titles");

1. Fill открывает соединение с БД Pubs, используя строку соединения,


передаваемую конструктору SqlDataAdapter.
2. Он выполняет запрос к БД Pubs, используя строку запроса,
передаваемую конструктору SqlDataAdapter.
3. Он создает DataTable с именем Titles в DataSet.
4. Он устанавливает структуру DataTable в соответствии со структурой
таблицы Titles в БД.
5. Он извлекает все записи, соответствующие запросу и записывает их в
DataTable.
6. Он закрывает соединение с БД.

33
Обращение к данным в DataSet

Следующий фрагмент кода перебирает набор Tables объекта ds типа


DataSet и выводит на консоль имя каждой найденной таблицы:

foreach (DataTable table in ds.Tables)


Console.WriteLine (table.TableName);

На конкретные объекты DataTable в DataSet можно ссылаться по имени


или по индексу (начиная с 0). Следующий пример вызывает первый
объект DataTable из DataSet и выводит значение первого поля каждой
строки в консольное окно:

DataTable table = ds.Tables[0];


foreach (DataRow row in table.Rows)
Console.WriteLine (row[0]);

34
Обращение к данным в DataSet

На столбцы также можно ссылаться как по имени, так и по индексу. В


этом случае, если первому столбцу DataTable назначено имя
Account_ID, предыдущий пример можно переписать:

DataTable table = ds.Tables[0];


foreach (DataRow row in table.Rows)
Console.WriteLine (row["account_id"]);

Перечисление столбцов DataTable так же просто:

DataTable table = ds.Tables[0];


foreach (DataColumn col in table.Columns)
Console.WriteLine ("Name={0}, Type={1}",
col.ColumnName, col.DataType);

35