SlideShare a Scribd company logo
1 of 52
Курс по информационни
технологии
Занятие №3
ADO.NET. LINQ to SQL

2013
Съдържание 1/1
•
•
•
•

ADO.NET
SQL Injection атаки
LINQ
LINQ to SQL
ADO.NET
• Какво е „ADO.NET“?
–
–
–
–

Част от .NET Framework
Наследник на ActiveX Data Objects (ADO)
Предоставя удобни начини за достъп до бази данни
Минимална зависимост от избора на СУБД
ADO.NET
• 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
ADO.NET
• Модели за достъп до данните в ADO.NET
–
–
–
–

Свързан модел
Несвързан модел
LINQ to SQL
Entity Framework
ADO.NET
• Низове за връзка (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
ADO.NET
• Основни параметри на низовете за връзка
–
–
–
–
–
–

Server
Database
Integrated Security
User ID
Password
Persist Security Info
ADO.NET
• Автоматично генериране на низове за връзка
– Използва се класът SqlConnectionStringBuilder
– Параметрите на връзката са свойства на обекта
ADO.NET
• Съхраняване на низове за връзка в
конфигурационен файл
– Позволява промяна без прекомпилиране на
приложението
– Записва се в секцията <connectionStrings>
– Достъпва се през статичното свойство
ConfigurationManager.ConnectionStrings
ADO.NET
• Съхраняване на низове за връзка в
конфигурационен файл
<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;
ADO.NET
• Класът SqlConnection
–
–
–
–

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

using (var connection = new SqlConnection())
{
connection.ConnectionString = ConfigurationManager
.ConnectionStrings["connection"].ConnectionString;
connection.Open();
// операции върху базата...
}
ADO.NET
• Класът SqlCommand
– Служи за изпълнение на заявки
– Получава отворен SqlConnection
– Методите
ExecuteNonQuery(), ExecuteScalar(), ExecuteReade
r()
– Имплементира IDisposable
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = "SELECT COUNT(*) FROM [Producers]";
int producerCount = (int)command.ExecuteScalar();
Console.WriteLine("Producers count: {0}", producerCount);
}
ADO.NET
• Класът SqlCommand – методът ExecuteReader()
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = "SELECT [ProducerID], [Name] FROM [Producers]";
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine("ProducerID: {0}; Name: {1}",
reader["ProducerID"], reader["Name"]);
}
}
}
ADO.NET
• Класът SqlCommand – параметри
– Служат за динамично предаване на стойности
– Име, тип и стойност
– Свойството Parameters
ADO.NET
• Класът SqlCommand – параметри
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 (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine("BrandID: {0}; Name: {1}",
reader["BrandID"], reader["Name"]);
}
}
}
ADO.NET
• Класът SqlCommand – съхранени процедури
– На свойството CommandType се прсивоява стойност
CommandType.StoredProcedure
– Стойности на параметрите се подават през свойството
Parameters
ADO.NET
• Класът SqlCommand – съхранени процедури
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);
}
ADO.NET
• Трансакции в 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();
}
SQL Injection атаки
• Какво е „SQL Injection“?
– Пробив в сигурността на базата данни
– Възможно е да се използва, ако динамично се
генерират заявки с конкатениране на низове
SQL Injection атаки
• Пример за 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 (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine("BrandID: {0}; Name: {1}",
reader["BrandID"], reader["Name"]);
}
}
}
SQL Injection атаки
• Пример за SQL Injection
'); DELETE FROM [Products];--

