Presentation is loading. Please wait.

Presentation is loading. Please wait.

2013 Copyright © 2013 DAVID Holding Company Курс по информационни технологии Занятие №3 ADO.NET. LINQ to SQL.

Similar presentations


Presentation on theme: "2013 Copyright © 2013 DAVID Holding Company Курс по информационни технологии Занятие №3 ADO.NET. LINQ to SQL."— Presentation transcript:

1 2013 Copyright © 2013 DAVID Holding Company Курс по информационни технологии Занятие №3 ADO.NET. LINQ to SQL

2 Copyright © 2013 DAVID Holding Company Съдържание 1/1 ADO.NET SQL Injection атаки LINQ LINQ to SQL

3 Copyright © 2013 DAVID Holding Company ADO.NET Какво е „ADO.NET“? – Част от.NET Framework – Наследник на ActiveX Data Objects (ADO) – Предоставя удобни начини за достъп до бази данни – Минимална зависимост от избора на СУБД

4 Copyright © 2013 DAVID Holding Company 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 Copyright © 2013 DAVID Holding Company ADO.NET Модели за достъп до данните в ADO.NET – Свързан модел – Несвързан модел – LINQ to SQL – Entity Framework

6 Copyright © 2013 DAVID Holding Company 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 Copyright © 2013 DAVID Holding Company ADO.NET Основни параметри на низовете за връзка – Server – Database – Integrated Security – User ID – Password – Persist Security Info

8 Copyright © 2013 DAVID Holding Company ADO.NET Автоматично генериране на низове за връзка – Използва се класът SqlConnectionStringBuilder – Параметрите на връзката са свойства на обекта

9 Copyright © 2013 DAVID Holding Company ADO.NET Съхраняване на низове за връзка в конфигурационен файл – Позволява промяна без прекомпилиране на приложението – Записва се в секцията – Достъпва се през статичното свойство ConfigurationManager.ConnectionStrings

10 Copyright © 2013 DAVID Holding Company ADO.NET Съхраняване на низове за връзка в конфигурационен файл connection.ConnectionString = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;

11 Copyright © 2013 DAVID Holding Company ADO.NET Класът SqlConnection – Осъществява връзката с базата данни – Получава connection string – Методът Open() – Имплементира IDisposable using (var connection = new SqlConnection()) { connection.ConnectionString = ConfigurationManager.ConnectionStrings["connection"].ConnectionString; connection.Open(); // операции върху базата... }

12 Copyright © 2013 DAVID Holding Company ADO.NET Класът 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); }

13 Copyright © 2013 DAVID Holding Company 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 Copyright © 2013 DAVID Holding Company ADO.NET Класът SqlCommand – параметри – Служат за динамично предаване на стойности – Име, тип и стойност – Свойството Parameters

15 Copyright © 2013 DAVID Holding Company 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 Copyright © 2013 DAVID Holding Company ADO.NET Класът SqlCommand – съхранени процедури – На свойството CommandType се прсивоява стойност CommandType.StoredProcedure – Стойности на параметрите се подават през свойството Parameters

17 Copyright © 2013 DAVID Holding Company 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 Copyright © 2013 DAVID Holding Company 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 Copyright © 2013 DAVID Holding Company SQL Injection атаки Какво е „SQL Injection“? – Пробив в сигурността на базата данни – Възможно е да се използва, ако динамично се генерират заявки с конкатениране на низове

20 Copyright © 2013 DAVID Holding Company 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 Copyright © 2013 DAVID Holding Company SQL Injection атаки Пример за SQL Injection '); DELETE FROM [Products];-- SELECT [ProductID], [Name] FROM [Products] WHERE ([Name] = N''); DELETE FROM [Products];--')

22 Copyright © 2013 DAVID Holding Company 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 Copyright © 2013 DAVID Holding Company LINQ Разширителни методи на IEnumerable – Въведени в.NET Framework 3.5 – Улесняват прилагането на често използвани операции върху колекции – Следват функционалната парадигма – Описани в статичния клас System.Linq.Enumerable

24 Copyright © 2013 DAVID Holding Company LINQ Разширителни методи на IEnumerable IEnumerable Select (this IEnumerable source, Func selector) IEnumerable Where (this IEnumerable source, Func predicate) U Aggregate (this IEnumerable source, U seed, Func function) IEnumerable Skip (this IEnumerable source, int count) IEnumerable Take (this IEnumerable source, int count)

