Курс по информационни
технологии
Занятие №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 Provid...
ADO.NET
• Модели за достъп до данните в ADO.NET
–
–
–
–

Свързан модел
Несвързан модел
LINQ to SQL
Entity Framework
ADO.NET
• Низове за връзка (connection strings)
– Служат за осъществяване на връзката с базата данни
– Представляват поред...
ADO.NET
• Основни параметри на низовете за връзка
–
–
–
–
–
–

Server
Database
Integrated Security
User ID
Password
Persis...
ADO.NET
• Автоматично генериране на низове за връзка
– Използва се класът SqlConnectionStringBuilder
– Параметрите на връз...
ADO.NET
• Съхраняване на низове за връзка в
конфигурационен файл
– Позволява промяна без прекомпилиране на
приложението
– ...
ADO.NET
• Съхраняване на низове за връзка в
конфигурационен файл
<configuration>
<connectionStrings>
<add name="connection...
ADO.NET
• Класът SqlConnection
–
–
–
–

Осъществява връзката с базата данни
Получава connection string
Методът Open()
Импл...
ADO.NET
• Класът SqlCommand
– Служи за изпълнение на заявки
– Получава отворен SqlConnection
– Методите
ExecuteNonQuery(),...
ADO.NET
• Класът SqlCommand – методът ExecuteReader()
using (SqlCommand command = connection.CreateCommand())
{
command.Co...
ADO.NET
• Класът SqlCommand – параметри
– Служат за динамично предаване на стойности
– Име, тип и стойност
– Свойството Pa...
ADO.NET
• Класът SqlCommand – параметри
Console.Write("Input producer ID: ");
int producerID = Convert.ToInt32(Console.Rea...
ADO.NET
• Класът SqlCommand – съхранени процедури
– На свойството CommandType се прсивоява стойност
CommandType.StoredProc...
ADO.NET
• Класът SqlCommand – съхранени процедури
using (SqlCommand command = connection.CreateCommand())
{
command.Comman...
ADO.NET
• Трансакции в ADO.NET – класът
TransactionScope
– Методът Complete()
– Имплементира IDisposable
using (var ts = n...
SQL Injection атаки
• Какво е „SQL Injection“?
– Пробив в сигурността на базата данни
– Възможно е да се използва, ако дин...
SQL Injection атаки
• Пример за SQL Injection
Console.WriteLine("Input brand name to search for: ");
string name = Console...
SQL Injection атаки
• Пример за SQL Injection
'); DELETE FROM [Products];--

SELECT [ProductID], [Name] FROM [Products]
WH...
SQL Injection атаки
• Пример за SQL Injection
Console.WriteLine("Input brand name to search for: ");
string name = Console...
LINQ
• Разширителни методи на IEnumerable<T>
– Въведени в .NET Framework 3.5
– Улесняват прилагането на често използвани о...
LINQ
• Разширителни методи на IEnumerable<T>
IEnumerable<U> Select<T, U>(this IEnumerable<T> source, Func<T, U> selector)
...
LINQ
• Разширителни методи на IEnumerable<T> –
отложено изпълнение
var numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7,...
LINQ
• Разширителни методи на IEnumerable<T> –
методи, които предизвикват изпълнение
– First, Last, FirstOrDefault, LastOr...
LINQ
• Разширителни методи на IEnumerable<T> –
сортировка
IOrderedEnumerable<T> OrderBy<T, U>(this IEnumerable<T> source,
...
LINQ
• Разширителни методи на IEnumerable<T> –
групиране
IEnumerable<IGrouping<U, T>> GroupBy<T, U>(this IEnumerable<T> so...
LINQ
• Разширителни методи на IEnumerable<T> –
съединения
IEnumerable<W> Join<T, U, V, W>(this IEnumerable<T> first,
IEnum...
LINQ
• Какво е „LINQ“?
– Language INtegrated Query
– Специален синтаксис в C# и Visual Basic .NET, който е
подобен на SQL
...
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...
LINQ
• LINQ – примери
var example3 = from n in numbers
group n by n % 3 into ng
where ng.Count() == 2
select ng;
var examp...
LINQ
• LINQ – примери
var example4 = from n in numbers
join m in numbers on n % 3 equals m % 3
select Tuple.Create(n, m);
...
LINQ
• Интерфейсът IQueryable<T>
– Наследява IEnumerable<T>
– Различна имплементация на повечето разширителни
методи на IE...
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) – ...
LINQ to SQL
• Ръчно описване на ORM модела
– Прави се с атрибути
– Пространството от имена System.Data.Linq.Mapping
LINQ to SQL
• Ръчно описване на ORM модела – таблици
– Атрибутът Table
– Атрибутът Column
[Table(Name = "Producers")]
publ...
LINQ to SQL
• Ръчно описване на ORM модела – връзки
– Атрибутът Association
– Типовете EntitySet<T> и EntityRef<T>
LINQ to SQL
• Ръчно описване на ORM модела – връзки
[Table(Name = "Producers")]
public class Producer
{
private EntitySet<...
LINQ to SQL
• Ръчно описване на ORM модела – връзки
[Table(Name = "Brands")]
public class Brand
{
private EntityRef<Produc...
LINQ to SQL
• Ръчно описване на ORM модела – контекст
– Базовият клас DataContext
public class HealthyFoodContext : DataCo...
LINQ to SQL
• Примерни заявки
IEnumerable<Brand> brands = from b in context.Brands
select b;
IEnumerable<Brand> brands = f...
LINQ to SQL
• Описване на ORM модела с DBML
–
–
–
–

Специализиран XML документ
LINQ to SQL Classes файлов шаблон
Автомати...
LINQ to SQL
• ORM модел: Здравословно хранене
LINQ to SQL
• Добавяне на записи
Brand brand = context.Brands.Single(b => b.BrandID == 5);
var product = new Product
{
Nam...
LINQ to SQL
• Редактиране на записи
Product product = context.Products.Single(p => p.ProductID == 19);
product.Proteins = ...
LINQ to SQL
• Изтриване на записи
Product product = context.Products.Single(p => p.ProductID == 19);
context.Products.Dele...
LINQ to SQL
• Записване на промените в базата данни
– Методът SubmitChanges() на класа DataContext
context.SubmitChanges()...
Въпроси?
Благодаря!
• Александър Далемски
–
–
–
–

sasho@david.bg
musashi.bg@gmail.com
Skype: musasho
https://www.facebook.com/adal...
Upcoming SlideShare
Loading in …5
×

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

238
-1

Published on

Занятие №3 на курса по информационни технологии (2013) провеждан от ДАВИД академия в ПМГ "Никола Обрешков" - Казанлък. Включва темите:
- ADO.NET
- LINQ to SQL

Published in: Education, Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
238
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. Курс по информационни технологии Занятие №3 ADO.NET. LINQ to SQL 2013
  2. 2. Съдържание 1/1 • • • • ADO.NET SQL Injection атаки LINQ LINQ to SQL
  3. 3. ADO.NET • Какво е „ADO.NET“? – – – – Част от .NET Framework Наследник на ActiveX Data Objects (ADO) Предоставя удобни начини за достъп до бази данни Минимална зависимост от избора на СУБД
  4. 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. 5. ADO.NET • Модели за достъп до данните в ADO.NET – – – – Свързан модел Несвързан модел LINQ to SQL Entity Framework
  6. 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. 7. ADO.NET • Основни параметри на низовете за връзка – – – – – – Server Database Integrated Security User ID Password Persist Security Info
  8. 8. ADO.NET • Автоматично генериране на низове за връзка – Използва се класът SqlConnectionStringBuilder – Параметрите на връзката са свойства на обекта
  9. 9. ADO.NET • Съхраняване на низове за връзка в конфигурационен файл – Позволява промяна без прекомпилиране на приложението – Записва се в секцията <connectionStrings> – Достъпва се през статичното свойство ConfigurationManager.ConnectionStrings
  10. 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. 11. ADO.NET • Класът SqlConnection – – – – Осъществява връзката с базата данни Получава connection string Методът Open() Имплементира IDisposable using (var connection = new SqlConnection()) { connection.ConnectionString = ConfigurationManager .ConnectionStrings["connection"].ConnectionString; connection.Open(); // операции върху базата... }
  12. 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. 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. 14. ADO.NET • Класът SqlCommand – параметри – Служат за динамично предаване на стойности – Име, тип и стойност – Свойството Parameters
  15. 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. 16. ADO.NET • Класът SqlCommand – съхранени процедури – На свойството CommandType се прсивоява стойност CommandType.StoredProcedure – Стойности на параметрите се подават през свойството Parameters
  17. 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. 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. 19. SQL Injection атаки • Какво е „SQL Injection“? – Пробив в сигурността на базата данни – Възможно е да се използва, ако динамично се генерират заявки с конкатениране на низове
  20. 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. 21. SQL Injection атаки • Пример за SQL Injection '); DELETE FROM [Products];-- SELECT [ProductID], [Name] FROM [Products] WHERE ([Name] = N''); DELETE FROM [Products];--')
  22. 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. 23. LINQ • Разширителни методи на IEnumerable<T> – Въведени в .NET Framework 3.5 – Улесняват прилагането на често използвани операции върху колекции – Следват функционалната парадигма – Описани в статичния клас System.Linq.Enumerable
  24. 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. 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. 26. LINQ • Разширителни методи на IEnumerable<T> – методи, които предизвикват изпълнение – First, Last, FirstOrDefault, LastOrDefault – Sum, Min, Max, Average, Count – ToList, ToArray, ToDictionary
  27. 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. 28. LINQ • Разширителни методи на IEnumerable<T> – групиране IEnumerable<IGrouping<U, T>> GroupBy<T, U>(this IEnumerable<T> source, Func<T, U> keySelector)
  29. 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. 30. LINQ • Какво е „LINQ“? – Language INtegrated Query – Специален синтаксис в C# и Visual Basic .NET, който е подобен на SQL – Също въведен в .NET Framework 3.5 – Трансформира се в извиквания на разширителните методи на IEnumerable<T> и IQueryable<T> – Няколко различни имплементации
  31. 31. LINQ • LINQ – примери var example1 = from n in numbers select n*2; var example1 = numbers.Select(n => n*2);
  32. 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. 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. 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. 35. LINQ • Интерфейсът IQueryable<T> – Наследява IEnumerable<T> – Различна имплементация на повечето разширителни методи на IEnumerable<T> – Служи за трансформиране на LINQ заявки към SQL, XPath и др. – Клас с разширителни методи System.Linq.Queryable
  36. 36. LINQ • Имплементации на LINQ – – – – – LINQ to Objects LINQ to XML LINQ to Dataset LINQ to SQL LINQ to Entities
  37. 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. 38. LINQ to SQL • Ръчно описване на ORM модела – Прави се с атрибути – Пространството от имена System.Data.Linq.Mapping
  39. 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. 40. LINQ to SQL • Ръчно описване на ORM модела – връзки – Атрибутът Association – Типовете EntitySet<T> и EntityRef<T>
  41. 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. 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. 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. 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. 45. LINQ to SQL • Описване на ORM модела с DBML – – – – Специализиран XML документ LINQ to SQL Classes файлов шаблон Автоматично генериране на C# код partial класове - добавяне на методи/свойства във външни файлове
  46. 46. LINQ to SQL • ORM модел: Здравословно хранене
  47. 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. 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. 49. LINQ to SQL • Изтриване на записи Product product = context.Products.Single(p => p.ProductID == 19); context.Products.DeleteOnSubmit(product);
  50. 50. LINQ to SQL • Записване на промените в базата данни – Методът SubmitChanges() на класа DataContext context.SubmitChanges();
  51. 51. Въпроси?
  52. 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/
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×