SELECT [ProductID], [Name] FROM [Products]
WHERE ([Name] = N''); DELETE FROM [Products];--')
SQL Injection атаки
• Пример за 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 (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine("BrandID: {0}; Name: {1}",
reader["BrandID"], reader["Name"]);
}
}
}
LINQ
• Разширителни методи на IEnumerable<T>
– Въведени в .NET Framework 3.5
– Улесняват прилагането на често използвани операции
върху колекции
– Следват функционалната парадигма
– Описани в статичния клас System.Linq.Enumerable
LINQ
• Разширителни методи на 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)
LINQ
• Разширителни методи на 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);
}
LINQ
• Разширителни методи на IEnumerable<T> –
методи, които предизвикват изпълнение
– First, Last, FirstOrDefault, LastOrDefault
– Sum, Min, Max, Average, Count
– ToList, ToArray, ToDictionary
LINQ
• Разширителни методи на 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)
LINQ
• Разширителни методи на IEnumerable<T> –
групиране
IEnumerable<IGrouping<U, T>> GroupBy<T, U>(this IEnumerable<T> source,
Func<T, U> keySelector)
LINQ
• Разширителни методи на 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)
LINQ
• Какво е „LINQ“?
– Language INtegrated Query
– Специален синтаксис в C# и Visual Basic .NET, който е
подобен на SQL
– Също въведен в .NET Framework 3.5
– Трансформира се в извиквания на разширителните
методи на IEnumerable<T> и IQueryable<T>
– Няколко различни имплементации
LINQ
• LINQ – примери
var example1 = from n in numbers
select n*2;
var example1 = numbers.Select(n => n*2);
LINQ
• 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);
LINQ
• 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);
LINQ
• 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));
LINQ
• Интерфейсът IQueryable<T>
– Наследява IEnumerable<T>
– Различна имплементация на повечето разширителни
методи на IEnumerable<T>
– Служи за трансформиране на LINQ заявки към
SQL, XPath и др.
– Клас с разширителни методи System.Linq.Queryable
LINQ
• Имплементации на LINQ
–
–
–
–
–

LINQ to Objects
LINQ to XML
LINQ to Dataset
LINQ to SQL
LINQ to Entities
LINQ to SQL
• Какво е „LINQ to SQL“?
– Част от ADO.NET
– Въведен в .NET Framework 3.5
– Object-Relational Mapping (ORM) – ръчно дефиниране
или описване с DBML
– Само с Data Provider for SQL Server
– Пространството от имена System.Data.Linq
LINQ to SQL
• Ръчно описване на ORM модела
– Прави се с атрибути
– Пространството от имена System.Data.Linq.Mapping
LINQ to SQL
• Ръчно описване на 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; }

}
LINQ to SQL
• Ръчно описване на ORM модела – връзки
– Атрибутът Association
– Типовете EntitySet<T> и EntityRef<T>
LINQ to SQL
• Ръчно описване на ORM модела – връзки
[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); }
}
}
LINQ to SQL
• Ръчно описване на 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; }
}
}
LINQ to SQL
• Ръчно описване на 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);
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);
LINQ to SQL
• Описване на ORM модела с DBML
–
–
–
–

Специализиран XML документ
LINQ to SQL Classes файлов шаблон
Автоматично генериране на C# код
partial класове - добавяне на методи/свойства във
външни файлове
LINQ to SQL
• ORM модел: Здравословно хранене
LINQ to SQL
• Добавяне на записи
Brand brand = context.Brands.Single(b => b.BrandID == 5);
var product = new Product
{
Name = "Шоколад Milka алпийско мляко",
EnergyValue = 532,
};
brand.Products.Add(product);
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;
LINQ to SQL
• Изтриване на записи
Product product = context.Products.Single(p => p.ProductID == 19);
context.Products.DeleteOnSubmit(product);
LINQ to SQL
• Записване на промените в базата данни
– Методът SubmitChanges() на класа DataContext
context.SubmitChanges();
Въпроси?
Благодаря!
• Александър Далемски
–
–
–
–

sasho@david.bg
musashi.bg@gmail.com
Skype: musasho
https://www.facebook.com/adalemski

• ДАВИД академия
–
–
–
–

acad@david.bg
http://acad.david.bg/
@david_academy
https://www.facebook.com/groups/david.academy/

More Related Content

Similar to Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQL

Курс по уеб програмиране (2015), занятие №1 - HTML
Курс по уеб програмиране (2015), занятие №1 - HTMLКурс по уеб програмиране (2015), занятие №1 - HTML
Курс по уеб програмиране (2015), занятие №1 - HTMLDAVID Academy
 
Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)DAVID Academy
 
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)DAVID Academy
 
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...DAVID Academy
 
Средства на VSTS за управление на проекти, версии на системата, извеждане на ...
Средства на VSTS за управление на проекти, версии на системата, извеждане на ...Средства на VSTS за управление на проекти, версии на системата, извеждане на ...
Средства на VSTS за управление на проекти, версии на системата, извеждане на ...Yosifov
 
Nakov - RDBMS Systems - Intro
Nakov - RDBMS Systems - IntroNakov - RDBMS Systems - Intro
Nakov - RDBMS Systems - IntroSvetlin Nakov
 
FABRIQ - Presentation Nakov 0.8
FABRIQ - Presentation Nakov 0.8FABRIQ - Presentation Nakov 0.8
FABRIQ - Presentation Nakov 0.8Svetlin Nakov
 
Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)DAVID Academy
 
Курс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функции
Курс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функцииКурс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функции
Курс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функцииDAVID Academy
 
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)DAVID Academy
 
BARS - Regular Expressions - Svetlin Nakov, George Penkov
BARS - Regular Expressions - Svetlin Nakov, George PenkovBARS - Regular Expressions - Svetlin Nakov, George Penkov
BARS - Regular Expressions - Svetlin Nakov, George PenkovSvetlin Nakov
 
Web applications with Catalyst BG
Web applications with Catalyst BGWeb applications with Catalyst BG
Web applications with Catalyst BGsvilen.ivanov
 
Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13DAVID Academy
 
Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...
Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...
Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...DAVID Academy
 
01 vavedenie v sql server 2000
01 vavedenie v sql server 200001 vavedenie v sql server 2000
01 vavedenie v sql server 2000Ivan Peev
 
Училищен курс по програмиране на C# (2013/2014), занятие №11
Училищен курс по програмиране на C# (2013/2014), занятие №11Училищен курс по програмиране на C# (2013/2014), занятие №11
Училищен курс по програмиране на C# (2013/2014), занятие №11DAVID Academy
 
JDK 1.5 New Features
JDK 1.5 New FeaturesJDK 1.5 New Features
JDK 1.5 New FeaturesSvetlin Nakov
 
Continuous integration (d.atanasov)
Continuous integration (d.atanasov)Continuous integration (d.atanasov)
Continuous integration (d.atanasov)Deyan Atanasov
 

Similar to Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQL (20)

Курс по уеб програмиране (2015), занятие №1 - HTML
Курс по уеб програмиране (2015), занятие №1 - HTMLКурс по уеб програмиране (2015), занятие №1 - HTML
Курс по уеб програмиране (2015), занятие №1 - HTML
 
Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)
 
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
 
Tema13
Tema13Tema13
Tema13
 
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
 
Средства на VSTS за управление на проекти, версии на системата, извеждане на ...
Средства на VSTS за управление на проекти, версии на системата, извеждане на ...Средства на VSTS за управление на проекти, версии на системата, извеждане на ...
Средства на VSTS за управление на проекти, версии на системата, извеждане на ...
 
Nakov - RDBMS Systems - Intro
Nakov - RDBMS Systems - IntroNakov - RDBMS Systems - Intro
Nakov - RDBMS Systems - Intro
 
FABRIQ - Presentation Nakov 0.8
FABRIQ - Presentation Nakov 0.8FABRIQ - Presentation Nakov 0.8
FABRIQ - Presentation Nakov 0.8
 
Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)
 
Курс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функции
Курс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функцииКурс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функции
Курс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функции
 
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
 
BARS - Regular Expressions - Svetlin Nakov, George Penkov
BARS - Regular Expressions - Svetlin Nakov, George PenkovBARS - Regular Expressions - Svetlin Nakov, George Penkov
BARS - Regular Expressions - Svetlin Nakov, George Penkov
 