25 Copyright © 2013 DAVID Holding Company LINQ Разширителни методи на IEnumerable – отложено изпълнение var numbers = new List () { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; IEnumerable 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 Copyright © 2013 DAVID Holding Company LINQ Разширителни методи на IEnumerable – методи, които предизвикват изпълнение – First, Last, FirstOrDefault, LastOrDefault – Sum, Min, Max, Average, Count – ToList, ToArray, ToDictionary

27 Copyright © 2013 DAVID Holding Company LINQ Разширителни методи на IEnumerable – сортировка IOrderedEnumerable OrderBy (this IEnumerable source, Func keySelector) IOrderedEnumerable OrderByDescending ( this IEnumerable source, Func keySelector) IOrderedEnumerable ThenBy (this IOrderedEnumerable source, Func keySelector) IOrderedEnumerable ThenByDescending ( this IOrderedEnumerable source, Func keySelector)

28 Copyright © 2013 DAVID Holding Company LINQ Разширителни методи на IEnumerable – групиране IEnumerable > GroupBy (this IEnumerable source, Func keySelector)

29 Copyright © 2013 DAVID Holding Company LINQ Разширителни методи на IEnumerable – съединения IEnumerable Join (this IEnumerable first, IEnumerable second, Func firstKeySelector, Func secondKeySelector, Func resultSelector) IEnumerable GroupJoin ( this IEnumerable first, IEnumerable second, Func firstKeySelector, Func secondKeySelector, Func, W> resultSelector)

30 Copyright © 2013 DAVID Holding Company LINQ Какво е „LINQ“? – Language INtegrated Query – Специален синтаксис в C# и Visual Basic.NET, който е подобен на SQL – Също въведен в.NET Framework 3.5 – Трансформира се в извиквания на разширителните методи на IEnumerable и IQueryable – Няколко различни имплементации

31 Copyright © 2013 DAVID Holding Company LINQ LINQ – примери var example1 = from n in numbers select n*2; var example1 = numbers.Select(n => n*2);

32 Copyright © 2013 DAVID Holding Company 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 Copyright © 2013 DAVID Holding Company 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 Copyright © 2013 DAVID Holding Company 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 Copyright © 2013 DAVID Holding Company LINQ Интерфейсът IQueryable – Наследява IEnumerable – Различна имплементация на повечето разширителни методи на IEnumerable – Служи за трансформиране на LINQ заявки към SQL, XPath и др. – Клас с разширителни методи System.Linq.Queryable

36 Copyright © 2013 DAVID Holding Company LINQ Имплементации на LINQ – LINQ to Objects – LINQ to XML – LINQ to Dataset – LINQ to SQL – LINQ to Entities

37 Copyright © 2013 DAVID Holding Company 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 Copyright © 2013 DAVID Holding Company LINQ to SQL Ръчно описване на ORM модела – Прави се с атрибути – Пространството от имена System.Data.Linq.Mapping

39 Copyright © 2013 DAVID Holding Company 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 Copyright © 2013 DAVID Holding Company LINQ to SQL Ръчно описване на ORM модела – връзки – Атрибутът Association – Типовете EntitySet и EntityRef

41 Copyright © 2013 DAVID Holding Company LINQ to SQL Ръчно описване на ORM модела – връзки [Table(Name = "Producers")] public class Producer { private EntitySet _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 Brands { get { return _brands; } set { _brands.Assign(value); } } }

42 Copyright © 2013 DAVID Holding Company LINQ to SQL Ръчно описване на ORM модела – връзки [Table(Name = "Brands")] public class Brand { private EntityRef _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 Copyright © 2013 DAVID Holding Company LINQ to SQL Ръчно описване на ORM модела – контекст – Базовият клас DataContext public class HealthyFoodContext : DataContext { public HealthyFoodContext(string connectionString) : base(connectionString) { } public Table Producers { get { return GetTable (); } } public Table Brands { get { return GetTable (); } } } string connectionString = ConfigurationManager.ConnectionStrings["connection"].ConnectionString; var context = new HealthyFoodContext(connectionString);

44 Copyright © 2013 DAVID Holding Company LINQ to SQL Примерни заявки IEnumerable brands = from b in context.Brands select b; IEnumerable 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 brands = context.Producers.Where(p => p.Name != "Kraft Foods").SelectMany(p => p.Brands); Producer producer = context.Producers.Single(p => p.ProducerID == 3);

45 Copyright © 2013 DAVID Holding Company LINQ to SQL Описване на ORM модела с DBML – Специализиран XML документ – LINQ to SQL Classes файлов шаблон – Автоматично генериране на C# код – partial класове - добавяне на методи/свойства във външни файлове

46 Copyright © 2013 DAVID Holding Company LINQ to SQL ORM модел: Здравословно хранене

47 Copyright © 2013 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);

48 Copyright © 2013 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;

49 Copyright © 2013 DAVID Holding Company LINQ to SQL Изтриване на записи Product product = context.Products.Single(p => p.ProductID == 19); context.Products.DeleteOnSubmit(product);

50 Copyright © 2013 DAVID Holding Company LINQ to SQL Записване на промените в базата данни – Методът SubmitChanges() на класа DataContext context.SubmitChanges();

51 Copyright © 2013 DAVID Holding Company Въпроси?

52 Copyright © 2013 DAVID Holding Company Благодаря! Александър Далемски – sasho@david.bg sasho@david.bg – musashi.bg@gmail.com musashi.bg@gmail.com – Skype: musasho – https://www.facebook.com/adalemski https://www.facebook.com/adalemski ДАВИД академия – acad@david.bg acad@david.bg – http://acad.david.bg/ http://acad.david.bg/ – @david_academy @david_academy – https://www.facebook.com/groups/david.academy/ https://www.facebook.com/groups/david.academy/


Download ppt "2013 Copyright © 2013 DAVID Holding Company Курс по информационни технологии Занятие №3 ADO.NET. LINQ to SQL."

Similar presentations


Ads by Google