Бази данни Системи за управление на бази данни ado.net linq...

120
Copyright © 2012 DAVID Holding Company Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL Александър Далемски [email protected]

Upload: quyn-gray

Post on 31-Dec-2015

104 views

Category:

Documents


0 download

DESCRIPTION

Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL. Александър Далемски m [email protected]. За какво ще говорим. Релационни бази данни Проектиране на бази данни Structured Query Language (SQL) ADO.NET Language INtegrated Query (LINQ) LINQ to SQL. Бази данни. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Бази данниСистеми за управление на бази данни

ADO.NETLINQ to SQL

Александър Далемски[email protected]

Page 2: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

За какво ще говорим

• Релационни бази данни• Проектиране на бази данни• Structured Query Language (SQL)• ADO.NET• Language INtegrated Query (LINQ)• LINQ to SQL

Page 3: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Бази данни

• Структурирана информация• Взаимосвързана информация• Организирана в удобен за софтуерна обработка вид

Page 4: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Релационни бази данни

• Най-широко разпространени• Организират информацията във формално дефинирани

таблици

Page 5: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Таблица (релация)

• Колони (полета, атрибути) – име и дефиниционно множество (възможни стойности)

• Редове (записи, n-торки)• Редовете и колоните нямат определена наредба

Page 6: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Първичен ключ (primary key)

• Една или повече колони• Определя еднозначно всеки запис• Препоръчително е всяка таблица да има първичен ключ

Page 7: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Външен ключ (foreign key)

• Една или повече колони• Асоциира се с първичния ключ на някоя таблица• Реализира зависимост между записите в двете таблици• Множество записи от вторичната таблица се асоциират

с един запис от първичната таблица

Page 8: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Индекс (index)

• Оптимизира достъпа до записи по определен критерий• Осигурява бързодействие за критични за софтуера

манипулации с данните

Page 9: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Схема на базата данни (schema)

• Описва структурата на данните• Таблици• Колони• Ключове и други ограничения• Индекси

Page 10: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Системи за управление на бази данни (DBMS)

• Позволяват създаването, поддръжката и употребата на бази данни

• Силно оптимизирани за ефективност• Позволяват дефиниране и изпълнение на сложни

действия върху данните и създаване на проекции на данните

• Някои са предназначени за големи софтуерни системи (enterprise DBMS), други – за малки приложения (lightweight DBMS)

Page 11: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Някои разпространени СУБД

• Microsoft SQL Server• Oracle• IBM DB2• MySQL• PostgreSQL• Microsoft Access• SQLite

Page 12: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Проектиране на бази данни

• Модел на предметната област• Трансформиране на модела в база данни• Нормализиране на базата данни

Page 13: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Модел на обектите и зависимостите(Entity/Relationship Model)• Типове обекти (entity types)• Зависимости (relationship sets)• Атрибути

Page 14: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Видове зависимости

• Едно-към-едно• Едно-към-много• Много-към-много

Page 15: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Атрибути

• Характеризират множество обекти или зависимост• Ключови атрибути – участват в еднозначното

определяне на обекти от множеството

Page 16: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Примерен проект: Здравословно хранене

• Производители• Марки• Продукти• Хранителни факти• Съставки

Page 17: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

E/R модел: Здравословно хранене

Producer Brand

ProductIngredient

producer of

brand of

contains

Name Country Name Description

Name

Energy value

Proteins

Fats

Carbohydrates

NameAmount

1 n

n

1

n

m

Page 18: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Изграждане на базата данни

• Множество обекти -> таблица• Зависимости едно-към-едно и едно-към-много ->

външни ключове• Зависимости много-към-много -> свързваща таблица с

външни ключове

Page 19: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

База данни: Здравословно хранене

BrandsBrandID

ProducerID

Name

Description

IngredientsIngredientID

Name

ProducersProducerID

Name

Country

ProductIngredientsProductID

IngredientID

Amount

ProductsProductID

BrandID

Name

EnergyValue

Proteins

Fats

Carbohydrates

Page 20: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Нормализиране на базата данни