Web applications with Catalyst BG
Web applications with Catalyst BGWeb applications with Catalyst BG
Web applications with Catalyst BG
 
Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13
 
Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...
Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...
Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...
 
Module1
Module1Module1
Module1
 
01 vavedenie v sql server 2000
01 vavedenie v sql server 200001 vavedenie v sql server 2000
01 vavedenie v sql server 2000
 
Училищен курс по програмиране на C# (2013/2014), занятие №11
Училищен курс по програмиране на C# (2013/2014), занятие №11Училищен курс по програмиране на C# (2013/2014), занятие №11
Училищен курс по програмиране на C# (2013/2014), занятие №11
 
JDK 1.5 New Features
JDK 1.5 New FeaturesJDK 1.5 New Features
JDK 1.5 New Features
 
Continuous integration (d.atanasov)
Continuous integration (d.atanasov)Continuous integration (d.atanasov)
Continuous integration (d.atanasov)
 

More from DAVID Academy

Курс по уеб програмиране (2015), занятие №2 - CSS
Курс по уеб програмиране (2015), занятие №2 - CSSКурс по уеб програмиране (2015), занятие №2 - CSS
Курс по уеб програмиране (2015), занятие №2 - CSSDAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №14
Училищен курс по програмиране на C# (2013/2014), занятие №14Училищен курс по програмиране на C# (2013/2014), занятие №14
Училищен курс по програмиране на C# (2013/2014), занятие №14DAVID Academy
 
Курс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSSКурс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSSDAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №12
Училищен курс по програмиране на C# (2013/2014), занятие №12Училищен курс по програмиране на C# (2013/2014), занятие №12
Училищен курс по програмиране на C# (2013/2014), занятие №12DAVID Academy
 
Курс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTMLКурс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTMLDAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №10
Училищен курс по програмиране на C# (2013/2014), занятие №10Училищен курс по програмиране на C# (2013/2014), занятие №10
Училищен курс по програмиране на C# (2013/2014), занятие №10DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №9
Училищен курс по програмиране на C# (2013/2014), занятие №9Училищен курс по програмиране на C# (2013/2014), занятие №9
Училищен курс по програмиране на C# (2013/2014), занятие №9DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №8
Училищен курс по програмиране на C# (2013/2014), занятие №8Училищен курс по програмиране на C# (2013/2014), занятие №8
Училищен курс по програмиране на C# (2013/2014), занятие №8DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №7
Училищен курс по програмиране на C# (2013/2014), занятие №7Училищен курс по програмиране на C# (2013/2014), занятие №7
Училищен курс по програмиране на C# (2013/2014), занятие №7DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014) - Помагало
Училищен курс по програмиране на C# (2013/2014) - ПомагалоУчилищен курс по програмиране на C# (2013/2014) - Помагало
Училищен курс по програмиране на C# (2013/2014) - ПомагалоDAVID Academy
 
Училищен курс по програмиране на C# (2013/2014) - Упражнения
Училищен курс по програмиране на C# (2013/2014) - УпражненияУчилищен курс по програмиране на C# (2013/2014) - Упражнения
Училищен курс по програмиране на C# (2013/2014) - УпражненияDAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №4
Училищен курс по програмиране на C# (2013/2014), занятие №4Училищен курс по програмиране на C# (2013/2014), занятие №4
Училищен курс по програмиране на C# (2013/2014), занятие №4DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3DAVID Academy
 
Курс по информационни технологии (2013) - 5. HTTP & Web Services
Курс по информационни технологии (2013) - 5. HTTP & Web ServicesКурс по информационни технологии (2013) - 5. HTTP & Web Services
Курс по информационни технологии (2013) - 5. HTTP & Web ServicesDAVID Academy
 
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET FrameworkКурс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET FrameworkDAVID Academy
 
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...DAVID Academy
 
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...DAVID Academy
 
