Курс по информационни технологии (2013) - 3. ado.net, linq to sql
DESCRIPTION
Занятие №3 на курса по информационни технологии (2013) провеждан от ДАВИД академия в ПМГ "Никола Обрешков" - Казанлък. Включва темите: - ADO.NET - LINQ to SQLTRANSCRIPT
2013Copyright © 2013 DAVID Holding Company
Курс по информационни
технологииЗанятие №3ADO.NET. LINQ to
SQL
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Съдържание 1/1
• ADO.NET• SQL Injection атаки• LINQ• LINQ to SQL
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
ADO.NET
• Какво е „ADO.NET“?– Част от .NET Framework– Наследник на ActiveX Data Objects (ADO)– Предоставя удобни начини за достъп до бази
данни– Минимална зависимост от избора на СУБД
Copyright © 2013 DAVID Holding CompanyCopyright © 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
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
ADO.NET
• Модели за достъп до данните в ADO.NET– Свързан модел– Несвързан модел– LINQ to SQL– Entity Framework
Copyright © 2013 DAVID Holding CompanyCopyright © 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
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
ADO.NET
• Основни параметри на низовете за връзка– Server– Database– Integrated Security– User ID– Password– Persist Security Info
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
ADO.NET
• Автоматично генериране на низове за връзка– Използва се класът SqlConnectionStringBuilder
– Параметрите на връзката са свойства на обекта
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
ADO.NET
• Съхраняване на низове за връзка в конфигурационен файл– Позволява промяна без прекомпилиране на
приложението– Записва се в секцията <connectionStrings>– Достъпва се през статичното свойство ConfigurationManager.ConnectionStrings
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
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;
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
ADO.NET
• Класът SqlConnection– Осъществява връзката с базата данни– Получава connection string– Методът Open()– Имплементира IDisposable
using (var connection = new SqlConnection()){ connection.ConnectionString = ConfigurationManager .ConnectionStrings["connection"].ConnectionString; connection.Open();
// операции върху базата...}
Copyright © 2013 DAVID Holding CompanyCopyright © 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);}
Copyright © 2013 DAVID Holding CompanyCopyright © 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"]); } }}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
ADO.NET
• Класът SqlCommand – параметри– Служат за динамично предаване на стойности– Име, тип и стойност– Свойството Parameters
Copyright © 2013 DAVID Holding CompanyCopyright © 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"]); } }}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
ADO.NET
• Класът SqlCommand – съхранени процедури– На свойството CommandType се прсивоява
стойност CommandType.StoredProcedure– Стойности на параметрите се подават през
свойството Parameters
Copyright © 2013 DAVID Holding CompanyCopyright © 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);}
Copyright © 2013 DAVID Holding CompanyCopyright © 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();}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
SQL Injection атаки
• Какво е „SQL Injection“?– Пробив в сигурността на базата данни– Възможно е да се използва, ако динамично се
генерират заявки с конкатениране на низове
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
SQL Injection атаки
• Пример за SQL InjectionConsole.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"]); } }}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
SQL Injection атаки
• Пример за SQL Injection
'); DELETE FROM [Products];--
SELECT [ProductID], [Name] FROM [Products]WHERE ([Name] = N''); DELETE FROM [Products];--')
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
SQL Injection атаки
• Пример за SQL InjectionConsole.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"]); } }}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
LINQ
• Разширителни методи на IEnumerable<T>– Въведени в .NET Framework 3.5– Улесняват прилагането на често използвани
операции върху колекции– Следват функционалната парадигма– Описани в статичния клас System.Linq.Enumerable
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
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)
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
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);}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
LINQ
• Разширителни методи на IEnumerable<T> – методи, които предизвикват изпълнение– First, Last, FirstOrDefault, LastOrDefault– Sum, Min, Max, Average, Count– ToList, ToArray, ToDictionary
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
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)
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
LINQ
• Разширителни методи на IEnumerable<T> – групиране
IEnumerable<IGrouping<U, T>> GroupBy<T, U>(this IEnumerable<T> source, Func<T, U> keySelector)
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
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)
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
LINQ
• Какво е „LINQ“?– Language INtegrated Query– Специален синтаксис в C# и Visual Basic .NET,
който е подобен на SQL– Също въведен в .NET Framework 3.5– Трансформира се в извиквания на
разширителните методи на IEnumerable<T> и IQueryable<T>
– Няколко различни имплементации
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
LINQ
• LINQ – примери
var example1 = from n in numbers select n*2;
var example1 = numbers.Select(n => n*2);
Copyright © 2013 DAVID Holding CompanyCopyright © 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);
Copyright © 2013 DAVID Holding CompanyCopyright © 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);
Copyright © 2013 DAVID Holding CompanyCopyright © 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));
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
LINQ
• Интерфейсът IQueryable<T>– Наследява IEnumerable<T>– Различна имплементация на повечето
разширителни методи на IEnumerable<T>– Служи за трансформиране на LINQ заявки към
SQL, XPath и др.– Клас с разширителни методи System.Linq.Queryable
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
LINQ
• Имплементации на LINQ– LINQ to Objects– LINQ to XML– LINQ to Dataset– LINQ to SQL– LINQ to Entities
Copyright © 2013 DAVID Holding CompanyCopyright © 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
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
LINQ to SQL
• Ръчно описване на ORM модела– Прави се с атрибути– Пространството от имена System.Data.Linq.Mapping
Copyright © 2013 DAVID Holding CompanyCopyright © 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; }}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
LINQ to SQL
• Ръчно описване на ORM модела – връзки– Атрибутът Association– Типовете EntitySet<T> и EntityRef<T>
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
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); } }}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
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; } }}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
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);
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 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);
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
LINQ to SQL
• Описване на ORM модела с DBML– Специализиран XML документ– LINQ to SQL Classes файлов шаблон– Автоматично генериране на C# код– partial класове - добавяне на
методи/свойства във външни файлове
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
LINQ to SQL
• ORM модел: Здравословно хранене
Copyright © 2013 DAVID Holding CompanyCopyright © 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);
Copyright © 2013 DAVID Holding CompanyCopyright © 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;
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
LINQ to SQL
• Изтриване на записи
Product product = context.Products.Single(p => p.ProductID == 19);context.Products.DeleteOnSubmit(product);
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
LINQ to SQL
• Записване на промените в базата данни– Методът SubmitChanges() на класа DataContext
context.SubmitChanges();
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Въпроси?
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Благодаря!
• Александър Далемски– [email protected]– [email protected]– Skype: musasho– https://www.facebook.com/adalemski
• ДАВИД академия– [email protected]– http://acad.david.bg/– @david_academy– https://www.facebook.com/groups/david.academy/