• Премахване на излишни повторения на данни• Премахване на зависимости между данните• Избягване на аномалии

Page 21: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Нормални форми

• Формални критерии за нормалност на таблици• Всяка следваща нормална форма допълва предишната

с по-строги критерии• Полезни, но не винаги постижими или оптимални

Page 22: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Малко дефиниции

• Суперключ - множество от колони в таблица, което еднозначно определя всеки запис

• Минимален суперключ – суперключ, никое подмножество на който не е суперключ

• Неключова колона – колона, която не участва в никой минимален суперключ на таблицата

Page 23: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Първа нормална форма (1NF)

Няма колона, която може да съдържа множества.

Таблицата не съдържа подтаблици.

Page 24: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Първа нормална форма (1NF)

Ученик Спорт

Георги фехтовка, тенис

Иван баскетбол, фехтовка

Мария лека атлетика,баскетбол,тенис

Page 25: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Първа нормална форма (1NF)

Ученик Спорт

Георги фехтовка

Георги тенис

Иван баскетбол

Иван фехтовка

Мария лека атлетика

Мария баскетбол

Мария тенис

Page 26: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Втора нормална форма (2NF)

Не съществуват минимален суперключ, за който стойностите на някоя неключова колона да се определят еднозначно от негово подмножество.

Всяка неключова колона се определя еднозначно от целия минимален суперключ.

Page 27: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Втора нормална форма (2NF)

Ученик Училище Спорт

Георги ПГ „Иван Хаджиенов“ фехтовка

Георги ПГ „Иван Хаджиенов“ тенис

Иван СОУ „Антим I“ баскетбол

Иван СОУ „Антим I“ фехтовка

Мария ПМГ „Никола Обрешков“ лека атлетика

Мария ПМГ „Никола Обрешков“ баскетбол

Мария ПМГ „Никола Обрешков“ тенис

Page 28: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Втора нормална форма (2NF)

Ученик Училище

Георги ПГ „Иван Хаджиенов“

Иван СОУ „Антим I“

Мария ПМГ „Никола Обрешков“

Ученик Спорт

Георги фехтовка

Георги тенис

Иван баскетбол

Иван фехтовка

Петър лека атлетика

Петър баскетбол

Петър тенис

Page 29: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Други нормални форми

• 3NF, BCNF, 4NF, 5NF• Няма да ги разглеждаме в подробности• За повечето таблици е препоръчителна BCNF

Page 30: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Structured Query Language (SQL)

• Специализиран език за програмиране• Управление и работа с данните в СУБД• Дели се на три части: DDL, DCL и DML• Стандартизиран, но всяка СУБД поддържа собствен

диалект• Microsoft SQL Server използва T-SQL диалекта

Page 31: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Синтаксис на SQL

• Декларативен език за програмиране• Съждения• Не се разграничава главни и малки букви• По конвенция ключовите думи се пишат с главни букви

Page 32: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Идентификатори

• Поредици от букви, долни черти, цифри, която не започва с цифра

• Поредици от символи, заградени в квадратни скоби• Поредици от символи, заградени в двойни кавички

test, TEST, TeSt, [test], [TEST], "test", "TEST"

Page 33: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Запазени и стандартни думи

• Могат да се ползват като идентификатори, когато се заградят в квадратни скоби или кавички

• Някои от тях могат да се ползват като идентификатори и без да бъдат заградени, когато не са в подходящия контекст (но не е препоръчително)

Page 34: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Променливи

• Незаградени идентификатори с префикс @• Декларират се с DECLARE• Обхват - блокът от съждения, в който са дефинирани

Page 35: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Data Definition Language (DDL)

• Създаване, модификация, изтриване на таблици, изгледи, съхранени процедури, функции, тригери, индекси, потребителски типове данни

• Описване и модифициране на схемата на базата данни• Започват с CREATE, ALTER, DROP или TRUNCATE

Page 36: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Създаване на таблица