Курс по информационни технологии (2013) - Помагало
Курс по информационни технологии (2013) - ПомагалоКурс по информационни технологии (2013) - Помагало
Курс по информационни технологии (2013) - ПомагалоDAVID Academy
 
Курс по програмиране на C# (2013) - Упражнения
Курс по програмиране на C# (2013) - УпражненияКурс по програмиране на C# (2013) - Упражнения
Курс по програмиране на C# (2013) - УпражненияDAVID Academy
 
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...DAVID Academy
 

More from DAVID Academy (20)

Курс по уеб програмиране (2015), занятие №2 - CSS
Курс по уеб програмиране (2015), занятие №2 - CSSКурс по уеб програмиране (2015), занятие №2 - CSS
Курс по уеб програмиране (2015), занятие №2 - CSS
 
Училищен курс по програмиране на C# (2013/2014), занятие №14
Училищен курс по програмиране на C# (2013/2014), занятие №14Училищен курс по програмиране на C# (2013/2014), занятие №14
Училищен курс по програмиране на C# (2013/2014), занятие №14
 
Курс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSSКурс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSS
 
Училищен курс по програмиране на C# (2013/2014), занятие №12
Училищен курс по програмиране на C# (2013/2014), занятие №12Училищен курс по програмиране на C# (2013/2014), занятие №12
Училищен курс по програмиране на C# (2013/2014), занятие №12
 
Курс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTMLКурс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTML
 
Училищен курс по програмиране на C# (2013/2014), занятие №10
Училищен курс по програмиране на C# (2013/2014), занятие №10Училищен курс по програмиране на C# (2013/2014), занятие №10
Училищен курс по програмиране на C# (2013/2014), занятие №10
 
Училищен курс по програмиране на C# (2013/2014), занятие №9
Училищен курс по програмиране на C# (2013/2014), занятие №9Училищен курс по програмиране на C# (2013/2014), занятие №9
Училищен курс по програмиране на C# (2013/2014), занятие №9
 
Училищен курс по програмиране на C# (2013/2014), занятие №8
Училищен курс по програмиране на C# (2013/2014), занятие №8Училищен курс по програмиране на C# (2013/2014), занятие №8
Училищен курс по програмиране на C# (2013/2014), занятие №8
 
Училищен курс по програмиране на C# (2013/2014), занятие №7
Училищен курс по програмиране на C# (2013/2014), занятие №7Училищен курс по програмиране на C# (2013/2014), занятие №7
Училищен курс по програмиране на C# (2013/2014), занятие №7
 
Училищен курс по програмиране на C# (2013/2014) - Помагало
Училищен курс по програмиране на C# (2013/2014) - ПомагалоУчилищен курс по програмиране на C# (2013/2014) - Помагало
Училищен курс по програмиране на C# (2013/2014) - Помагало
 
Училищен курс по програмиране на C# (2013/2014) - Упражнения
Училищен курс по програмиране на C# (2013/2014) - УпражненияУчилищен курс по програмиране на C# (2013/2014) - Упражнения
Училищен курс по програмиране на C# (2013/2014) - Упражнения
 
Училищен курс по програмиране на C# (2013/2014), занятие №4
Училищен курс по програмиране на C# (2013/2014), занятие №4Училищен курс по програмиране на C# (2013/2014), занятие №4
Училищен курс по програмиране на C# (2013/2014), занятие №4
 
Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3
 
Курс по информационни технологии (2013) - 5. HTTP & Web Services
Курс по информационни технологии (2013) - 5. HTTP & Web ServicesКурс по информационни технологии (2013) - 5. HTTP & Web Services
Курс по информационни технологии (2013) - 5. HTTP & Web Services
 
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET FrameworkКурс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
 
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...
 
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
 
Курс по информационни технологии (2013) - Помагало
Курс по информационни технологии (2013) - ПомагалоКурс по информационни технологии (2013) - Помагало
Курс по информационни технологии (2013) - Помагало
 