CREATE TABLE [Producers] ( [ProducerID] int NOT NULL IDENTITY(1, 1), [Name] nvarchar(100) NOT NULL, [Country] nvarchar(100) NULL,

CONSTRAINT [PK_Producers] PRIMARY KEY ([ProducerID]))GO

Page 37: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Създаване на таблица

CREATE TABLE [Brands] ( [BrandID] int NOT NULL IDENTITY(1, 1), [ProducerID] int NOT NULL, [Name] nvarchar(100) NOT NULL,

CONSTRAINT [PK_Brands] PRIMARY KEY ([BrandID]), CONSTRAINT [FK_Brands_Producer] FOREIGN KEY ([ProducerID]) REFERENCES [Producers] ([ProducerID]) ON DELETE CASCADE)GO

Page 38: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Модифициране на таблица

ALTER TABLE [Brands] ADD [Description]nvarchar(MAX) NULLGO

Page 39: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Изтриване на таблица

DROP TABLE [Brands]GO

Page 40: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Изпразване съдържанието на таблица

TRUNCATE TABLE [Brands]GO

Page 41: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Съхранени процедури

CREATE PROCEDURE [CreateProducer] @vName nvarchar(100), @vCountry nvarchar(100), @vProducerID int OUTPUTAS INSERT INTO [Producers] ([Name], [Country]) VALUES (@vName, @vCountry)

SELECT @vProducerID = SCOPE_IDENTITY()

GO

Page 42: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Функции

CREATE FUNCTION [GetProducerBrandsCount] (@vProducerID int)RETURNS intBEGIN DECLARE @varCount int

SELECT @varCount = COUNT(*) FROM [Brands] WHERE ([ProducerID] = @vProducerID)

RETURN @varCountEND

Page 43: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Изгледи

CREATE VIEW [BrandProducers]AS SELECT [B].[BrandID], [B].[Name] AS [BrandName], [P].[Name] AS [ProducerName] FROM [Brands] AS [B] INNER JOIN [Producers] AS [P] ON ([B].[ProducerID] = [P].[ProducerID])GO

Page 44: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Индекси

CREATE INDEX [IX_Producers] ON [Producers] ( [Country] ASC, [Name] ASC)GO

DROP INDEX [IX_Producers] ON [Producers]GO

Page 45: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Data Control Language (DCL)

• Управление на достъпа до обекти в базата данни• Започват с GRANT, REVOKE или DENY

Page 46: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Data Control Language (DCL)

GRANT SELECT, INSERT, UPDATE, DELETE ON [Producers] TO [someone]GO

DENY INSERT, UPDATE, DELETE ON [Producers] TO [someone]GO

REVOKE DELETE ON [Producers] ТО [someone]GO

Page 47: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Data Manipulation Language (DML)

• Записване, променяне, изтриване и извличане на данни• Приложенията, използващи бази данни, използват

предимно DML• Започват с SELECT, INSERT, UPDATE или DELETE

Page 48: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

SELECT съждения

• Извличат информация от базата данни• Най-често използваните съждения• Резултатът обикновено е набор от записи (rowset)

SELECT ...FROM ...WHERE ...GROUP BY ...HAVING ...ORDER BY ...

Page 49: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

SELECT и FROM

• SELECT определя колоните, които да участват в резултата

• FROM определя таблицата (или таблиците), от която се извличат данните

SELECT * FROM [Producers]

SELECT [BrandID], [Name] FROM [Brands]

Page 50: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Филтриране

• WHERE посочва критерий (или критерии), по който да се отсеят записите в резултата

• =, <>, <, <=, >, >=• EXISTS, IS NULL, LIKE, IN• NOT, OR, AND

SELECT * FROM [Products]WHERE ([ProductID] > 10)

SELECT * FROM [Products]WHERE ([BrandID] = 2)

SELECT * FROM [Brands]WHERE ([Name] IN (N'Coca-Cola', N'Fanta', N'Sprite', N'Schweppes')) AND ([Description] IS NOT NULL)

Page 51: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Влагане на заявки

• Често се налага влагане на заявки – например в SELECT или WHERE клаузите

SELECT * FROM [Brands]WHERE ([BrandID] NOT IN (SELECT DISTINCT [BrandID] FROM [Products]))

Page 52: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Сортиране

• ORDER BY посочва колона или редица от колони, по които да се подредят записите в резултата

SELECT * FROM [Brands]ORDER BY [Name]

SELECT * FROM [Products]ORDER BY [EnergyValue] DESC, [Name] ASC

Page 53: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Агрегиране

• Получаване на единична стойност от стойностите на всички записи за дадена колона

• COUNT, SUM, MAX, MIN, AVG

SELECT COUNT([Description]) FROM [Brands]

SELECT COUNT(*) FROM [Products]WHERE ([BrandID] = 4)

SELECT COUNT(DISTINCT [BrandID]) FROM [Products]

Page 54: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Групиране

• Позволява прилагането на агрегатни функции върху част от записите в таблица

• GROUP BY указва всички колони, по които трябва да се групират записите

• HAVING указва допълнителен критерий, по който да се отсеят групираните резултати

SELECT [BrandID], AVG([EnergyValue]) FROM [Products]GROUP BY [BrandID]

SELECT [BrandID], COUNT(*) FROM [Products]GROUP BY [BrandID]HAVING (COUNT(*) > 1)

Page 55: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Съединения

• Служат за комбиниране на записи от няколко таблици• Прилагат се JOIN оператори във FROM клаузата• Могат да се свързват повече от две таблици с

последователно прилагане на JOIN оператори

Page 56: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

INNER JOIN

• Комбинира всеки запис от едната таблица с един или повече записи от другата таблица по зададен критерий

• Премахва записите, които не могат да се свържат с никой запис от другата таблица

SELECT [P].[ProductID], [B].[Name] AS [BrandName], [P].[Name] AS [ProductName]FROM [Products] AS [P] INNER JOIN [Brands] AS [B] ON ([P].[BrandID] = [B].[BrandID])

Page 57: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

OUTER JOIN

• Комбинира всеки запис от едната таблица с един или повече записи от другата таблица по зададен критерий

• Не премахва записите от първата таблица, които не могат да се свържат с нито един запис от втората

SELECT [P].[Name] AS [ProducerName], COUNT([B].[BrandID]) AS [BrandCount]FROM [Producers] AS [P] LEFT OUTER JOIN [Brands] AS [B] ON ([P].[ProducerID] = [B].[ProducerID])GROUP BY [P].[Name]

Page 58: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

INSERT съждения

• Създават нови записи в таблица• Могат да се комбинират със SELECT съждения за

автоматично генериране на данните в новите записи

INSERT INTO ... (...) VALUES (...)

INSERT INTO ... (...) SELECT ...

INSERT INTO [Brands] ([ProducerID], [Name])VALUES (5, 'Lindt')

INSERT INTO [Products] ([BrandID], [Name], [EnergyValue]) SELECT 9, [Name], [Energy] FROM [LegacyProducts] WHERE ([Brand] = N'Lindt')

Page 59: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

UPDATE съждения

• Променят съдържанието на съществуващи записи• По подразбиране променят всички записи в таблицата

UPDATE ...SET ...WHERE ...

UPDATE [Brands] SET [Description] = N'Швейцарско качество!'WHERE ([Name] = N'Lindt')

UPDATE [Products] SET [EnergyValue] = [EnergyValue]*4.184

Page 60: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

DELETE съждения

• Изтриват записи от таблица• По подразбиране изтриват всички записи от таблицата

DELETE FROM ...WHERE ...

DELETE FROM [Products]WHERE ([EnergyValue] < 0)

Page 61: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Трансакции

• Поредици от операции• Изпълняват се цялостно и независимо от всички

останали трансакции• Гарантиране консистентността на данните

Page 62: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Характеристики на трансакциите

• Атомарност• Консистентност• Изолираност• Устойчивост

Page 63: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Трансакции в SQL

BEGIN TRANSACTION

COMMIT TRANSACTION

ROLLBACK TRANSACTION

Page 64: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