Курс по програмиране на C# (2013) - Упражнения
Курс по програмиране на C# (2013) - УпражненияКурс по програмиране на C# (2013) - Упражнения
Курс по програмиране на C# (2013) - Упражнения
 
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
 

Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQL

  • 3. ADO.NET • Какво е „ADO.NET“? – – – – Част от .NET Framework Наследник на ActiveX Data Objects (ADO) Предоставя удобни начини за достъп до бази данни Минимална зависимост от избора на СУБД
  • 4. ADO.NET • 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
  • 5. ADO.NET • Модели за достъп до данните в ADO.NET – – – – Свързан модел Несвързан модел LINQ to SQL Entity Framework
  • 6. ADO.NET • Низове за връзка (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
  • 7. ADO.NET • Основни параметри на низовете за връзка – – – – – – Server Database Integrated Security User ID Password Persist Security Info
  • 8. ADO.NET • Автоматично генериране на низове за връзка – Използва се класът SqlConnectionStringBuilder – Параметрите на връзката са свойства на обекта
  • 9. ADO.NET • Съхраняване на низове за връзка в конфигурационен файл – Позволява промяна без прекомпилиране на приложението – Записва се в секцията <connectionStrings> – Достъпва се през статичното свойство ConfigurationManager.ConnectionStrings
  • 10. ADO.NET • Съхраняване на низове за връзка в конфигурационен файл <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;
  • 11. ADO.NET • Класът SqlConnection – – – – Осъществява връзката с базата данни Получава connection string Методът Open() Имплементира IDisposable using (var connection = new SqlConnection()) { connection.ConnectionString = ConfigurationManager .ConnectionStrings["connection"].ConnectionString; connection.Open(); // операции върху базата... }
  • 12. ADO.NET • Класът SqlCommand – Служи за изпълнение на заявки – Получава отворен SqlConnection – Методите ExecuteNonQuery(), ExecuteScalar(), ExecuteReade r() – Имплементира IDisposable using (SqlCommand command = connection.CreateCommand()) { command.CommandText = "SELECT COUNT(*) FROM [Producers]"; int producerCount = (int)command.ExecuteScalar(); Console.WriteLine("Producers count: {0}", producerCount); }
  • 13. ADO.NET • Класът SqlCommand – методът ExecuteReader() using (SqlCommand command = connection.CreateCommand()) { command.CommandText = "SELECT [ProducerID], [Name] FROM [Producers]"; using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine("ProducerID: {0}; Name: {1}", reader["ProducerID"], reader["Name"]); } } }
  • 14. ADO.NET • Класът SqlCommand – параметри – Служат за динамично предаване на стойности – Име, тип и стойност – Свойството Parameters
  • 15. ADO.NET • Класът SqlCommand – параметри 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 (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine("BrandID: {0}; Name: {1}", reader["BrandID"], reader["Name"]); } } }
  • 16. ADO.NET • Класът SqlCommand – съхранени процедури – На свойството CommandType се прсивоява стойност CommandType.StoredProcedure – Стойности на параметрите се подават през свойството Parameters
  • 17. ADO.NET • Класът SqlCommand – съхранени процедури 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); }
  • 18. ADO.NET • Трансакции в 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(); }
  • 19. SQL Injection атаки • Какво е „SQL Injection“? – Пробив в сигурността на базата данни – Възможно е да се използва, ако динамично се генерират заявки с конкатениране на низове
  • 20. SQL Injection атаки • Пример за 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 (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine("BrandID: {0}; Name: {1}", reader["BrandID"], reader["Name"]); } } }
  • 21. SQL Injection атаки • Пример за SQL Injection '); DELETE FROM [Products];-- SELECT [ProductID], [Name] FROM [Products] WHERE ([Name] = N''); DELETE FROM [Products];--')
  • 22. SQL Injection атаки • Пример за 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 (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine("BrandID: {0}; Name: {1}", reader["BrandID"], reader["Name"]); } } }
  • 23. LINQ • Разширителни методи на IEnumerable<T> – Въведени в .NET Framework 3.5 – Улесняват прилагането на често използвани операции върху колекции – Следват функционалната парадигма – Описани в статичния клас System.Linq.Enumerable
  • 24. LINQ • Разширителни методи на 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)
  • 25. LINQ • Разширителни методи на 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); }
  • 26. LINQ • Разширителни методи на IEnumerable<T> – методи, които предизвикват изпълнение – First, Last, FirstOrDefault, LastOrDefault – Sum, Min, Max, Average, Count – ToList, ToArray, ToDictionary
  • 27. LINQ • Разширителни методи на 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)
  • 28. LINQ • Разширителни методи на IEnumerable<T> – групиране IEnumerable<IGrouping<U, T>> GroupBy<T, U>(this IEnumerable<T> source, Func<T, U> keySelector)
  • 29. LINQ • Разширителни методи на 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)
  • 30. LINQ • Какво е „LINQ“? – Language INtegrated Query – Специален синтаксис в C# и Visual Basic .NET, който е подобен на SQL – Също въведен в .NET Framework 3.5 – Трансформира се в извиквания на разширителните методи на IEnumerable<T> и IQueryable<T> – Няколко различни имплементации
  • 31. LINQ • LINQ – примери var example1 = from n in numbers select n*2; var example1 = numbers.Select(n => n*2);
  • 32. LINQ • 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);
  • 33. LINQ • 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);
  • 34. LINQ • 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));
  • 35. LINQ • Интерфейсът IQueryable<T> – Наследява IEnumerable<T> – Различна имплементация на повечето разширителни методи на IEnumerable<T> – Служи за трансформиране на LINQ заявки към SQL, XPath и др. – Клас с разширителни методи System.Linq.Queryable
  • 36. LINQ • Имплементации на LINQ – – – – – LINQ to Objects LINQ to XML LINQ to Dataset LINQ to SQL LINQ to Entities
  • 37. LINQ to SQL • Какво е „LINQ to SQL“? – Част от ADO.NET – Въведен в .NET Framework 3.5 – Object-Relational Mapping (ORM) – ръчно дефиниране или описване с DBML – Само с Data Provider for SQL Server – Пространството от имена System.Data.Linq
  • 38. LINQ to SQL • Ръчно описване на ORM модела – Прави се с атрибути – Пространството от имена System.Data.Linq.Mapping
  • 39. LINQ to SQL • Ръчно описване на 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; } }
  • 40. LINQ to SQL • Ръчно описване на ORM модела – връзки – Атрибутът Association – Типовете EntitySet<T> и EntityRef<T>
  • 41. LINQ to SQL • Ръчно описване на ORM модела – връзки [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); } } }
  • 42. LINQ to SQL • Ръчно описване на 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; } } }
  • 43. LINQ to SQL • Ръчно описване на 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);
  • 44. 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);
  • 45. LINQ to SQL • Описване на ORM модела с DBML – – – – Специализиран XML документ LINQ to SQL Classes файлов шаблон Автоматично генериране на C# код partial класове - добавяне на методи/свойства във външни файлове
  • 46. LINQ to SQL • ORM модел: Здравословно хранене
  • 47. LINQ to SQL • Добавяне на записи Brand brand = context.Brands.Single(b => b.BrandID == 5); var product = new Product { Name = "Шоколад Milka алпийско мляко", EnergyValue = 532, }; brand.Products.Add(product);
  • 48. 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;
  • 49. LINQ to SQL • Изтриване на записи Product product = context.Products.Single(p => p.ProductID == 19); context.Products.DeleteOnSubmit(product);
  • 50. LINQ to SQL • Записване на промените в базата данни – Методът SubmitChanges() на класа DataContext context.SubmitChanges();
  • 52. Благодаря! • Александър Далемски – – – – sasho@david.bg musashi.bg@gmail.com Skype: musasho https://www.facebook.com/adalemski • ДАВИД академия – – – – acad@david.bg http://acad.david.bg/ @david_academy https://www.facebook.com/groups/david.academy/