ADO.NET

• Част от .NET Framework• Наследник на ActiveX Data Objects (ADO)• Удобни начини за достъп до бази данни• Минимална зависимост от избора на СУБД

Page 65: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

ADO.NET доставчици (data providers)

• Data Provider for SQL Server• Data Provider for OLE DB• Data Provider for ODBC• Data Provider for Oracle• Data Provider for SQL Server Compact 4.0

Page 66: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Модели за достъп до данните в ADO.NET

• Свързан модел• Несвързан модел• LINQ to SQL• Entity Framework

Page 67: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Connection strings

• Служат за осъществяване на връзката с базата данни• Представляват поредица от двойки

„параметър=стойност“, разделени с ;• Различните доставчици поддържат различни параметри

Server=(local); Database=HealthyFood; Integrated Security=SSPI

Server=(local); Database=HealthyFood; Integrated Security=False; User ID=sa; Password=$secret$; Persist Security Info=False

Page 68: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Основни параметри на connection string

• Server• Database• Integrated Security• User ID• Password• Persist Security Info

Page 69: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Автоматично генериране наconnection string• Използва се SqlConnectionStringBuilder• Параметрите на връзката са свойства на обекта

Page 70: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Съхраняване на connection string вконфигурационен файл• Позволява промяна без прекомпилиране на

приложението• Записва се в секцията <connectionStrings>• Достъпва се през ConfigurationManager.ConnectionStrings

<configuration> <connectionStrings> <add name="connection" providerName="System.Data.SqlClient" connectionString="Server=(local); Database=HealthyFood; Integrated Security=SSPI" /> </connectionStrings></configuration>

connection.ConnectionString = ConfigurationManager .ConnectionStrings["connection"].ConnectionString;

Page 71: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

SqlConnection

• Осъществява връзката с базата данни• Получава connection string• Open()• IDisposable

using (var connection = new SqlConnection()){ connection.ConnectionString = ConfigurationManager .ConnectionStrings["connection"].ConnectionString; connection.Open();

// операции върху базата...}

Page 72: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

SqlCommand

• Служи за изпълнение на заявки• Получава отворен SqlConnection• ExecuteNonQuery(), ExecuteScalar(), ExecuteReader()

• IDisposable

using (SqlCommand command = connection.CreateCommand()){ command.CommandText = "SELECT COUNT(*) FROM [Producers]"; int producerCount = (int)command.ExecuteScalar(); Console.WriteLine("Producers count: {0}", producerCount);}

Page 73: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

SqlCommand - ExecuteReader

using (SqlCommand command = connection.CreateCommand()){ command.CommandText = "SELECT [ProducerID], [Name] FROM [Producers]";

using (DbDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine("ProducerID: {0}; Name: {1}", reader["ProducerID"], reader["Name"]); } }}

Page 74: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

SqlCommand - параметри

• Служат за динамично предаване на стойности• Име, тип и стойност• SqlCommand.Parameters

Console.Write("Input producer ID: ");int producerID = Convert.ToInt32(Console.ReadLine());

using (SqlCommand command = connection.CreateCommand()){ command.CommandText =@"SELECT [BrandID], [Name] FROM [Brands] WHERE ([ProducerID] = @producer_id)"; command.Parameters.AddWithValue("@producer_id", producerID);

using (DbDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine("BrandID: {0}; Name: {1}", reader["BrandID"], reader["Name"]); } }}

Page 75: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

SQL injection атаки

• Пробив в сигурността на базата данни• Динамично генериране на заявки с конкатениране на

низове

Console.WriteLine("Input brand name to search for: ");string name = Console.ReadLine();

using (SqlCommand command = connection.CreateCommand()){ command.CommandText =@"SELECT [BrandID], [Name] FROM [Brands] WHERE ([Name] = N'" + name + "')";

using (DbDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine("BrandID: {0}; Name: {1}", reader["BrandID"], reader["Name"]); } }}

Page 76: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

SQL injection атаки

'); DELETE FROM [Products];--

SELECT [ProductID], [Name] FROM [Products]WHERE ([Name] = N''); DELETE FROM [Products];--')

Page 77: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

SQL injection атаки

Правилна имплементация – използване на параметри

Console.WriteLine("Input brand name to search for: ");string name = Console.ReadLine();

using (SqlCommand command = connection.CreateCommand()){ command.CommandText =@"SELECT [BrandID], [Name] FROM [Brands] WHERE ([Name] = @name)"; command.Parameters.AddWithValue("@name", name);

using (DbDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine("BrandID: {0}; Name: {1}", reader["BrandID"], reader["Name"]); } }}

Page 78: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

SqlCommand – съхранени процедури

• CommandType.StoredProcedure• Parameters

using (SqlCommand command = connection.CreateCommand()){ command.CommandType = CommandType.StoredProcedure; command.CommandText = "[CreateProduct]"; command.Parameters.AddWithValue("@vBrandID", 5); command.Parameters.AddWithValue("@vName", "Шоколад Milka алпийско мляко"); command.Parameters.AddWithValue("@vEnergyValue", (decimal)532); command.Parameters.AddWithValue("@vProteins", (decimal)6.8); command.Parameters.AddWithValue("@vFats", (decimal)29.6); command.Parameters.AddWithValue("@vCarbohydrates", (decimal)58); command.Parameters.Add("@vProductID", SqlDbType.Int).Direction = ParameterDirection.Output;

command.ExecuteNonQuery(); Console.WriteLine("Created product ID: {0}", (int)command.Parameters["@vProductID"].Value);}

Page 79: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Трансакции в ADO.NET

• TransactionScope• Complete()• IDisposable

using (var ts = new TransactionScope())using (var connection = new SqlConnection()){ connection.ConnectionString = ConfigurationManager .ConnectionStrings["connection"].ConnectionString; connection.Open();

// операции в трансакция

ts.Complete();}

Page 80: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Императивни езици за програмиране

• C, C++, C#, Java, Pascal, Visual Basic,…• Поредици от инструкции (съждения)• Близки до машинния език

Page 81: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Функционални езици за програмиране

• Scheme, Haskell, F#, Scala,…• Композиране на функции• Изрази• Близки до математиката

Page 82: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Умножение с константа

Императивна версия:

function MulBy2(x){ return x*2;}

Page 83: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Умножение с константа

Фунцкионална версия:

function MulBy2(x) = x*2;

Page 84: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Умножение на всички елементи на списъкс константаИмперативна версия:

function MulElementsBy2(list){ result = EmptyList(); foreach (x in list) { AddElement(x*2, result); } return result;}

Page 85: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Умножение на всички елементи на списъкс константаФункционална версия:

function MulElementsBy2(list) = Map(MulBy2, list);

Page 86: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Отсяване на елементи от списък

Императивна версия:

function GetPositiveElements(list){ result = EmptyList(); foreach (x in list) { if (x > 0) { AddElement(x, result); } } return result;}

Page 87: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Отсяване на елементи от списък

Функционална версия:

function IsPositive(x) = x > 0;function GetPositiveElements(list) = Filter(IsPositive, list);

Page 88: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Намиране сумата на елементите на списък

Императивна версия:

function Sum(list){ result = 0; foreach (x in list) { result += x; } return result;}

Page 89: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Намиране сумата на елементите на списък

Функционална версия:

function Add(x, y) = x + y;function Sum(list) = Fold(Add, 0, list);

Page 90: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Намиране средно аритметично наелементите на списъкИмперативна версия:

function Average(list){ sum = 0; count = 0; foreach (x in list) { sum += x; count++; } return sum/count;}

Page 91: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Намиране средно аритметично наелементите на списъкФункционална версия:

function Add1(x, y) = x + 1;function Count(list) = Fold(Add1, 0, list);function Average(list) = Sum(list)/Count(list);

Page 92: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Разширителни методи на IEnumerable<T>

• Въведени в .NET Framework 3.5• Улесняват прилагането на често използвани операции

върху колекции• Следват функционалната парадигма• System.Linq.Enumerable

Page 93: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Разширителни методи на IEnumerable<T>

IEnumerable<U> Select<T, U>(this IEnumerable<T> source, Func<T, U> selector)

IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate)

U Aggregate<T, U>(this IEnumerable<T> source, U seed, Func<U, T, U> function)

IEnumerable<T> Skip<T>(this IEnumerable<T> source, int count)

IEnumerable<T> Take<T>(this IEnumerable<T> source, int count)

Page 94: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Разширителни методи на IEnumerable<T> -отложено изпълнениеvar numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

IEnumerable<int> newNumbers = numbers .Where(x => x % 2 == 0) .Select(x => x*2);

// в този момент newNumbers съхранява информация за операциите,// които трябва да се извършат

numbers.Add(10);

// точно преди началото на обхождането на newNumbers с foreach,// операциите се изпълняват и резултатът се подава на цикълаforeach (int n in newNumbers){ Console.WriteLine(n);}

Page 95: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Разширителни методи на IEnumerable<T>

• First, Last, FirstOrDefault, LastOrDefault• Sum, Min, Max, Average, Count• ToList, ToArray, ToDictionary

Page 96: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Разширителни методи на IEnumerable<T> -сортировкаIOrderedEnumerable<T> OrderBy<T, U>(this IEnumerable<T> source, Func<T, U> keySelector)

IOrderedEnumerable<T> OrderByDescending<T, U>( this IEnumerable<T> source, Func<T, U> keySelector)

IOrderedEnumerable<T> ThenBy<T, U>(this IOrderedEnumerable<T> source, Func<T, U> keySelector)

IOrderedEnumerable<T> ThenByDescending<T, U>( this IOrderedEnumerable<T> source, Func<T, U> keySelector)

Page 97: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Разширителни методи на IEnumerable<T> -групиранеIEnumerable<IGrouping<U, T>> GroupBy<T, U>(this IEnumerable<T> source, Func<T, U> keySelector)

Page 98: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Разширителни методи на IEnumerable<T> -съединенияIEnumerable<W> Join<T, U, V, W>(this IEnumerable<T> first, IEnumerable<U> second, Func<T, V> firstKeySelector, Func<U, V> secondKeySelector, Func<T, U, W> resultSelector)

IEnumerable<W> GroupJoin<T, U, V, W>( this IEnumerable<T> first, IEnumerable<U> second, Func<T, V> firstKeySelector, Func<U, V> secondKeySelector, Func<T, IEnumerable<U>, W> resultSelector)

Page 99: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Language INtegrated Query (LINQ)

• Също въведен в .NET Framework 3.5• Синтаксис подобен на SQL• Трансформира се в извиквания на разширителните

методи на IEnumerable<T> и IQueryable<T>• Няколко различни имплементации

Page 100: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

LINQ - примери

var example1 = from n in numbers select n*2;

var example1 = numbers.Select(n => n*2);

Page 101: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

LINQ - примери

var example2 = from n in numbers where n > 15 orderby n % 4, n % 7 descending select n;

var example2 = numbers .Where(n => n > 15) .OrderBy(n => n % 4) .ThenByDescending(n => n % 7);

Page 102: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

LINQ - примери

var example3 = from n in numbers group n by n % 3 into ng where ng.Count() == 2 select ng;

var example3 = numbers .GroupBy(n => n % 3) .Where(ng => ng.Count() == 2);

Page 103: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

LINQ - примери

var example4 = from n in numbers join m in numbers on n % 3 equals m % 3 select Tuple.Create(n, m);

var example4 = numbers .Join(numbers, n => n % 3, m => m % 3, (n, m) => Tuple.Create(n, m));

Page 104: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

IQueryable<T>

• Наследява IEnumerable<T>• Различна имплементация на повечето разширителни

методи на IEnumerable<T>• Служи за трансформиране на LINQ заявки към SQL,

XPath и др.• System.Linq.Queryable

Page 105: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Имплементации на LINQ

• LINQ to Objects• LINQ to XML• LINQ to Dataset• LINQ to SQL• LINQ to Entities

Page 106: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

LINQ to SQL

• Част от ADO.NET• Въведен в .NET Framework 3.5• Object-Relational Mapping (ORM) – ръчно дефиниране

или описване с DBML• Само с Data Provider for SQL Server• System.Data.Linq

Page 107: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Ръчно описване на ORM модела

• Прави се с атрибути• System.Data.Linq.Mapping

Page 108: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Ръчно описване на ORM модела - таблици

• Table• Column

[Table(Name = "Producers")]public class Producer{ [Column(IsPrimaryKey = true)] public int ProducerID { get; set; }

[Column(CanBeNull = false)] public string Name { get; set; }

[Column] public string Country { get; set; }}

Page 109: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Ръчно описване на ORM модела - връзки

• Association• EntitySet<T>, EntityRef<T>

[Table(Name = "Producers")]public class Producer{ private EntitySet<Brand> _brands;

[Column(IsPrimaryKey = true)] public int ProducerID { get; set; }

[Column(CanBeNull = false)] public string Name { get; set; }

[Column] public string Country { get; set; }

[Association(Storage = "_brands", OtherKey = "ProducerID")] public EntitySet<Brand> Brands { get { return _brands; } set { _brands.Assign(value); } }}

Page 110: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Ръчно описване на ORM модела - връзки

[Table(Name = "Brands")]public class Brand{ private EntityRef<Producer> _producer;

[Column(IsPrimaryKey = true)] public int BrandID { get; set; }

[Column] public int ProducerID { get; set; }

[Column(CanBeNull = false)] public string Name { get; set; }

[Column] public string Description { get; set; }

[Association(Storage = "_producer", ThisKey = "ProducerID")] public Producer Producer { get { return _producer.Entity; } set { _producer.Entity = value; } }}

Page 111: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Ръчно описване на ORM модела - контекст

• DataContext

public class HealthyFoodContext : DataContext{ public HealthyFoodContext(string connectionString) : base(connectionString) { }

public Table<Producer> Producers { get { return GetTable<Producer>(); } }

public Table<Brand> Brands { get { return GetTable<Brand>(); } }}

string connectionString = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;var context = new HealthyFoodContext(connectionString);

Page 112: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

LINQ to SQL заявки - примери

IEnumerable<Brand> brands = from b in context.Brands select b;

IEnumerable<Brand> brands = from b in context.Brands where b.BrandID > 3 select b;

var brands = from b in context.Brands select new { BrandID = b.BrandID, BrandName = b.Name };

var brands = from b in context.Brands select new { ProducerName = b.Producer.Name, BrandName = b.Name };

IEnumerable<Brand> brands = context.Producers .Where(p => p.Name != "Kraft Foods") .SelectMany(p => p.Brands);

Producer producer = context.Producers.Single(p => p.ProducerID == 3);

Page 113: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Описване на ORM модела с DBML

• Специализиран XML документ• LINQ to SQL Classes файлов шаблон• Автоматично генериране на C# код• partial класове - добавяне на методи/свойства във

външни файлове

Page 114: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

ORM модел: Здравословно хранене

Page 115: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

LINQ to SQL – добавяне на записи

Brand brand = context.Brands.Single(b => b.BrandID == 5);var product = new Product{ Name = "Шоколад Milka алпийско мляко", EnergyValue = 532,};brand.Products.Add(product);

Page 116: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

LINQ to SQL – редактиране на записи

Product product = context.Products.Single(p => p.ProductID == 19);product.Proteins = (decimal)6.8;product.Fats = (decimal)29.6;product.Carbohydrates = (decimal)58;

Page 117: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

LINQ to SQL – изтриване на записи

Product product = context.Products.Single(p => p.ProductID == 19);context.Products.DeleteOnSubmit(product);

Page 118: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

LINQ to SQL – записване на промените

context.SubmitChanges();

Page 120: Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Copyright © 2012 DAVID Holding Company

Благодаря за вниманието!

• Въпроси?• [email protected]