Top Banner
http:// http:// academy.devbg.org academy.devbg.org Христо Радков Христо Радков ADO.NET ADO.NET Работа с бази от данни Работа с бази от данни
142

ADO.NET

Jan 04, 2016

Download

Documents

adriana-synge

Работа с бази от данни. ADO.NET. http:// academy.devbg.org. Христо Радков. Необходими знания. Базови познания за .NET Framework Базови познания за езика C# Начални умения за работа с Visual Studio .NET и Windows Forms редактора му - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: ADO.NET

http://http://academy.devbg.orgacademy.devbg.org Христо РадковХристо РадковХристо РадковХристо Радков

ADO.NETADO.NET

Работа с бази от данниРабота с бази от данни

Page 2: ADO.NET

Необходими знанияНеобходими знанияНеобходими знанияНеобходими знания

• Базови познания за .NET FrameworkБазови познания за .NET Framework

• Базови познания за езика C#Базови познания за езика C#

• Начални умения за работа с Начални умения за работа с Visual Visual Studio .NETStudio .NET и и Windows Forms Windows Forms редактора муредактора му

• Базови познания за релационни бази от Базови познания за релационни бази от данни и данни и MS SQL ServerMS SQL Server

• Базови познания за .NET FrameworkБазови познания за .NET Framework

• Базови познания за езика C#Базови познания за езика C#

• Начални умения за работа с Начални умения за работа с Visual Visual Studio .NETStudio .NET и и Windows Forms Windows Forms редактора муредактора му

• Базови познания за релационни бази от Базови познания за релационни бази от данни и данни и MS SQL ServerMS SQL Server

Page 3: ADO.NET

СъдържаниеСъдържаниеСъдържаниеСъдържание

• Модели за работа с даннитеМодели за работа с данните

• Свързан и несвързанСвързан и несвързан

• Еволюция на приложениятаЕволюция на приложенията

• Архитектура на ADO.NETАрхитектура на ADO.NET

• Data Providers, ИнтерфейсиData Providers, Интерфейси

• Връзка с MS SQL ServerВръзка с MS SQL Server

• SqlConnectionSqlConnection

• Batch UpdateBatch Update

• SqlBulkCopySqlBulkCopy

• Модели за работа с даннитеМодели за работа с данните

• Свързан и несвързанСвързан и несвързан

• Еволюция на приложениятаЕволюция на приложенията

• Архитектура на ADO.NETАрхитектура на ADO.NET

• Data Providers, ИнтерфейсиData Providers, Интерфейси

• Връзка с MS SQL ServerВръзка с MS SQL Server

• SqlConnectionSqlConnection

• Batch UpdateBatch Update

• SqlBulkCopySqlBulkCopy

Page 4: ADO.NET

СъдържаниеСъдържание (2) (2)СъдържаниеСъдържание (2) (2)

• Реализация на свързан моделРеализация на свързан модел

• SqlCommandSqlCommand, ,

• SqlDataReader(SqlDataReader(ExecuteXXX ExecuteXXX методиметоди))

• Параметрични заявкиПараметрични заявки

• Връзка с други бази от данни Връзка с други бази от данни

• Customized Data Provider Customized Data Provider

• DbProvidersFactories Class DbProvidersFactories Class

• OLE DBOLE DB

• Реализация на свързан моделРеализация на свързан модел

• SqlCommandSqlCommand, ,

• SqlDataReader(SqlDataReader(ExecuteXXX ExecuteXXX методиметоди))

• Параметрични заявкиПараметрични заявки

• Връзка с други бази от данни Връзка с други бази от данни

• Customized Data Provider Customized Data Provider

• DbProvidersFactories Class DbProvidersFactories Class

• OLE DBOLE DB

Page 5: ADO.NET

СъдържаниеСъдържание (3) (3)СъдържаниеСъдържание (3) (3)

• Реализация на несвързан моделРеализация на несвързан модел

• Класът Класът DataSetDataSet, силно-типизирани , силно-типизирани DataSetDataSet-и-и

• XML serialization XML serialization

• Binary serialization Binary serialization ((DataSet.RemoringFormatDataSet.RemoringFormat Property Property))

• Класовете Класовете DataTableDataTable(Load(Load and and SaveSave MethodsMethods)) DataRelation, DataView DataRelation, DataView и и DataAdapterDataAdapter

• Реализация на несвързан моделРеализация на несвързан модел

• Класът Класът DataSetDataSet, силно-типизирани , силно-типизирани DataSetDataSet-и-и

• XML serialization XML serialization

• Binary serialization Binary serialization ((DataSet.RemoringFormatDataSet.RemoringFormat Property Property))

• Класовете Класовете DataTableDataTable(Load(Load and and SaveSave MethodsMethods)) DataRelation, DataView DataRelation, DataView и и DataAdapterDataAdapter

Page 6: ADO.NET

СъдържаниеСъдържание ( (44))СъдържаниеСъдържание ( (44))

• Връзка между ADO.NET и XMLВръзка между ADO.NET и XML

• SSqlqlXXmlml and XmlAdapter and XmlAdapter

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

• Data Paging Data Paging

• асинхронни задачи в асинхронни задачи в ADO.NET ADO.NET

• Множество активни заявки през Множество активни заявки през една връзка - една връзка - MARSMARS

• Връзка между ADO.NET и XMLВръзка между ADO.NET и XML

• SSqlqlXXmlml and XmlAdapter and XmlAdapter

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

• Data Paging Data Paging

• асинхронни задачи в асинхронни задачи в ADO.NET ADO.NET

• Множество активни заявки през Множество активни заявки през една връзка - една връзка - MARSMARS

Page 7: ADO.NET

Модели за работа с данниМодели за работа с данниМодели за работа с данниМодели за работа с данни

• Свързан модел (Свързан модел (connected modelconnected model))• Постоянна връзка с данните (Постоянна връзка с данните (online)online)• Случаи на използванеСлучаи на използване• Проблеми – лоша скалируемостПроблеми – лоша скалируемост

• Несвързан моделНесвързан модел (disconnected model) (disconnected model)• Връзката с данните се осъществява Връзката с данните се осъществява offline – offline –

за изтегляне на данни и нанасяне на промениза изтегляне на данни и нанасяне на промени по даннитепо данните

• Случаи на използванеСлучаи на използване• ПримериПримери

• Достъп до данни чрез Достъп до данни чрез WebWeb услуга услуга• Интеграция с Интеграция с XMLXML

• Свързан модел (Свързан модел (connected modelconnected model))• Постоянна връзка с данните (Постоянна връзка с данните (online)online)• Случаи на използванеСлучаи на използване• Проблеми – лоша скалируемостПроблеми – лоша скалируемост

• Несвързан моделНесвързан модел (disconnected model) (disconnected model)• Връзката с данните се осъществява Връзката с данните се осъществява offline – offline –

за изтегляне на данни и нанасяне на промениза изтегляне на данни и нанасяне на промени по даннитепо данните

• Случаи на използванеСлучаи на използване• ПримериПримери

• Достъп до данни чрез Достъп до данни чрез WebWeb услуга услуга• Интеграция с Интеграция с XMLXML

Page 8: ADO.NET

Свързан моделСвързан моделСвързан моделСвързан модел

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

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

База отБаза отданниданни

DBDB

ADO.NETADO.NETклиентклиент

постояннапостояннасвързаностсвързаност

Page 9: ADO.NET

Свързан модел – за и Свързан модел – за и противпротивСвързан модел – за и Свързан модел – за и противпротив

• Предимства:Предимства:• Средата е по-лесна за подсигуряване Средата е по-лесна за подсигуряване

(по-малко усилия за разработчика)(по-малко усилия за разработчика)

• Контролът върху конкурентният Контролът върху конкурентният достъп се упражнява по-леснодостъп се упражнява по-лесно

• По-добра вероятност за работа с По-добра вероятност за работа с текущата версия на даннитетекущата версия на данните

• Недостатъци:Недостатъци:• Нужда от постоянна мрежова връзкаНужда от постоянна мрежова връзка

• Проблеми при нужда от скалируемостПроблеми при нужда от скалируемост

• Предимства:Предимства:• Средата е по-лесна за подсигуряване Средата е по-лесна за подсигуряване

(по-малко усилия за разработчика)(по-малко усилия за разработчика)

• Контролът върху конкурентният Контролът върху конкурентният достъп се упражнява по-леснодостъп се упражнява по-лесно

• По-добра вероятност за работа с По-добра вероятност за работа с текущата версия на даннитетекущата версия на данните

• Недостатъци:Недостатъци:• Нужда от постоянна мрежова връзкаНужда от постоянна мрежова връзка

• Проблеми при нужда от скалируемостПроблеми при нужда от скалируемост

Page 10: ADO.NET

Несвързан моделНесвързан моделНесвързан моделНесвързан модел

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

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

База отБаза отданниданни

DBDB

ADO.NETADO.NETклиентклиент

непостояннанепостояннасвързаностсвързаност

Page 11: ADO.NET

Несвързан модел – за и Несвързан модел – за и противпротивНесвързан модел – за и Несвързан модел – за и противпротив

• Предимства:Предимства:

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

• Други потребители могат да се свързват Други потребители могат да се свързват междувременномеждувременно

• Скалируемостта е доста добраСкалируемостта е доста добра

• Недостатъци:Недостатъци:

• Данните не винаги са текущиДанните не винаги са текущи

• Допълнителни усилия за решаване на Допълнителни усилия за решаване на конфликтите между различните версииконфликтите между различните версии

• Предимства:Предимства:

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

• Други потребители могат да се свързват Други потребители могат да се свързват междувременномеждувременно

• Скалируемостта е доста добраСкалируемостта е доста добра

• Недостатъци:Недостатъци:

• Данните не винаги са текущиДанните не винаги са текущи

• Допълнителни усилия за решаване на Допълнителни усилия за решаване на конфликтите между различните версииконфликтите между различните версии

Page 12: ADO.NET

Еволюция на Еволюция на приложениятаприложениятаЕволюция на Еволюция на приложениятаприложенията

• Еднослойни приложенияЕднослойни приложения• Най-често работи само един Най-често работи само един

потребителпотребител

• ПредимстваПредимства• Всички компоненти са на едно мястоВсички компоненти са на едно място

• НедостатъциНедостатъци• Промяна на функционалността изисква Промяна на функционалността изисква

преинсталацияпреинсталация

• ПримерПример• Приложение базирано на Приложение базирано на MS AccessMS Access

• Еднослойни приложенияЕднослойни приложения• Най-често работи само един Най-често работи само един

потребителпотребител

• ПредимстваПредимства• Всички компоненти са на едно мястоВсички компоненти са на едно място

• НедостатъциНедостатъци• Промяна на функционалността изисква Промяна на функционалността изисква

преинсталацияпреинсталация

• ПримерПример• Приложение базирано на Приложение базирано на MS AccessMS Access

Page 13: ADO.NET

Еволюция на Еволюция на приложениятаприложениятаЕволюция на Еволюция на приложениятаприложенията

• Двуслойни приложения (клиент-сървър)Двуслойни приложения (клиент-сървър)• Потребителският интерфейс и бизнес Потребителският интерфейс и бизнес

правилата се дефинират на едно мястоправилата се дефинират на едно място• Данните се съхраняват във втория слойДанните се съхраняват във втория слой• ПредимстваПредимства

• Има разделяне на функционалносттаИма разделяне на функционалността

• НедостатъциНедостатъци• Лоша скалируемост – проблеми с Лоша скалируемост – проблеми с

поддръжката на голям брой клиентиподдръжката на голям брой клиенти

• ПримериПримери• MS SQL Server MS SQL Server ↔↔ MS Query Analyzer MS Query Analyzer• MS Exchange MS Exchange ↔↔ MS Outlook MS Outlook

• Двуслойни приложения (клиент-сървър)Двуслойни приложения (клиент-сървър)• Потребителският интерфейс и бизнес Потребителският интерфейс и бизнес

правилата се дефинират на едно мястоправилата се дефинират на едно място• Данните се съхраняват във втория слойДанните се съхраняват във втория слой• ПредимстваПредимства

• Има разделяне на функционалносттаИма разделяне на функционалността

• НедостатъциНедостатъци• Лоша скалируемост – проблеми с Лоша скалируемост – проблеми с

поддръжката на голям брой клиентиподдръжката на голям брой клиенти

• ПримериПримери• MS SQL Server MS SQL Server ↔↔ MS Query Analyzer MS Query Analyzer• MS Exchange MS Exchange ↔↔ MS Outlook MS Outlook

Page 14: ADO.NET

Еволюция на Еволюция на приложениятаприложениятаЕволюция на Еволюция на приложениятаприложенията

• Трислойни приложенияТрислойни приложения• Различните типове функционалност са в Различните типове функционалност са в

различни слоеверазлични слоеве• ПредимстваПредимства

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

• НедостатъциНедостатъци• По-трудна поддръжкаПо-трудна поддръжка• Повече усилия за осигуряване на сигурносттаПовече усилия за осигуряване на сигурността

• ПримерПример• ASP.NETASP.NET Web-Web-приложение приложение ↔↔ ASP.NET Web ASP.NET Web

услуга услуга ↔↔ MS SQL ServerMS SQL Server

• Трислойни приложенияТрислойни приложения• Различните типове функционалност са в Различните типове функционалност са в

различни слоеверазлични слоеве• ПредимстваПредимства

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

• НедостатъциНедостатъци• По-трудна поддръжкаПо-трудна поддръжка• Повече усилия за осигуряване на сигурносттаПовече усилия за осигуряване на сигурността

• ПримерПример• ASP.NETASP.NET Web-Web-приложение приложение ↔↔ ASP.NET Web ASP.NET Web

услуга услуга ↔↔ MS SQL ServerMS SQL Server

Page 15: ADO.NET

Еволюция на Еволюция на приложениятаприложениятаЕволюция на Еволюция на приложениятаприложенията

• Многослойни приложенияМногослойни приложения• Системи с повече от 3 логически слояСистеми с повече от 3 логически слоя• Възможност за добавяне на още слоеве за Възможност за добавяне на още слоеве за

разширяване на функционалносттаразширяване на функционалността• ПредимстваПредимства

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

• НедостатъциНедостатъци• Много труден процес по дефиниране и Много труден процес по дефиниране и

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

срокове за разработкасрокове за разработка

• Многослойни приложенияМногослойни приложения• Системи с повече от 3 логически слояСистеми с повече от 3 логически слоя• Възможност за добавяне на още слоеве за Възможност за добавяне на още слоеве за

разширяване на функционалносттаразширяване на функционалността• ПредимстваПредимства

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

• НедостатъциНедостатъци• Много труден процес по дефиниране и Много труден процес по дефиниране и

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

срокове за разработкасрокове за разработка

Page 16: ADO.NET

В търсене на балансаВ търсене на балансаВ търсене на балансаВ търсене на баланса

Брой на слоеветеБрой на слоеветеБрой на слоеветеБрой на слоевете

Ко

мп

лек

сно

ст,

скал

ир

уем

ост

Ко

мп

лек

сно

ст,

скал

ир

уем

ост

Page 17: ADO.NET

Какво е Какво е ADO.NETADO.NET??Какво е Какво е ADO.NETADO.NET??

• Набор от класове за работа с данниНабор от класове за работа с данни

• Набор от класове, интерфейси, структури и Набор от класове, интерфейси, структури и други типове за достъп до данни през други типове за достъп до данни през изцяло изцяло .NET .NET базирана реализациябазирана реализация

• Програмен модел за работа с данниПрограмен модел за работа с данни

• Осигурява възможност за работа в Осигурява възможност за работа в несвързана среданесвързана среда

• Осигурява връзка с Осигурява връзка с XMLXML

• Наследник на Наследник на ADOADO ( (Windows Windows технология за технология за достъп до базидостъп до бази от данниот данни))

• Набор от класове за работа с данниНабор от класове за работа с данни

• Набор от класове, интерфейси, структури и Набор от класове, интерфейси, структури и други типове за достъп до данни през други типове за достъп до данни през изцяло изцяло .NET .NET базирана реализациябазирана реализация

• Програмен модел за работа с данниПрограмен модел за работа с данни

• Осигурява възможност за работа в Осигурява възможност за работа в несвързана среданесвързана среда

• Осигурява връзка с Осигурява връзка с XMLXML

• Наследник на Наследник на ADOADO ( (Windows Windows технология за технология за достъп до базидостъп до бази от данниот данни))

Page 18: ADO.NET

Namespace-Namespace-и на и на ADO.NETADO.NETNamespace-Namespace-и на и на ADO.NETADO.NET

• Пространства от имена от ADO.NETПространства от имена от ADO.NET

• System.DataSystem.Data – основни архитектурни – основни архитектурни класове на ADO.NETкласове на ADO.NET

• System.Data.CommonSystem.Data.Common – общи класове за – общи класове за всички data Provider-ивсички data Provider-и

• System.Data.SqlClientSystem.Data.SqlClient и и System.Data.SqlTypesSystem.Data.SqlTypes – Data Provider – Data Provider класове за достъп до SQL Serverкласове за достъп до SQL Server

• System.Data.OleDbSystem.Data.OleDb – връзка с OleDB – връзка с OleDB

• System.Data.OdbcSystem.Data.Odbc – връзка с ODBC – връзка с ODBC

• System.XmlSystem.Xml – връзка с XML – връзка с XML

• Пространства от имена от ADO.NETПространства от имена от ADO.NET

• System.DataSystem.Data – основни архитектурни – основни архитектурни класове на ADO.NETкласове на ADO.NET

• System.Data.CommonSystem.Data.Common – общи класове за – общи класове за всички data Provider-ивсички data Provider-и

• System.Data.SqlClientSystem.Data.SqlClient и и System.Data.SqlTypesSystem.Data.SqlTypes – Data Provider – Data Provider класове за достъп до SQL Serverкласове за достъп до SQL Server

• System.Data.OleDbSystem.Data.OleDb – връзка с OleDB – връзка с OleDB

• System.Data.OdbcSystem.Data.Odbc – връзка с ODBC – връзка с ODBC

• System.XmlSystem.Xml – връзка с XML – връзка с XML

Page 19: ADO.NET

Еволюция на Еволюция на ADO ADO към към ADO.NETADO.NETЕволюция на Еволюция на ADO ADO към към ADO.NETADO.NET

ADOADOADOADO

ConnectionConnection

CommandCommand

RecordsetRecordset

ADO.NETADO.NET

XxxConnectionXxxConnection

XxxCommandXxxCommand

XxxDataReaderXxxDataReader

XxxTransactionXxxTransaction

DataSetDataSet

XxxDataAdapterXxxDataAdapter

Page 20: ADO.NET

Компоненти на Компоненти на ADO.NETADO.NETКомпоненти на Компоненти на ADO.NETADO.NET

SQL Server SQL Server ..NET NET Data ProviderData Provider

OleDbOleDb ..NET NET Data ProviderData Provider

Oracle Oracle ..NET NET Data ProviderData Provider

ODBC ODBC ..NET NET Data ProviderData Provider

SQL Server 7.0 иSQL Sever 2000

OLE DB източници

(SQL Server 6.5,MS Acess и др.)

OracleDatabase

ODBC източници

DataSetDataSet

Disconnected modelDisconnected model

DataReaderDataReader CommandCommand

Connected modelConnected model

DataDataAdapterAdapter

Page 21: ADO.NET

Data Provider-Data Provider-и в и в ADO.NETADO.NETData Provider-Data Provider-и в и в ADO.NETADO.NET

• Data Provider-ите са съвкупности от Data Provider-ите са съвкупности от класове, които осигуряват връзка с класове, които осигуряват връзка с различни бази от данниразлични бази от данни• За различните RDBMS системи се За различните RDBMS системи се

използват различни Data Provider-и използват различни Data Provider-и • Различните производители използват Различните производители използват

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

• Дефинират се от 4 основни обекта:Дефинират се от 4 основни обекта:• ConnectionConnection – за връзка с базата – за връзка с базата• CommandCommand – за изпълнение на SQL – за изпълнение на SQL• DataReaderDataReader – за извличане на данни – за извличане на данни• DataAdapterDataAdapter – за връзка с – за връзка с DataSetDataSet

• Data Provider-ите са съвкупности от Data Provider-ите са съвкупности от класове, които осигуряват връзка с класове, които осигуряват връзка с различни бази от данниразлични бази от данни• За различните RDBMS системи се За различните RDBMS системи се

използват различни Data Provider-и използват различни Data Provider-и • Различните производители използват Различните производители използват

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

• Дефинират се от 4 основни обекта:Дефинират се от 4 основни обекта:• ConnectionConnection – за връзка с базата – за връзка с базата• CommandCommand – за изпълнение на SQL – за изпълнение на SQL• DataReaderDataReader – за извличане на данни – за извличане на данни• DataAdapterDataAdapter – за връзка с – за връзка с DataSetDataSet

Page 22: ADO.NET

Data Provider-Data Provider-и в и в ADO.NETADO.NETData Provider-Data Provider-и в и в ADO.NETADO.NET

• В ADO.NET има няколко стандартни Data В ADO.NET има няколко стандартни Data Provider-aProvider-a• SqlClientSqlClient – за връзка със SQL Server – за връзка със SQL Server• OleDBOleDB – за връзка със стандарта OleDB – за връзка със стандарта OleDB• OdbcOdbc – за връзка със стандарта ODBC – за връзка със стандарта ODBC• OracleOracle – за връзка с Oracle – за връзка с Oracle

• Трети доставчици предлагат Data Provider-и за Трети доставчици предлагат Data Provider-и за връзки с други RDBMS:връзки с други RDBMS:• IBM DB2IBM DB2

• MySQLMySQL

• PostgreSQLPostgreSQL

• Borland Interbase / FirebirdBorland Interbase / Firebird

• В ADO.NET има няколко стандартни Data В ADO.NET има няколко стандартни Data Provider-aProvider-a• SqlClientSqlClient – за връзка със SQL Server – за връзка със SQL Server• OleDBOleDB – за връзка със стандарта OleDB – за връзка със стандарта OleDB• OdbcOdbc – за връзка със стандарта ODBC – за връзка със стандарта ODBC• OracleOracle – за връзка с Oracle – за връзка с Oracle

• Трети доставчици предлагат Data Provider-и за Трети доставчици предлагат Data Provider-и за връзки с други RDBMS:връзки с други RDBMS:• IBM DB2IBM DB2

• MySQLMySQL

• PostgreSQLPostgreSQL

• Borland Interbase / FirebirdBorland Interbase / Firebird

Page 23: ADO.NET

Primary Provider Classes and Interfaces in ADO.NETPrimary Provider Classes and Interfaces in ADO.NET

Base Classes SqlClient Classes Generic Interface

DbConnection SqlConnection IDbConnection

DbCommand SqlCommand IDbCommand

DbDataReader SqlDataReader IDataReader / IDataRecord

DbTransaction SqlTransaction IDbTransaction

DbParameter SqlParameter IDbDataParameter

DbParameterCollection SqlParameterCollection IDataParameterCollection

DbDataAdapter SqlDataAdapter IDbDataAdapter

DbCommandBuilder SqlCommandBuilder  

DbConnectionStringBuilder SqlConnectionStringBuilder  

DBDataPermission SqlPermission  

Page 24: ADO.NET

ADO.NET в свързана средаADO.NET в свързана средаADO.NET в свързана средаADO.NET в свързана среда

• Данните са на сървъра до Данните са на сървъра до затваряне на връзкатазатваряне на връзката

1.1. Отваряне на връзка Отваряне на връзка ((SqlConnectionSqlConnection))

2.2. Изпълнение на команда Изпълнение на команда / / команди команди ((SqlCommandSqlCommand))

3.3. Обработка на редовете Обработка на редовете получени като резултат от получени като резултат от заявката чрез четец заявката чрез четец ((SqlDataReaderSqlDataReader))

4.4. Затваряне на четецаЗатваряне на четеца

5.5. Затваряне на връзкатаЗатваряне на връзката

• Данните са на сървъра до Данните са на сървъра до затваряне на връзкатазатваряне на връзката

1.1. Отваряне на връзка Отваряне на връзка ((SqlConnectionSqlConnection))

2.2. Изпълнение на команда Изпълнение на команда / / команди команди ((SqlCommandSqlCommand))

3.3. Обработка на редовете Обработка на редовете получени като резултат от получени като резултат от заявката чрез четец заявката чрез четец ((SqlDataReaderSqlDataReader))

4.4. Затваряне на четецаЗатваряне на четеца

5.5. Затваряне на връзкатаЗатваряне на връзката

SQL Server 7.0 /SQL Sever 2000

SqlConnectionSqlConnection

SqlCommandSqlCommand

SqlDataReaderSqlDataReader

Page 25: ADO.NET

ADO.NET в несвързана ADO.NET в несвързана средасредаADO.NET в несвързана ADO.NET в несвързана средасреда

• Данните се кешират в Данните се кешират в DataSetDataSet обект и връзката се обект и връзката се преустановявапреустановява1.1. Отваряне на връзка Отваряне на връзка

((SqlConnectionSqlConnection))

2.2. Пълнене на Пълнене на DataSetDataSet (чрез (чрез SqlDataAdapter)SqlDataAdapter)

3.3. Затваряне на връзкатаЗатваряне на връзката

4.4. Работа със Работа със DataSetDataSet-a-a

5.5. Отваряне на връзкаОтваряне на връзка

6.6. Нанасяне на промени по данните Нанасяне на промени по данните по сървърапо сървъра

7.7. Затваряне на връзкатаЗатваряне на връзката

• Данните се кешират в Данните се кешират в DataSetDataSet обект и връзката се обект и връзката се преустановявапреустановява1.1. Отваряне на връзка Отваряне на връзка

((SqlConnectionSqlConnection))

2.2. Пълнене на Пълнене на DataSetDataSet (чрез (чрез SqlDataAdapter)SqlDataAdapter)

3.3. Затваряне на връзкатаЗатваряне на връзката

4.4. Работа със Работа със DataSetDataSet-a-a

5.5. Отваряне на връзкаОтваряне на връзка

6.6. Нанасяне на промени по данните Нанасяне на промени по данните по сървърапо сървъра

7.7. Затваряне на връзкатаЗатваряне на връзката

SqlConnectionSqlConnection

SqlDataAdapterSqlDataAdapter

DataSetDataSet

SQL Server 7.0 /SQL Sever 2000

Page 26: ADO.NET

ADO.NETADO.NET, , XMLXML и и Web Web услугиуслугиADO.NETADO.NET, , XMLXML и и Web Web услугиуслуги

• ADO.NET ADO.NET е тясно интегрирано с е тясно интегрирано с XMLXML• Често се използваЧесто се използва в несвързан в несвързан

сценарий посредством сценарий посредством Web Web услугиуслуги• WebWeb-услугата реализира бизнес слоя -услугата реализира бизнес слоя

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

• ADO.NET ADO.NET е тясно интегрирано с е тясно интегрирано с XMLXML• Често се използваЧесто се използва в несвързан в несвързан

сценарий посредством сценарий посредством Web Web услугиуслуги• WebWeb-услугата реализира бизнес слоя -услугата реализира бизнес слоя

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

Web Web услугауслуга

Извикване на Web услугаИзвикване на Web услуга Изпълнение на SQL заявкаИзпълнение на SQL заявка

Резултат от SQL заявкаРезултат от SQL заявкаXMLXMLDataSetDataSet

Промяна на данниПромяна на данни

през XMLпрез XMLDataSetDataSet

Заявки за нанасянеЗаявки за нанасяне

на променитена променитеКлиентКлиентБаза от данниБаза от данни

DBDBDataSetDataSet

Page 27: ADO.NET

SqlClient Data ProviderSqlClient Data ProviderSqlClient Data ProviderSqlClient Data Provider

• SqlConnectionSqlConnection – осъществява връзката с MS SQL – осъществява връзката с MS SQL Server Server

• SqlCommandSqlCommand – изпълнява команди върху SQL – изпълнява команди върху SQL Server-а през вече установена връзкаServer-а през вече установена връзка

• SqlDataReaderSqlDataReader – служи за извличане на данни от – служи за извличане на данни от SQL Server-аSQL Server-а

• Данните са резултат от изпълнена командаДанните са резултат от изпълнена команда

• SqlDataAdapterSqlDataAdapter – обменя данни между – обменя данни между DataSetDataSet обекти и обекти и SQL ServerSQL Server• Осигурява зареждане на Осигурява зареждане на DataSetDataSet с данни и обновяване с данни и обновяване

на променени даннина променени данни

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

• SqlConnectionSqlConnection – осъществява връзката с MS SQL – осъществява връзката с MS SQL Server Server

• SqlCommandSqlCommand – изпълнява команди върху SQL – изпълнява команди върху SQL Server-а през вече установена връзкаServer-а през вече установена връзка

• SqlDataReaderSqlDataReader – служи за извличане на данни от – служи за извличане на данни от SQL Server-аSQL Server-а

• Данните са резултат от изпълнена командаДанните са резултат от изпълнена команда

• SqlDataAdapterSqlDataAdapter – обменя данни между – обменя данни между DataSetDataSet обекти и обекти и SQL ServerSQL Server• Осигурява зареждане на Осигурява зареждане на DataSetDataSet с данни и обновяване с данни и обновяване

на променени даннина променени данни

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

Page 28: ADO.NET

Система за сигурност в Система за сигурност в SQL Server 2005SQL Server 2005Система за сигурност в Система за сигурност в SQL Server 2005SQL Server 2005

• Видове автентикацияВидове автентикация• Windows Windows (чрез потребител в ОС)(чрез потребител в ОС)

• Сигурна валидация и криптиранеСигурна валидация и криптиране

• Одитиране на достъпОдитиране на достъп

• Политики за паролиПолитики за пароли

• Заключване на акаунтиЗаключване на акаунти

• Смесена (Смесена (Windows Windows и и SQLSQL Server)Server)• Основно за съвместимост с предишни Основно за съвместимост с предишни

версииверсии

• Видове автентикацияВидове автентикация• Windows Windows (чрез потребител в ОС)(чрез потребител в ОС)

• Сигурна валидация и криптиранеСигурна валидация и криптиране

• Одитиране на достъпОдитиране на достъп

• Политики за паролиПолитики за пароли

• Заключване на акаунтиЗаключване на акаунти

• Смесена (Смесена (Windows Windows и и SQLSQL Server)Server)• Основно за съвместимост с предишни Основно за съвместимост с предишни

версииверсии

Page 29: ADO.NET

Символен низ за връзка с база Символен низ за връзка с база от данни (от данни (ConnectionConnection String)String)Символен низ за връзка с база Символен низ за връзка с база от данни (от данни (ConnectionConnection String)String)

• Дефинира параметрите, необходими за осъществяване на Дефинира параметрите, необходими за осъществяване на връзка с базата даннивръзка с базата данни

• Основни параметриОсновни параметри• ProviderProvider – име на драйвера за достъп – име на драйвера за достъп

• ServerServer – идентификатор на сървъра – идентификатор на сървъра

• Database Database – идентификатор на базата– идентификатор на базата• User ID/PasswordUser ID/Password• Integrated SecurityIntegrated Security• Persist Security Info (False)Persist Security Info (False)

• MARS Connection MARS Connection (False)(False)

• Пример:Пример:

• Дефинира параметрите, необходими за осъществяване на Дефинира параметрите, необходими за осъществяване на връзка с базата даннивръзка с базата данни

• Основни параметриОсновни параметри• ProviderProvider – име на драйвера за достъп – име на драйвера за достъп

• ServerServer – идентификатор на сървъра – идентификатор на сървъра

• Database Database – идентификатор на базата– идентификатор на базата• User ID/PasswordUser ID/Password• Integrated SecurityIntegrated Security• Persist Security Info (False)Persist Security Info (False)

• MARS Connection MARS Connection (False)(False)

• Пример:Пример:

Provider=SQLNCLI; Server=(local); Provider=SQLNCLI; Server=(local); Database=AdventureWorks; Integrated Database=AdventureWorks; Integrated Security=SSPI; MARS Connection=True;Security=SSPI; MARS Connection=True;

Page 30: ADO.NET

Connection PoolingConnection PoolingConnection PoolingConnection Pooling

• "Database Connection Pooling" е програмна "Database Connection Pooling" е програмна техника, която:техника, която:• Осигурява по-ефективно използване на Осигурява по-ефективно използване на

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

• Пулингът работи така:Пулингът работи така:• При отваряне на връзка тя се взима При отваряне на връзка тя се взима

готова от т. нар. "пул" (connection pool)готова от т. нар. "пул" (connection pool)• Ако там няма свободна се отваря новаАко там няма свободна се отваря нова

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

• По подразбиране SqlClient ползва пулПо подразбиране SqlClient ползва пул

• "Database Connection Pooling" е програмна "Database Connection Pooling" е програмна техника, която:техника, която:• Осигурява по-ефективно използване на Осигурява по-ефективно използване на

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

• Пулингът работи така:Пулингът работи така:• При отваряне на връзка тя се взима При отваряне на връзка тя се взима

готова от т. нар. "пул" (connection pool)готова от т. нар. "пул" (connection pool)• Ако там няма свободна се отваря новаАко там няма свободна се отваря нова

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

• По подразбиране SqlClient ползва пулПо подразбиране SqlClient ползва пул

Page 31: ADO.NET

Още за работата със Още за работата със SqlConnectionSqlConnectionОще за работата със Още за работата със SqlConnectionSqlConnection

• Експлицитно отваряне и затваряне на Експлицитно отваряне и затваряне на връзката (работи с пула)връзката (работи с пула)• Open()Open() и и Close()Close() методите методите

• Имплицитно отваряне и затваряне на Имплицитно отваряне и затваряне на връзкатавръзката ( (работи с пула)работи с пула)• Възможно е само при работа с Възможно е само при работа с DataAdapterDataAdapter-и-и

• Използване на Използване на Dispose()Dispose() метода метода• Извиква се ако ползваме Извиква се ако ползваме using (con)using (con)

• Връща връзката в connection pool-аВръща връзката в connection pool-а

• Експлицитно отваряне и затваряне на Експлицитно отваряне и затваряне на връзката (работи с пула)връзката (работи с пула)• Open()Open() и и Close()Close() методите методите

• Имплицитно отваряне и затваряне на Имплицитно отваряне и затваряне на връзкатавръзката ( (работи с пула)работи с пула)• Възможно е само при работа с Възможно е само при работа с DataAdapterDataAdapter-и-и

• Използване на Използване на Dispose()Dispose() метода метода• Извиква се ако ползваме Извиква се ако ползваме using (con)using (con)

• Връща връзката в connection pool-аВръща връзката в connection pool-а

Page 32: ADO.NET

Събитията на Събитията на SqlConnectionSqlConnectionСъбитията на Събитията на SqlConnectionSqlConnection

• Събития възникващи от връзката:Събития възникващи от връзката:• StateChangeStateChange и и InfoMessageInfoMessage

• StateChangeEventArgsStateChangeEventArgs класът класът• Дава информация за това какво се е Дава информация за това какво се е

случило с връзката към базата даннислучило с връзката към базата данни• CurrentStateCurrentState и и OriginalStateOriginalState

• SqlInfoMessageEventArgsSqlInfoMessageEventArgs• ErrorsErrors – – SqlErrorCollectionSqlErrorCollection колекция от колекция от

съобщения за грешки и предупреждениясъобщения за грешки и предупреждения• MessageMessage – съобщението за грешка – съобщението за грешка• SourceSource – къде е възникнала – къде е възникнала

грешката/предупреждениетогрешката/предупреждението

• Събития възникващи от връзката:Събития възникващи от връзката:• StateChangeStateChange и и InfoMessageInfoMessage

• StateChangeEventArgsStateChangeEventArgs класът класът• Дава информация за това какво се е Дава информация за това какво се е

случило с връзката към базата даннислучило с връзката към базата данни• CurrentStateCurrentState и и OriginalStateOriginalState

• SqlInfoMessageEventArgsSqlInfoMessageEventArgs• ErrorsErrors – – SqlErrorCollectionSqlErrorCollection колекция от колекция от

съобщения за грешки и предупреждениясъобщения за грешки и предупреждения• MessageMessage – съобщението за грешка – съобщението за грешка• SourceSource – къде е възникнала – къде е възникнала

грешката/предупреждениетогрешката/предупреждението

Page 33: ADO.NET

StateChangeStateChange – пример – примерStateChangeStateChange – пример – пример

private const string CONNECTION_STRING = "Server=.;" + " private const string CONNECTION_STRING = "Server=.;" + " Database=Pubs; Integrated Security=true";Database=Pubs; Integrated Security=true";private SqlConnection mConn;private SqlConnection mConn;private void InitConnection()private void InitConnection(){{ mConn = new SqlConnection(CONNECTION_STRING);mConn = new SqlConnection(CONNECTION_STRING); mConn.StateChange += mConn.StateChange += new StateChangeEventHandler(ConnStateChange);new StateChangeEventHandler(ConnStateChange); mConn.Open();mConn.Open();}}private void ConnStateChange(object sender,private void ConnStateChange(object sender, StateChangeEventArgs e)StateChangeEventArgs e){{ Debug.WriteLine("SQL Server connection: " +Debug.WriteLine("SQL Server connection: " + e.OriginalState.ToString() + " --> " +e.OriginalState.ToString() + " --> " + e.CurrentState.ToString());e.CurrentState.ToString());}}

Page 34: ADO.NET

InfoMessageInfoMessage – пример – примерInfoMessageInfoMessage – пример – пример

private const string CONNECTION_STRING = "Server=.; " +private const string CONNECTION_STRING = "Server=.; " + "Database=Pubs; Integrated Security=true";"Database=Pubs; Integrated Security=true";private SqlConnection mConn;private SqlConnection mConn;private void InitConnection()private void InitConnection(){{ mConn = new SqlConnection(CONNECTION_STRING);mConn = new SqlConnection(CONNECTION_STRING); mConn.InfoMessage +=mConn.InfoMessage += new SqlInfoMessageEventHandler(ConnInfoMessage);new SqlInfoMessageEventHandler(ConnInfoMessage); mConn.Open();mConn.Open();}}private void ConnInfoMessage(object sender, private void ConnInfoMessage(object sender, SqlInfoMessageEventArgs e)SqlInfoMessageEventArgs e){{ Debug.WriteLine("SQL Server message: " + Debug.WriteLine("SQL Server message: " + e.Message + " Source: " + e.Source);e.Message + " Source: " + e.Source);}}

Page 35: ADO.NET

ДемонстрацияДемонстрацияДемонстрацияДемонстрация

• Проследяване на събитията Проследяване на събитията StateChangeStateChange и и InfoMessageInfoMessage

• Todo:Todo:Снимката да се смени!!!Снимката да се смени!!!

• Проследяване на събитията Проследяване на събитията StateChangeStateChange и и InfoMessageInfoMessage

• Todo:Todo:Снимката да се смени!!!Снимката да се смени!!!

Page 36: ADO.NET

Реализация на свързан Реализация на свързан моделмоделРеализация на свързан Реализация на свързан моделмодел

• Данните са на сървъра до Данните са на сървъра до затваряне на връзкатазатваряне на връзката

1.1.Отваряне на връзка Отваряне на връзка ((SqlConnectionSqlConnection))

2.2.Изпълнение на команда Изпълнение на команда / / команди команди ((SqlCommandSqlCommand))

3.3.Обработка на редовете Обработка на редовете получени като резултат от получени като резултат от заявката чрез четец заявката чрез четец ((SqlDataReaderSqlDataReader))

4.4.Затваряне на четецаЗатваряне на четеца

5.5.Затваряне на връзкатаЗатваряне на връзката

• Данните са на сървъра до Данните са на сървъра до затваряне на връзкатазатваряне на връзката

1.1.Отваряне на връзка Отваряне на връзка ((SqlConnectionSqlConnection))

2.2.Изпълнение на команда Изпълнение на команда / / команди команди ((SqlCommandSqlCommand))

3.3.Обработка на редовете Обработка на редовете получени като резултат от получени като резултат от заявката чрез четец заявката чрез четец ((SqlDataReaderSqlDataReader))

4.4.Затваряне на четецаЗатваряне на четеца

5.5.Затваряне на връзкатаЗатваряне на връзката

SQL Server 7.0 /SQL Sever 2000

SqlConnectionSqlConnection

SqlCommandSqlCommand

SqlDataReaderSqlDataReader

Page 37: ADO.NET

Класовете в свързана Класовете в свързана средасредаКласовете в свързана Класовете в свързана средасреда

SQL Server 7.0 /SQL Sever 2000

SqlConnectionSqlConnection

SqlDataReaderSqlDataReader XmlReaderXmlReader

SqlParameterSqlParameterSqlParameterSqlParameterSqlParameterSqlParameter

SqlCommandSqlCommand

Page 38: ADO.NET

Класът Класът SqlCommandSqlCommandКласът Класът SqlCommandSqlCommand

• Изпълнява обръщение към Изпълнява обръщение към SQL SQL заявка или заявка или съхранена процедурасъхранена процедура

• По-важни свойстваПо-важни свойства• ConnectionConnection – връща / задава – връща / задава SqlConnectionSqlConnection-а на -а на

командатакомандата• CommandTypeCommandType – тип команда – тип команда

• CommandType.StoredProcedureCommandType.StoredProcedure• CommandType.TableDirectCommandType.TableDirect• CommandType.TextCommandType.Text

• CommandTextCommandText – – SQL SQL заявка или име на съхранена заявка или име на съхранена процедурапроцедура

• ParametersParameters – параметри – параметри

• Изпълнява обръщение към Изпълнява обръщение към SQL SQL заявка или заявка или съхранена процедурасъхранена процедура

• По-важни свойстваПо-важни свойства• ConnectionConnection – връща / задава – връща / задава SqlConnectionSqlConnection-а на -а на

командатакомандата• CommandTypeCommandType – тип команда – тип команда

• CommandType.StoredProcedureCommandType.StoredProcedure• CommandType.TableDirectCommandType.TableDirect• CommandType.TextCommandType.Text

• CommandTextCommandText – – SQL SQL заявка или име на съхранена заявка или име на съхранена процедурапроцедура

• ParametersParameters – параметри – параметри

Page 39: ADO.NET

Класът Класът SqlCommandSqlCommandКласът Класът SqlCommandSqlCommand

• По-важни методиПо-важни методи• ExecuteScalar()ExecuteScalar()

• Връща единична стойност (първата колона от Връща единична стойност (първата колона от първия ред от резултата)първия ред от резултата)

• Върнатата стойност е Върнатата стойност е System.ObjectSystem.Object• ExecuteReader()ExecuteReader()

• Връща курсор (Връща курсор (SqlDataReader)SqlDataReader)• CommandBehaviorCommandBehavior задава настройки задава настройки

• ExecuteNonQuery()ExecuteNonQuery()• Връща броя на засегнатите записи (Връща броя на засегнатите записи (intint))

• ExecuteXmlReader()ExecuteXmlReader()• Връща Връща XmlReaderXmlReader по резултата по резултата• Поддържа се само в SqlClientПоддържа се само в SqlClient

• По-важни методиПо-важни методи• ExecuteScalar()ExecuteScalar()

• Връща единична стойност (първата колона от Връща единична стойност (първата колона от първия ред от резултата)първия ред от резултата)

• Върнатата стойност е Върнатата стойност е System.ObjectSystem.Object• ExecuteReader()ExecuteReader()

• Връща курсор (Връща курсор (SqlDataReader)SqlDataReader)• CommandBehaviorCommandBehavior задава настройки задава настройки

• ExecuteNonQuery()ExecuteNonQuery()• Връща броя на засегнатите записи (Връща броя на засегнатите записи (intint))

• ExecuteXmlReader()ExecuteXmlReader()• Връща Връща XmlReaderXmlReader по резултата по резултата• Поддържа се само в SqlClientПоддържа се само в SqlClient

Page 40: ADO.NET

Класът Класът SqlDataReaderSqlDataReaderКласът Класът SqlDataReaderSqlDataReader

• Извлича последователност от записи Извлича последователност от записи (курсор) – резултат от изпълнена (курсор) – резултат от изпълнена командакоманда• Достъпът е само за четене (Достъпът е само за четене (read-onlyread-only))• Достъпът е еднопосоченДостъпът е еднопосочен (forward-only) (forward-only)

• По-важни методи и свойства:По-важни методи и свойства:• Read()Read() – – придвижва курсора напред и придвижва курсора напред и

връща връща falsefalse ако няма следващ записако няма следващ запис• ItemItem ( (индексаториндексатор)) – извлича стойността – извлича стойността

на колона по име или индексна колона по име или индекс• Close()Close() – затваря курсора – трябва – затваря курсора – трябва

задължително да се вика!задължително да се вика!

• Извлича последователност от записи Извлича последователност от записи (курсор) – резултат от изпълнена (курсор) – резултат от изпълнена командакоманда• Достъпът е само за четене (Достъпът е само за четене (read-onlyread-only))• Достъпът е еднопосоченДостъпът е еднопосочен (forward-only) (forward-only)

• По-важни методи и свойства:По-важни методи и свойства:• Read()Read() – – придвижва курсора напред и придвижва курсора напред и

връща връща falsefalse ако няма следващ записако няма следващ запис• ItemItem ( (индексаториндексатор)) – извлича стойността – извлича стойността

на колона по име или индексна колона по име или индекс• Close()Close() – затваря курсора – трябва – затваря курсора – трябва

задължително да се вика!задължително да се вика!

Page 41: ADO.NET

Свързан моделСвързан модел – пример– примерСвързан моделСвързан модел – пример– пример

using System;using System;using System.Data;using System.Data;using System.Data.SqlClient;using System.Data.SqlClient;

class TestSqlCommandclass TestSqlCommand{{ private const string CONNECTION_STRING = "Server=.;" +private const string CONNECTION_STRING = "Server=.;" + " Database=pubs; Integrated Security=true";" Database=pubs; Integrated Security=true"; private const string COMMAND_SELECT_AUTHORS =private const string COMMAND_SELECT_AUTHORS = "SELECT au_fname, au_lname, phone FROM authors";"SELECT au_fname, au_lname, phone FROM authors";

static void Main()static void Main() {{ SqlConnection con = SqlConnection con = new SqlConnection(CONNECTION_STRING);new SqlConnection(CONNECTION_STRING); con.Open();con.Open(); trytry {{

(примерът продължава)(примерът продължава)

Page 42: ADO.NET

Свързан моделСвързан модел – пример– примерСвързан моделСвързан модел – пример– пример

SqlCommand command =SqlCommand command = new SqlCommand(COMMAND_SELECT_AUTHORS, con);new SqlCommand(COMMAND_SELECT_AUTHORS, con); SqlDataReader reader = command.ExecuteReader();SqlDataReader reader = command.ExecuteReader(); using (reader)using (reader) {{ while (reader.Read())while (reader.Read()) {{ string firstName = (String) reader["au_fname"];string firstName = (String) reader["au_fname"]; string lastName = (String) reader["au_lname"];string lastName = (String) reader["au_lname"]; string phone = (String) reader["phone"];string phone = (String) reader["phone"]; Console.WriteLine("{0} {1} - {2}", Console.WriteLine("{0} {1} - {2}", firstName, lastName, phone);firstName, lastName, phone); }} }} }} finallyfinally {{ con.Close();con.Close(); }} }}}}

Page 43: ADO.NET

ДемонстрацияДемонстрацияДемонстрацияДемонстрация

• Реализация на свързан модел – Реализация на свързан модел – SqlCommandSqlCommand и и SqlDataReaderSqlDataReader

• Реализация на свързан модел – Реализация на свързан модел – SqlCommandSqlCommand и и SqlDataReaderSqlDataReader

Page 44: ADO.NET

Създаване на Създаване на SqlCommandSqlCommandСъздаване на Създаване на SqlCommandSqlCommand

• Можете да създадете Можете да създадете SqlCommandSqlCommand обект по обект по няколко начинаняколко начина::

• ПрограмноПрограмно

• От Server ExplorerОт Server Explorer във във VS.NETVS.NET

• От Toolbox във VS.NETОт Toolbox във VS.NET

• Можете да създадете Можете да създадете SqlCommandSqlCommand обект по обект по няколко начинаняколко начина::

• ПрограмноПрограмно

• От Server ExplorerОт Server Explorer във във VS.NETVS.NET

• От Toolbox във VS.NETОт Toolbox във VS.NET

SqlCommand SqlCommand command command = new SqlCommand( = new SqlCommand( "SELECT * FROM Products"SELECT * FROM Products, , connectionconnection););

Page 45: ADO.NET

ДемонстрацияДемонстрацияДемонстрацияДемонстрация

• Създаване на Създаване на SqlCommandSqlCommand във във VS.NET VS.NET чрез чрез Server Explorer Server Explorer и чрез и чрез Data Data компонентите от компонентите от ToolboxToolbox-а-а

• Създаване на Създаване на SqlCommandSqlCommand във във VS.NET VS.NET чрез чрез Server Explorer Server Explorer и чрез и чрез Data Data компонентите от компонентите от ToolboxToolbox-а-а

Page 46: ADO.NET

Класът Класът SqlParameterSqlParameterКласът Класът SqlParameterSqlParameter

• Какво представляват SqlParamer-ите?Какво представляват SqlParamer-ите?

• SQL заявките и съхранени процедури могат SQL заявките и съхранени процедури могат да имат входящи и изходящи параметрида имат входящи и изходящи параметри

• Те се достъпват чрез Те се достъпват чрез ParametersParameters колекцията колекцията на на SqlCommandSqlCommand класа класа

• По-важни свойства:По-важни свойства:

• ParameterNameParameterName – име на параметъра – име на параметъра

• DbTypeDbType – тип ( – тип (NVarCharNVarChar, , TimestampTimestamp, …), …)

• SizeSize – размер на типа (ако има) – размер на типа (ако има)

• DirectionDirection – входен, изходен, ... – входен, изходен, ...

• Какво представляват SqlParamer-ите?Какво представляват SqlParamer-ите?

• SQL заявките и съхранени процедури могат SQL заявките и съхранени процедури могат да имат входящи и изходящи параметрида имат входящи и изходящи параметри

• Те се достъпват чрез Те се достъпват чрез ParametersParameters колекцията колекцията на на SqlCommandSqlCommand класа класа

• По-важни свойства:По-важни свойства:

• ParameterNameParameterName – име на параметъра – име на параметъра

• DbTypeDbType – тип ( – тип (NVarCharNVarChar, , TimestampTimestamp, …), …)

• SizeSize – размер на типа (ако има) – размер на типа (ако има)

• DirectionDirection – входен, изходен, ... – входен, изходен, ...

Page 47: ADO.NET

Параметрични заявки – Параметрични заявки – примерпримерПараметрични заявки – Параметрични заявки – примерпример

private void InsertShipper(string aName, string aPhone)private void InsertShipper(string aName, string aPhone){{ SqlCommand cmdInsertShipper = new SqlCommand(SqlCommand cmdInsertShipper = new SqlCommand( "INSERT INTO Shippers(CompanyName, Phone) " +"INSERT INTO Shippers(CompanyName, Phone) " + "VALUES (@Name, @Phone)", dbConnection);"VALUES (@Name, @Phone)", dbConnection); SqlParameter paramName = SqlParameter paramName = new SqlParameter("@Name", SqlDbType.NVarChar);new SqlParameter("@Name", SqlDbType.NVarChar); paramName.Value = aName;paramName.Value = aName; cmdInsertShipper.Parameters.Add(paramName);cmdInsertShipper.Parameters.Add(paramName); SqlParameter paramPhone = SqlParameter paramPhone = new SqlParameter("@Phone", SqlDbType.NVarChar);new SqlParameter("@Phone", SqlDbType.NVarChar); paramPhone.Value = aPhone;paramPhone.Value = aPhone; cmdInsertShipper.Parameters.Add(paramPhone);cmdInsertShipper.Parameters.Add(paramPhone); cmdInsertShipper.ExecuteNonQuery();cmdInsertShipper.ExecuteNonQuery();}}

Page 48: ADO.NET

Първичен ключ – Първичен ключ – извличанеизвличанеПървичен ключ – Първичен ключ – извличанеизвличане

• Извличането на автоматично-генериран Извличането на автоматично-генериран първичен ключ е специфично запървичен ключ е специфично за всеки всеки database database сървърсървър

• При При SQL Server SQL Server и и MS Access MS Access се използват се използват IdentityIdentity и и AutoNumberAutoNumber колониколони• Стойността им се излича със заявката:Стойността им се излича със заявката:

• Пример за извличане на автоматично-Пример за извличане на автоматично-генерирания първичен ключ от генерирания първичен ключ от ADO.NET:ADO.NET:

• Извличането на автоматично-генериран Извличането на автоматично-генериран първичен ключ е специфично запървичен ключ е специфично за всеки всеки database database сървърсървър

• При При SQL Server SQL Server и и MS Access MS Access се използват се използват IdentityIdentity и и AutoNumberAutoNumber колониколони• Стойността им се излича със заявката:Стойността им се излича със заявката:

• Пример за извличане на автоматично-Пример за извличане на автоматично-генерирания първичен ключ от генерирания първичен ключ от ADO.NET:ADO.NET:

SELECT @@IdentitySELECT @@Identity

SqlCommand SqlCommand sselectIdentityelectIdentityCommandCommand = = new SqlCommand("SELECT @@Identity", new SqlCommand("SELECT @@Identity", ddbCon);bCon);decimal insertedRecordId = decimal insertedRecordId = (decimal) (decimal) sselectIdentityelectIdentityCommandCommand.ExecuteScalar();.ExecuteScalar();

Page 49: ADO.NET

Демонстрация Демонстрация ##Демонстрация Демонстрация ##

• Работа с параметрични Работа с параметрични SQL SQL заявкизаявки

• Извличане на превозвач по номерИзвличане на превозвач по номер

• Добавяне на превозвач и извличане на Добавяне на превозвач и извличане на генерирания за него първичен ключгенерирания за него първичен ключ

• Работа с параметрични Работа с параметрични SQL SQL заявкизаявки

• Извличане на превозвач по номерИзвличане на превозвач по номер

• Добавяне на превозвач и извличане на Добавяне на превозвач и извличане на генерирания за него първичен ключгенерирания за него първичен ключ

Page 50: ADO.NET

Използване на транзакцииИзползване на транзакцииИзползване на транзакцииИзползване на транзакции

• Работа с транзакции в Работа с транзакции в SQL Server:SQL Server:• Работа с транзакции в Работа с транзакции в SQL Server:SQL Server:BEGIN TRANSACTIONBEGIN TRANSACTIONDECLARE DECLARE @orderDetailsError int,@orderDetailsError int, @productError int@productError int

DELETE FROM "Order Details" DELETE FROM "Order Details" WHERE ProductID=42WHERE ProductID=42

SELECT @orderDetailsError = @@ERRORSELECT @orderDetailsError = @@ERROR

DELETE FROM Products WHERE ProductID=42DELETE FROM Products WHERE ProductID=42

SELECT @productError = @@ERRORSELECT @productError = @@ERROR

IF @orderDetailsError = 0 AND @productError = 0IF @orderDetailsError = 0 AND @productError = 0 COMMIT TRANSCOMMIT TRANSELSE ELSE ROLLBACK TRANSROLLBACK TRANS

Page 51: ADO.NET

Използване на транзакцииИзползване на транзакцииИзползване на транзакцииИзползване на транзакции

• Работа с транзакции в ADO.NETРабота с транзакции в ADO.NET

• Започване на транзакция:Започване на транзакция:

• Въвличане на команда в дадена Въвличане на команда в дадена транзакциятранзакция::

• Потвърждаване / анулиране на Потвърждаване / анулиране на транзакциятранзакция::

• Работа с транзакции в ADO.NETРабота с транзакции в ADO.NET

• Започване на транзакция:Започване на транзакция:

• Въвличане на команда в дадена Въвличане на команда в дадена транзакциятранзакция::

• Потвърждаване / анулиране на Потвърждаване / анулиране на транзакциятранзакция::

SqlTransaction trans =SqlTransaction trans = dbConnection.BeginTransaction();dbConnection.BeginTransaction();

command.Transaction = trans;command.Transaction = trans;

trans.Commit();trans.Commit();

ttrans.Rollback();rans.Rollback();

Page 52: ADO.NET

Използване на транзакцииИзползване на транзакцииИзползване на транзакцииИзползване на транзакции

• Нивото на изолация се дефинира с Нивото на изолация се дефинира с енумерацията енумерацията IsolationLevelIsolationLevel

• Нива на изолация на Нива на изолация на SqlTransactionSqlTransaction• ReadUncommitedReadUncommited• ReadCommitedReadCommited• RepeatableReadRepeatableRead• SerializableSerializable

• Пример:Пример:

• Нивото на изолация се дефинира с Нивото на изолация се дефинира с енумерацията енумерацията IsolationLevelIsolationLevel

• Нива на изолация на Нива на изолация на SqlTransactionSqlTransaction• ReadUncommitedReadUncommited• ReadCommitedReadCommited• RepeatableReadRepeatableRead• SerializableSerializable

• Пример:Пример:

SqlTransaction trans = dbConnection.SqlTransaction trans = dbConnection. BeginTransaction(IsolationLevel.Serializable);BeginTransaction(IsolationLevel.Serializable);

Page 53: ADO.NET

Демонстрация Демонстрация ##Демонстрация Демонстрация ##

• Транзакции сТранзакции с ADO.NET ADO.NET• Транзакции сТранзакции с ADO.NET ADO.NET

Page 54: ADO.NET

Връзка с други бази от Връзка с други бази от данниданниВръзка с други бази от Връзка с други бази от данниданни

• ADO.NET поддържа връзка с различни бази от ADO.NET поддържа връзка с различни бази от данни данни ((освен освен SQL Server) SQL Server) чрез съответни Data чрез съответни Data Providers:Providers:• OLE DB – поддържа се стандартноOLE DB – поддържа се стандартно• Oracle – поддържа се стандартноOracle – поддържа се стандартно• MySQL – инсталира се допълнителноMySQL – инсталира се допълнително• PostgreSQL – инсталира се допълнителноPostgreSQL – инсталира се допълнително

• Реализирани са интерфейсите:Реализирани са интерфейсите:• IDbConnectionIDbConnection• IDbCommandIDbCommand, , IDataParameterIDataParameter• IDataReaderIDataReader• IDbDataAdapterIDbDataAdapter

• ADO.NET поддържа връзка с различни бази от ADO.NET поддържа връзка с различни бази от данни данни ((освен освен SQL Server) SQL Server) чрез съответни Data чрез съответни Data Providers:Providers:• OLE DB – поддържа се стандартноOLE DB – поддържа се стандартно• Oracle – поддържа се стандартноOracle – поддържа се стандартно• MySQL – инсталира се допълнителноMySQL – инсталира се допълнително• PostgreSQL – инсталира се допълнителноPostgreSQL – инсталира се допълнително

• Реализирани са интерфейсите:Реализирани са интерфейсите:• IDbConnectionIDbConnection• IDbCommandIDbCommand, , IDataParameterIDataParameter• IDataReaderIDataReader• IDbDataAdapterIDbDataAdapter

Page 55: ADO.NET

Връзка с други бази от Връзка с други бази от данниданниВръзка с други бази от Връзка с други бази от данниданни

Реализирани са базови класовеРеализирани са базови класове ::• DbConnection DbConnection • DbCommand DbCommand • DbDataReader DbDataReader • DbTransaction DbTransaction • DbParameter DbParameter • DbParameterCollection DbParameterCollection • DbDataAdapter DbDataAdapter • DbCommandBuilder DbCommandBuilder • DbConnectionStringBuilder DbConnectionStringBuilder • DBDataPermission DBDataPermission

Реализирани са базови класовеРеализирани са базови класове ::• DbConnection DbConnection • DbCommand DbCommand • DbDataReader DbDataReader • DbTransaction DbTransaction • DbParameter DbParameter • DbParameterCollection DbParameterCollection • DbDataAdapter DbDataAdapter • DbCommandBuilder DbCommandBuilder • DbConnectionStringBuilder DbConnectionStringBuilder • DBDataPermission DBDataPermission

Page 56: ADO.NET

OLE DBOLE DB Data Provider Data ProviderOLE DBOLE DB Data Provider Data Provider

• OleDbConnectionOleDbConnection – осъществява връзка с – осъществява връзка с OLE DB източник на данниOLE DB източник на данни

• OleDbCommandOleDbCommand – изпълнява SQL команди – изпълнява SQL команди върху OLE DB връзка към база даннивърху OLE DB връзка към база данни

• OleDbParameterOleDbParameter – параметър на команда – параметър на команда

• OleDbDataReaderOleDbDataReader – за извличане на данни – за извличане на данни от от команда, изпълнена през OLE DBкоманда, изпълнена през OLE DB

• OleDbDataAdapterOleDbDataAdapter – обменя данни между – обменя данни между DataSetDataSet обекти и OLE DB база данни обекти и OLE DB база данни

• OleDbConnectionOleDbConnection – осъществява връзка с – осъществява връзка с OLE DB източник на данниOLE DB източник на данни

• OleDbCommandOleDbCommand – изпълнява SQL команди – изпълнява SQL команди върху OLE DB връзка към база даннивърху OLE DB връзка към база данни

• OleDbParameterOleDbParameter – параметър на команда – параметър на команда

• OleDbDataReaderOleDbDataReader – за извличане на данни – за извличане на данни от от команда, изпълнена през OLE DBкоманда, изпълнена през OLE DB

• OleDbDataAdapterOleDbDataAdapter – обменя данни между – обменя данни между DataSetDataSet обекти и OLE DB база данни обекти и OLE DB база данни

OleDbConnection dbConn = new OleDbConnection(OleDbConnection dbConn = new OleDbConnection( @"Provider=Microsoft.Jet.OLEDB.4.0;Data@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyDB.mdb;Persist Security Info=False");Source=C:\MyDB.mdb;Persist Security Info=False");

Page 57: ADO.NET

Връзка с Връзка с OLE DB – OLE DB – примерпримерВръзка с Връзка с OLE DB – OLE DB – примерпример

• Имаме база данни Имаме база данни C:\LC:\Library.mdbibrary.mdb, , създадена с MS Accessсъздадена с MS Access

• В нея има таблица В нея има таблица UsersUsers::

• Използваме Използваме "Microsoft"Microsoft Jet 4.0 Provider Jet 4.0 Provider"" за за връзка от ADO.NET през OLE DBвръзка от ADO.NET през OLE DB

• Създаваме Connection String чрез Създаваме Connection String чрез OleDbConnectionOleDbConnection компонентата от компонентата от Toolbox-a на VS.NET:Toolbox-a на VS.NET:

• Имаме база данни Имаме база данни C:\LC:\Library.mdbibrary.mdb, , създадена с MS Accessсъздадена с MS Access

• В нея има таблица В нея има таблица UsersUsers::

• Използваме Използваме "Microsoft"Microsoft Jet 4.0 Provider Jet 4.0 Provider"" за за връзка от ADO.NET през OLE DBвръзка от ADO.NET през OLE DB

• Създаваме Connection String чрез Създаваме Connection String чрез OleDbConnectionOleDbConnection компонентата от компонентата от Toolbox-a на VS.NET:Toolbox-a на VS.NET:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Provider=Microsoft.Jet.OLEDB.4.0;Data Source= C:\LibraryC:\Library.mdb;Persist Security Info=False.mdb;Persist Security Info=False

Page 58: ADO.NET

Връзка с Връзка с OLE DB – OLE DB – примерпримерВръзка с Връзка с OLE DB – OLE DB – примерпример

OleDbConnection dbConn = new OleDbConnection(OleDbConnection dbConn = new OleDbConnection( @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source" +@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source" + @"=C:\Library.mdb;Persist Security Info=False");@"=C:\Library.mdb;Persist Security Info=False");

dbConn.Open();dbConn.Open();

OleDbCommand cmd = new OleDbCommand(OleDbCommand cmd = new OleDbCommand( "INSERT INTO Users ([username], [password]) " +"INSERT INTO Users ([username], [password]) " + "VALUES (@user, @pass)", dbConn);"VALUES (@user, @pass)", dbConn);

cmd.Parameters.Add("@user", cmd.Parameters.Add("@user", OleDbType.VarChar).Value = "new user name";OleDbType.VarChar).Value = "new user name";

cmd.Parameters.Add("@pass",cmd.Parameters.Add("@pass", OleDbType.VarChar).Value = "secret password";OleDbType.VarChar).Value = "secret password";

int affected = cmd.ExecuteNonQuery();int affected = cmd.ExecuteNonQuery();

Console.WriteLine("{0} records were inserted",Console.WriteLine("{0} records were inserted", affected);affected);

Page 59: ADO.NET

Демонстрация Демонстрация ##Демонстрация Демонстрация ##

• Връзка с Връзка с MS Access MS Access през през OLE DBOLE DB• Връзка с Връзка с MS Access MS Access през през OLE DBOLE DB

Page 60: ADO.NET

Правилна работа с дати - Правилна работа с дати - препоръкипрепоръкиПравилна работа с дати - Правилна работа с дати - препоръкипрепоръки

• Използвайте вградените типове на Използвайте вградените типове на базата данни, с която работите, а не базата данни, с която работите, а не стрингстринг

• Някои бази от данни поддържат Някои бази от данни поддържат повече от един тип за датиповече от един тип за дати

• В MS SQL Server 2000 има В MS SQL Server 2000 има datetimedatetime (8 (8 байта) и байта) и smalldatetimesmalldatetime (4 байта) (4 байта)

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

• Използвайте вградените типове на Използвайте вградените типове на базата данни, с която работите, а не базата данни, с която работите, а не стрингстринг

• Някои бази от данни поддържат Някои бази от данни поддържат повече от един тип за датиповече от един тип за дати

• В MS SQL Server 2000 има В MS SQL Server 2000 има datetimedatetime (8 (8 байта) и байта) и smalldatetimesmalldatetime (4 байта) (4 байта)

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

Page 61: ADO.NET

Правилна работа с дати - Правилна работа с дати - препоръкипрепоръкиПравилна работа с дати - Правилна работа с дати - препоръкипрепоръки

• Използвайте Използвайте System.DateTimeSystem.DateTime структурата за работа с дати в .NETструктурата за работа с дати в .NET

• Използвайте параметрични заявки за Използвайте параметрични заявки за предаване на дати към базата даннипредаване на дати към базата данни

• При нужда от конвертиране предавайте При нужда от конвертиране предавайте IFormatProviderIFormatProvider за дефиниране на за дефиниране на правилата за конвертиранеправилата за конвертиране

• При необходимост използвайте неутрални При необходимост използвайте неутрални културни настройки: културни настройки: CultureInfo.InvariantCultureCultureInfo.InvariantCulture

• Използвайте Използвайте System.DateTimeSystem.DateTime структурата за работа с дати в .NETструктурата за работа с дати в .NET

• Използвайте параметрични заявки за Използвайте параметрични заявки за предаване на дати към базата даннипредаване на дати към базата данни

• При нужда от конвертиране предавайте При нужда от конвертиране предавайте IFormatProviderIFormatProvider за дефиниране на за дефиниране на правилата за конвертиранеправилата за конвертиране

• При необходимост използвайте неутрални При необходимост използвайте неутрални културни настройки: културни настройки: CultureInfo.InvariantCultureCultureInfo.InvariantCulture

Page 62: ADO.NET

Работа с дати – примерРабота с дати – примерРабота с дати – примерРабота с дати – пример

CREATE TABLE MessagesCREATE TABLE Messages(( MsgId int identity not null primary key,MsgId int identity not null primary key, MsgText nvarchar(1000),MsgText nvarchar(1000), MsgDate datetime –- Don’t use varchar for dates!MsgDate datetime –- Don’t use varchar for dates!))public void AddMsg(string aText, DateTime aDate)public void AddMsg(string aText, DateTime aDate){{ SqlCommand cmdInsertMsg = new SqlCommand(SqlCommand cmdInsertMsg = new SqlCommand( "INSERT INTO Messages(MsgText, MsgDate) " +"INSERT INTO Messages(MsgText, MsgDate) " + "VALUES (@MsgText, @MsgDate)", mDbCon);"VALUES (@MsgText, @MsgDate)", mDbCon);

SqlParameter paramMsgDate = new SqlParameter(SqlParameter paramMsgDate = new SqlParameter( "@MsgDate", SqlDbType.DateTime);"@MsgDate", SqlDbType.DateTime); paramMsgDate.Value = aDate;paramMsgDate.Value = aDate; cmdInsertMsg.Parameters.Add(paramMsgDate);cmdInsertMsg.Parameters.Add(paramMsgDate);

cmdInsertMsg.ExecuteNonQuery();cmdInsertMsg.ExecuteNonQuery();}}

Page 63: ADO.NET

Демонстрация Демонстрация ##Демонстрация Демонстрация ##

• Работа с дати в Работа с дати в MS SQL ServerMS SQL Server• Работа с дати в Работа с дати в MS SQL ServerMS SQL Server

Page 64: ADO.NET

Работа с картинки в БДРабота с картинки в БДРабота с картинки в БДРабота с картинки в БД

• За записването на графични За записването на графични изображения в бази от данни се изображения в бази от данни се използват бинарни полетаизползват бинарни полета::

• типтип "image" "image" в в MS SQL ServerMS SQL Server

• тип "тип "blobblob"" в в OracleOracle

• тип "OLE Object" в тип "OLE Object" в MS AccessMS Access

• При обемни файлове трябва да се При обемни файлове трябва да се използва работа с потоциизползва работа с потоци

• За записването на графични За записването на графични изображения в бази от данни се изображения в бази от данни се използват бинарни полетаизползват бинарни полета::

• типтип "image" "image" в в MS SQL ServerMS SQL Server

• тип "тип "blobblob"" в в OracleOracle

• тип "OLE Object" в тип "OLE Object" в MS AccessMS Access

• При обемни файлове трябва да се При обемни файлове трябва да се използва работа с потоциизползва работа с потоци

Page 65: ADO.NET

Демонстрация Демонстрация ##Демонстрация Демонстрация ##

• Съхранение на графични изображения Съхранение на графични изображения в база от даннив база от данни

• Съхранение на графични изображения Съхранение на графични изображения в база от даннив база от данни

Page 66: ADO.NET

Multiple Active Result Sets Multiple Active Result Sets (MARS)(MARS)Multiple Active Result Sets Multiple Active Result Sets (MARS)(MARS)

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

• Поддържа се от Поддържа се от MS SQL Server 2005 + MS SQL Server 2005 + ADO.NET 2.0ADO.NET 2.0

• При по-стари версии на При по-стари версии на SQL Server SQL Server се се хвърля изключение при стартиране на хвърля изключение при стартиране на втори втори DataReaderDataReader към една връзка към една връзка

• С С MARS MARS това е допустима операциятова е допустима операция

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

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

• Поддържа се от Поддържа се от MS SQL Server 2005 + MS SQL Server 2005 + ADO.NET 2.0ADO.NET 2.0

• При по-стари версии на При по-стари версии на SQL Server SQL Server се се хвърля изключение при стартиране на хвърля изключение при стартиране на втори втори DataReaderDataReader към една връзка към една връзка

• С С MARS MARS това е допустима операциятова е допустима операция

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

Page 67: ADO.NET

СъвместимостСъвместимостСъвместимостСъвместимост

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

• Класовете от Класовете от OracleClientOracleClient поддържат поддържат подобна функционалностподобна функционалност

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

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

• Споделянето на Споделянето на OleDbConnectionOleDbConnection от от паралелни команди е силно паралелни команди е силно непрепоръчителнонепрепоръчително

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

• Класовете от Класовете от OracleClientOracleClient поддържат поддържат подобна функционалностподобна функционалност

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

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

• Споделянето на Споделянето на OleDbConnectionOleDbConnection от от паралелни команди е силно паралелни команди е силно непрепоръчителнонепрепоръчително

Page 68: ADO.NET

СъвместимостСъвместимостСъвместимостСъвместимост

• MARS MARS не се активира по подразбиране не се активира по подразбиране

• Това се изисква от съществуващите Това се изисква от съществуващите приложения, които биха могли да разчитат приложения, които биха могли да разчитат на изключението, което се хвърля при опит на изключението, което се хвърля при опит за паралелно изпълнение на командиза паралелно изпълнение на команди

• Необходимо е в Необходимо е в connection stringconnection string-а да се -а да се добави добави MultipleActiveResultSets=True MultipleActiveResultSets=True

• При паралелно изпълняване на команди се При паралелно изпълняване на команди се препоръчва проверка запрепоръчва проверка за версията на версията на SQL SQL ServerServer с с SqlConnectionSqlConnection..ServerVersionServerVersion, , основна версияосновна версия 9 отговаря на 9 отговаря на SQL Server SQL Server 20052005

• MARS MARS не се активира по подразбиране не се активира по подразбиране

• Това се изисква от съществуващите Това се изисква от съществуващите приложения, които биха могли да разчитат приложения, които биха могли да разчитат на изключението, което се хвърля при опит на изключението, което се хвърля при опит за паралелно изпълнение на командиза паралелно изпълнение на команди

• Необходимо е в Необходимо е в connection stringconnection string-а да се -а да се добави добави MultipleActiveResultSets=True MultipleActiveResultSets=True

• При паралелно изпълняване на команди се При паралелно изпълняване на команди се препоръчва проверка запрепоръчва проверка за версията на версията на SQL SQL ServerServer с с SqlConnectionSqlConnection..ServerVersionServerVersion, , основна версияосновна версия 9 отговаря на 9 отговаря на SQL Server SQL Server 20052005

Page 69: ADO.NET

ПроизводителностПроизводителностПроизводителностПроизводителност

• В редки случаиВ редки случаи MARS MARS може да облекчи може да облекчи натоварването на сървъра, тъй като се натоварването на сървъра, тъй като се използват по-малко връзкиизползват по-малко връзки

• MMрежовият слой се натоварват повечережовият слой се натоварват повече

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

• Session PoolingSession Pooling

• Част от загубата в производителността е Част от загубата в производителността е компенсирана от кеширането на компенсирана от кеширането на SqlCommand SqlCommand обектиобекти

• Съхраняват се 9 команди, при всяка Съхраняват се 9 команди, при всяка допълнителна се губи подобрението от допълнителна се губи подобрението от poolpool-а-а

• В редки случаиВ редки случаи MARS MARS може да облекчи може да облекчи натоварването на сървъра, тъй като се натоварването на сървъра, тъй като се използват по-малко връзкиизползват по-малко връзки

• MMрежовият слой се натоварват повечережовият слой се натоварват повече

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

• Session PoolingSession Pooling

• Част от загубата в производителността е Част от загубата в производителността е компенсирана от кеширането на компенсирана от кеширането на SqlCommand SqlCommand обектиобекти

• Съхраняват се 9 команди, при всяка Съхраняват се 9 команди, при всяка допълнителна се губи подобрението от допълнителна се губи подобрението от poolpool-а-а

Page 70: ADO.NET

Конкурентно изпълнениеКонкурентно изпълнениеКонкурентно изпълнениеКонкурентно изпълнение

• Операциите в отделните сесии в рамките на една Операциите в отделните сесии в рамките на една връзка се изпълняват синхронновръзка се изпълняват синхронно

• ТранзакцииТранзакции• Транзакция не може да бъде приключена, ако не са Транзакция не може да бъде приключена, ако не са

затворени всички затворени всички SqlDataReaderSqlDataReader обекти, дори да са обекти, дори да са изпълнени всички операции, които променят данниизпълнени всички операции, които променят данни

• В такава В такава TransactionTransaction..Commit Commit ще хвърли изключение със ще хвърли изключение със съобщение “съобщение “Transaction context in use by another Transaction context in use by another sessionsession””

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

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

• Операциите в отделните сесии в рамките на една Операциите в отделните сесии в рамките на една връзка се изпълняват синхронновръзка се изпълняват синхронно

• ТранзакцииТранзакции• Транзакция не може да бъде приключена, ако не са Транзакция не може да бъде приключена, ако не са

затворени всички затворени всички SqlDataReaderSqlDataReader обекти, дори да са обекти, дори да са изпълнени всички операции, които променят данниизпълнени всички операции, които променят данни

• В такава В такава TransactionTransaction..Commit Commit ще хвърли изключение със ще хвърли изключение със съобщение “съобщение “Transaction context in use by another Transaction context in use by another sessionsession””

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

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

Page 71: ADO.NET

ADO.NET в несвързана ADO.NET в несвързана средасредаADO.NET в несвързана ADO.NET в несвързана средасреда

• Данните се кешират в Данните се кешират в DataSetDataSet обект и връзката се обект и връзката се преустановявапреустановява1.1. Отваряне на връзка Отваряне на връзка

((SqlConnectionSqlConnection))

2.2. Пълнене на Пълнене на DataSetDataSet (чрез (чрез SqlDataAdapter)SqlDataAdapter)

3.3. Затваряне на връзкатаЗатваряне на връзката

4.4. Работа със Работа със DataSetDataSet-a-a

5.5. Отваряне на връзкаОтваряне на връзка

6.6. Нанасяне на промени по данните Нанасяне на промени по данните по сървърапо сървъра

7.7. Затваряне на връзкатаЗатваряне на връзката

• Данните се кешират в Данните се кешират в DataSetDataSet обект и връзката се обект и връзката се преустановявапреустановява1.1. Отваряне на връзка Отваряне на връзка

((SqlConnectionSqlConnection))

2.2. Пълнене на Пълнене на DataSetDataSet (чрез (чрез SqlDataAdapter)SqlDataAdapter)

3.3. Затваряне на връзкатаЗатваряне на връзката

4.4. Работа със Работа със DataSetDataSet-a-a

5.5. Отваряне на връзкаОтваряне на връзка

6.6. Нанасяне на промени по данните Нанасяне на промени по данните по сървърапо сървъра

7.7. Затваряне на връзкатаЗатваряне на връзката SQL Server 7.0 /SQL Sever 2000

SqlConnectionSqlConnection

SqlDataAdapterSqlDataAdapter

DataSetDataSet

Page 72: ADO.NET

Работа в несвързана средаРабота в несвързана средаРабота в несвързана средаРабота в несвързана среда

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

• Класове реализиращи достъпа до даннитеКласове реализиращи достъпа до данните• DataSetDataSet

• Контейнер клас – съдържа таблици, релации, Контейнер клас – съдържа таблици, релации, constraintsconstraints и други обекти и други обекти

• DataTableDataTable – съдържа таблица – съдържа таблица• XxxDataAdapterXxxDataAdapter – осъществява достъпа до – осъществява достъпа до

данните чрез данните чрез XxxCommandXxxCommand, , XxxConnectionXxxConnection класовекласове

• DataRelationDataRelation – връзка между таблици – връзка между таблици

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

• Класове реализиращи достъпа до даннитеКласове реализиращи достъпа до данните• DataSetDataSet

• Контейнер клас – съдържа таблици, релации, Контейнер клас – съдържа таблици, релации, constraintsconstraints и други обекти и други обекти

• DataTableDataTable – съдържа таблица – съдържа таблица• XxxDataAdapterXxxDataAdapter – осъществява достъпа до – осъществява достъпа до

данните чрез данните чрез XxxCommandXxxCommand, , XxxConnectionXxxConnection класовекласове

• DataRelationDataRelation – връзка между таблици – връзка между таблици

Page 73: ADO.NET

DataSetDataSet – обектен модел – обектен моделDataSetDataSet – обектен модел – обектен модел

• Колекции в Колекции в DataSetDataSet

• TablesTables – съдържа таблиците – съдържа таблиците

• RelationsRelations – съдържа релациите между – съдържа релациите между таблицитетаблиците

• Поддръжка на автоматично свързване (data Поддръжка на автоматично свързване (data binding)binding)

• Схема на Схема на DataSetDataSet

• Описва структурата на Описва структурата на DataSetDataSet-а-а

• Дефинира се или програмноДефинира се или програмно

• или чрез XSD схемаили чрез XSD схема

• Колекции в Колекции в DataSetDataSet

• TablesTables – съдържа таблиците – съдържа таблиците

• RelationsRelations – съдържа релациите между – съдържа релациите между таблицитетаблиците

• Поддръжка на автоматично свързване (data Поддръжка на автоматично свързване (data binding)binding)

• Схема на Схема на DataSetDataSet

• Описва структурата на Описва структурата на DataSetDataSet-а-а

• Дефинира се или програмноДефинира се или програмно

• или чрез XSD схемаили чрез XSD схема

Page 74: ADO.NET

Модел на данните Модел на данните DataSetDataSetМодел на данните Модел на данните DataSetDataSet

DataSetDataSet

DataTableDataTable11 ……22 ……33 ……44 ……

DataTableDataTable11 ……22 ……33 ……44 ……

DataTableDataTable11 ……22 ……33 ……44 ……

<?xml version="1.0" standalone="yes"?><?xml version="1.0" standalone="yes"?><xs:schema id="DataSetUsers" <xs:schema id="DataSetUsers" targetNamespace="http://www.tempuri.org/DataSetUsers.xsd" targetNamespace="http://www.tempuri.org/DataSetUsers.xsd" xmlns:mstns="http://www.tempuri.org/DataSet1.xsd" xmlns:mstns="http://www.tempuri.org/DataSet1.xsd" xmlns="http://www.tempuri.org/DataSet1.xsd" xmlns="http://www.tempuri.org/DataSet1.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" attributeFormDefault="qualified" elementFormDefault="qualified">elementFormDefault="qualified"> <xs:element name="DataSetUsers" msdata:IsDataSet="true" <xs:element name="DataSetUsers" msdata:IsDataSet="true" msdata:Locale="bg-BG">msdata:Locale="bg-BG"> <xs:complexType><xs:complexType> <xs:choice maxOccurs="unbounded"><xs:choice maxOccurs="unbounded"> <xs:element name="Users"><xs:element name="Users"> <xs:complexType><xs:complexType> <xs:sequence><xs:sequence> <xs:element name="username" <xs:element name="username" type="xs:string" minOccurs="0" />type="xs:string" minOccurs="0" /> <xs:element name="password" <xs:element name="password" type="xs:string" minOccurs="0" />type="xs:string" minOccurs="0" /> </xs:sequence></xs:sequence> </xs:complexType></xs:complexType> </xs:element></xs:element> </xs:choice></xs:choice> </xs:complexType></xs:complexType> </xs:element></xs:element></xs:schema></xs:schema> XML SchemaXML Schema

Page 75: ADO.NET

Силно-типизирани Силно-типизирани DataSetsDataSetsСилно-типизирани Силно-типизирани DataSetsDataSets

• В .NET Framework се поддържат силно-В .NET Framework се поддържат силно-типизирани DataSet-итипизирани DataSet-и

• Силно-типизираните Силно-типизираните DataSetDataSet-и са класове, -и са класове, наследници на наследници на DataSetDataSet

• Дефинират свойства за достъп до Дефинират свойства за достъп до таблиците, техните редове и колонитаблиците, техните редове и колони

• Достъп до нетипизиран Достъп до нетипизиран DataSetDataSet::

• Достъп до силно-типизиран Достъп до силно-типизиран DataSetDataSet::

• В .NET Framework се поддържат силно-В .NET Framework се поддържат силно-типизирани DataSet-итипизирани DataSet-и

• Силно-типизираните Силно-типизираните DataSetDataSet-и са класове, -и са класове, наследници на наследници на DataSetDataSet

• Дефинират свойства за достъп до Дефинират свойства за достъп до таблиците, техните редове и колонитаблиците, техните редове и колони

• Достъп до нетипизиран Достъп до нетипизиран DataSetDataSet::

• Достъп до силно-типизиран Достъп до силно-типизиран DataSetDataSet::

string username = string username = (string) (string) dsUsers.dsUsers. Tables["Users"].Rows[0]["username"];Tables["Users"].Rows[0]["username"];

string username = dsUsers.Users[0].string username = dsUsers.Users[0].usernameusername;;

Page 76: ADO.NET

Създаване на Създаване на DataSetDataSetСъздаване на Създаване на DataSetDataSet

• Създаване на силно-типизиран Създаване на силно-типизиран DataSetDataSet

• През XSD дизайнера на VS.NET 2003През XSD дизайнера на VS.NET 2003

• FileFile | | Add New ItemAdd New Item | | Data SetData Set

• При записване на XSD файла, се генерира При записване на XSD файла, се генерира съответният C# классъответният C# клас

• С инструмента С инструмента xsd.exexsd.exe по по XSD XSD схема:схема:

• Генерираният Генерираният MyDataSet.csMyDataSet.cs съдържа съдържа класове и свойства за таблиците, редовете и класове и свойства за таблиците, редовете и колоните на DataSet-аколоните на DataSet-а

• Създаване на силно-типизиран Създаване на силно-типизиран DataSetDataSet

• През XSD дизайнера на VS.NET 2003През XSD дизайнера на VS.NET 2003

• FileFile | | Add New ItemAdd New Item | | Data SetData Set

• При записване на XSD файла, се генерира При записване на XSD файла, се генерира съответният C# классъответният C# клас

• С инструмента С инструмента xsd.exexsd.exe по по XSD XSD схема:схема:

• Генерираният Генерираният MyDataSet.csMyDataSet.cs съдържа съдържа класове и свойства за таблиците, редовете и класове и свойства за таблиците, редовете и колоните на DataSet-аколоните на DataSet-а

xsd.exe MyDataSet.xsd /dataset/xsd.exe MyDataSet.xsd /dataset/

Page 77: ADO.NET

Демонстрация Демонстрация ##Демонстрация Демонстрация ##

• Създаване на силно-типизиран Създаване на силно-типизиран DataSetDataSet чрез VS.NET чрез VS.NET

• Създаване на силно-типизиран Създаване на силно-типизиран DataSetDataSet чрез VS.NET чрез VS.NET

Page 78: ADO.NET

Сериализация на Сериализация на DataSetDataSetСериализация на Сериализация на DataSetDataSet

• Използва се при предаване на Използва се при предаване на DataSetDataSet обект между слоевете на обект между слоевете на приложението (напр. чрез приложението (напр. чрез remoting remoting или подаване на уеб услуги)или подаване на уеб услуги)

• Видове сериализация Видове сериализация

• Сериализация в Сериализация в XML XML форматформат

• Бинарна сериализацияБинарна сериализация

• Използва се при предаване на Използва се при предаване на DataSetDataSet обект между слоевете на обект между слоевете на приложението (напр. чрез приложението (напр. чрез remoting remoting или подаване на уеб услуги)или подаване на уеб услуги)

• Видове сериализация Видове сериализация

• Сериализация в Сериализация в XML XML форматформат

• Бинарна сериализацияБинарна сериализация

Page 79: ADO.NET

XML XML сериализациясериализацияXML XML сериализациясериализация

• Чрез Чрез XmlWriterXmlWriter

• Чрез метода Чрез метода Serialize(…)Serialize(…)на класа на класа BinaryFormatterBinaryFormatter

• Зададава се стойност Зададава се стойност SerializationFormat.XmlSerializationFormat.Xml на на своството своството RemotingFormatRemotingFormat на класана класа DataSet DataSet ((това е поведението по това е поведението по подразбиране)подразбиране)

• Използва се при предаване към уеб Използва се при предаване към уеб услугиуслуги

• Чрез Чрез XmlWriterXmlWriter

• Чрез метода Чрез метода Serialize(…)Serialize(…)на класа на класа BinaryFormatterBinaryFormatter

• Зададава се стойност Зададава се стойност SerializationFormat.XmlSerializationFormat.Xml на на своството своството RemotingFormatRemotingFormat на класана класа DataSet DataSet ((това е поведението по това е поведението по подразбиране)подразбиране)

• Използва се при предаване към уеб Използва се при предаване към уеб услугиуслуги

Page 80: ADO.NET

Бинарна сериализацияБинарна сериализацияБинарна сериализацияБинарна сериализация

• Чрез метода Чрез метода Serialize(…) Serialize(…) на класана класа BinaryFormatterBinaryFormatter

• На свойството На свойството RemotingFormat RemotingFormat на класа на класа DataSetDataSet трябва да е зададена стойносттрябва да е зададена стойност SerializationFormat.BinarySerializationFormat.Binary

• Данните в Данните в DataSet DataSet обекта се обекта се сериализират в двоичен форматсериализират в двоичен формат

• По-малък обем в сравнение със По-малък обем в сравнение със сериализацията в сериализацията в XMLXML формат формат

• Използва се при предаване на данни чрез Използва се при предаване на данни чрез remotingremoting

• Чрез метода Чрез метода Serialize(…) Serialize(…) на класана класа BinaryFormatterBinaryFormatter

• На свойството На свойството RemotingFormat RemotingFormat на класа на класа DataSetDataSet трябва да е зададена стойносттрябва да е зададена стойност SerializationFormat.BinarySerializationFormat.Binary

• Данните в Данните в DataSet DataSet обекта се обекта се сериализират в двоичен форматсериализират в двоичен формат

• По-малък обем в сравнение със По-малък обем в сравнение със сериализацията в сериализацията в XMLXML формат формат

• Използва се при предаване на данни чрез Използва се при предаване на данни чрез remotingremoting

Page 81: ADO.NET

Сериализация – пример Сериализация – пример Сериализация – пример Сериализация – пример

DataSetDataSet a adventuredventureDataSetDataSet = new DataSet(); = new DataSet();

// Fill// Fill adventureDataSet adventureDataSet from the database from the database

PopulateDataSet(dsAdventure);PopulateDataSet(dsAdventure);

BinaryFormatter BinaryFormatter binaryFormatterbinaryFormatter = new BinaryFormatter(); = new BinaryFormatter();

FileStream FileStream fileStreamfileStream = new FileStream("..\\xml.txt", = new FileStream("..\\xml.txt",

FileMode.Create);FileMode.Create);

// Serialize // Serialize adventureDataSetadventureDataSet with the default with the default

behavior behavior // // of BinaryFormatterof BinaryFormatter

binaryFormatterbinaryFormatter.Serialize(.Serialize(fileStreamfileStream, , aadventuredventureDataSetDataSet););

fileStreamfileStream.Close();.Close();

(примерът продължава)(примерът продължава)

Page 82: ADO.NET

Сериализация – примерСериализация – примерСериализация – примерСериализация – пример

aadventuredventureDataSetDataSet.RemotingFormat = .RemotingFormat =

SerializationFormat.Binary;SerializationFormat.Binary;

fileStreamfileStream = new FileStream("..\\bin.txt", = new FileStream("..\\bin.txt",

FileMode.Create);FileMode.Create);

//Serialize dsAdventure in binary format//Serialize dsAdventure in binary format

bbinaryFormatterinaryFormatter.Serialize(.Serialize(fileStreamfileStream, ,

aadventuredventureDataSetDataSet););

ffileStreamileStream.Close();.Close();

Page 83: ADO.NET

Класът Класът DataTableDataTableКласът Класът DataTableDataTable

• Като таблиците в базите от данниКато таблиците в базите от данни• Съставна част на Съставна част на DataSetDataSet класа класа

• Кеширано копие на данните в паметтаКеширано копие на данните в паметта

• Основни методи и свойства:Основни методи и свойства:• Rows[index]Rows[index] – достъп до редовете по номер – достъп до редовете по номер• Columns[…]Columns[…] – достъп до колоните ( – достъп до колоните (DataColumnDataColumn) )

по име или индекспо име или индекс• NewRow()NewRow() – създава нов ред ( – създава нов ред (DataRowDataRow), но не го ), но не го

добавя в таблицатадобавя в таблицата• Rows.Add(DataRow)Rows.Add(DataRow) – добавя ред – добавя ред в таблицатав таблицата• Columns.Add(DataColumn)Columns.Add(DataColumn) – добавя колона – добавя колона• PrimaryKeyPrimaryKey – задава/извлича първичния ключ – задава/извлича първичния ключ

• Като таблиците в базите от данниКато таблиците в базите от данни• Съставна част на Съставна част на DataSetDataSet класа класа

• Кеширано копие на данните в паметтаКеширано копие на данните в паметта

• Основни методи и свойства:Основни методи и свойства:• Rows[index]Rows[index] – достъп до редовете по номер – достъп до редовете по номер• Columns[…]Columns[…] – достъп до колоните ( – достъп до колоните (DataColumnDataColumn) )

по име или индекспо име или индекс• NewRow()NewRow() – създава нов ред ( – създава нов ред (DataRowDataRow), но не го ), но не го

добавя в таблицатадобавя в таблицата• Rows.Add(DataRow)Rows.Add(DataRow) – добавя ред – добавя ред в таблицатав таблицата• Columns.Add(DataColumn)Columns.Add(DataColumn) – добавя колона – добавя колона• PrimaryKeyPrimaryKey – задава/извлича първичния ключ – задава/извлича първичния ключ

Page 84: ADO.NET

Връзка междуВръзка между DataTableDataTable и и DataReaderDataReaderВръзка междуВръзка между DataTableDataTable и и DataReaderDataReader

• Load(…)Load(…)- - зарежда таблицата със зарежда таблицата със съдържанието на съдържанието на DataReader DataReader обектобект

• Може да приеме Може да приеме LoadOptionLoadOption параметър, който указва как се параметър, който указва как се комбинират съществуващите и комбинират съществуващите и новозаредените редовеновозаредените редове

• CreateDataReaderCreateDataReader()() – – връща връща обект, обект, подобен на подобен на DataReader,DataReader, който който съдържа редовете на таблицата, но съдържа редовете на таблицата, но не е свързан с източникане е свързан с източника

• Load(…)Load(…)- - зарежда таблицата със зарежда таблицата със съдържанието на съдържанието на DataReader DataReader обектобект

• Може да приеме Може да приеме LoadOptionLoadOption параметър, който указва как се параметър, който указва как се комбинират съществуващите и комбинират съществуващите и новозаредените редовеновозаредените редове

• CreateDataReaderCreateDataReader()() – – връща връща обект, обект, подобен на подобен на DataReader,DataReader, който който съдържа редовете на таблицата, но съдържа редовете на таблицата, но не е свързан с източникане е свързан с източника

Page 85: ADO.NET

Връзка междуВръзка между DataTableDataTable и и DataReaderDataReader – пример – пример Връзка междуВръзка между DataTableDataTable и и DataReaderDataReader – пример – пример

// // Initialize connection and commandInitialize connection and command

// …// …

aadventureWorksdventureWorksConnectionConnection.Open();.Open();

aadventureWorksdventureWorksDataReaderDataReader = =

cmdSelect.ExecuteReader();cmdSelect.ExecuteReader();

DataTable cDataTable currencyurrencyDataTableDataTable = new = new

DataTable("Currency");DataTable("Currency");

// Load table from DataReader// Load table from DataReader

ccurrencyurrencyDataTableDataTable.Load(.Load(aadventureWorksdventureWorksDataReaderDataReader););

// Use data from table// Use data from table

// …// …

Page 86: ADO.NET

Запазване и зареждане на Запазване и зареждане на данните от данните от DataTableDataTable Запазване и зареждане на Запазване и зареждане на данните от данните от DataTableDataTable

• Зареждане чрез метода Зареждане чрез метода Fill(…) Fill(…) на класа на класа DataAdapter DataAdapter

• ReadXml(…) – ReadXml(…) – зарежда тазблицата от зарежда тазблицата от източник на източник на XML – XML – поток, низ, поток, низ, TextReader TextReader илиили XmlReaderXmlReader

• WriteXml(…) – WriteXml(…) – записва съдържанието на записва съдържанието на таблицата в поток, низ, таблицата в поток, низ, TextReader TextReader илиили XmlReaderXmlReader• Може да се задава допълнително дали да Може да се задава допълнително дали да

се записват наследниците на таблицатасе записват наследниците на таблицата

• Задаване на режима на запис – Задаване на режима на запис – DiffGram, DiffGram, IgnoreSchema, WriteSchemaIgnoreSchema, WriteSchema

• Зареждане чрез метода Зареждане чрез метода Fill(…) Fill(…) на класа на класа DataAdapter DataAdapter

• ReadXml(…) – ReadXml(…) – зарежда тазблицата от зарежда тазблицата от източник на източник на XML – XML – поток, низ, поток, низ, TextReader TextReader илиили XmlReaderXmlReader

• WriteXml(…) – WriteXml(…) – записва съдържанието на записва съдържанието на таблицата в поток, низ, таблицата в поток, низ, TextReader TextReader илиили XmlReaderXmlReader• Може да се задава допълнително дали да Може да се задава допълнително дали да

се записват наследниците на таблицатасе записват наследниците на таблицата

• Задаване на режима на запис – Задаване на режима на запис – DiffGram, DiffGram, IgnoreSchema, WriteSchemaIgnoreSchema, WriteSchema

Page 87: ADO.NET

Запазване и зареждане от Запазване и зареждане от DataTableDataTable – – пример пример Запазване и зареждане от Запазване и зареждане от DataTableDataTable – – пример пример

DataTable personDataTable = CreateDataTable();DataTable personDataTable = CreateDataTable();

PrintTableData(personDataTable, "OriginalTable");PrintTableData(personDataTable, "OriginalTable");

// A text writer to store the data from the table// A text writer to store the data from the table

TextWriter personsTextWriter = new StringWriter();TextWriter personsTextWriter = new StringWriter();

// Write data from the table to the writer// Write data from the table to the writer

personDataTable.WriteXml(personsTextWriter, personDataTable.WriteXml(personsTextWriter,

XmlWriteMode.WriteSchema);XmlWriteMode.WriteSchema);

string personsString = personsTextWriter.ToString();string personsString = personsTextWriter.ToString();

personsTextWriter.Close();personsTextWriter.Close();

(примерът продължава)(примерът продължава)

Page 88: ADO.NET

Запазване и зареждане от Запазване и зареждане от DataTableDataTable – – примерпримерЗапазване и зареждане от Запазване и зареждане от DataTableDataTable – – примерпример

Console.WriteLine("XML:\n" + personsString);Console.WriteLine("XML:\n" + personsString);

// A text reader to pass the xml to ReadXml(...)// A text reader to pass the xml to ReadXml(...)

TextReader personsTextReader = new TextReader personsTextReader = new

StringReader(personsString);StringReader(personsString);

DataTable newPersonsDataTable = new DataTable();DataTable newPersonsDataTable = new DataTable();

// Load data table with xml data// Load data table with xml data

newPersonsDataTable.ReadXml(personsTextReader);newPersonsDataTable.ReadXml(personsTextReader);

personsTextReader.Close();personsTextReader.Close();

PrintTableData(newPersonsDataTable, "New table");PrintTableData(newPersonsDataTable, "New table");

Page 89: ADO.NET

Модел на данните Модел на данните DataTableDataTableМодел на данните Модел на данните DataTableDataTable

DataTableDataTable11 …… …… …… ……

22 …… …… …… ……

33 …… …… …… ……

44 …… …… …… ……

DataColumnDataColumnDataColumnDataColumn

DataColumnDataColumn

DataDataRowRowDataDataRowRow

DataDataRowRow

Page 90: ADO.NET

Класове за работа с Класове за работа с DataTableDataTableКласове за работа с Класове за работа с DataTableDataTable

• Събития на класа DataTableСъбития на класа DataTable• RowChangingRowChanging – преди промяна на ред – преди промяна на ред• RowChangedRowChanged – след промяна на ред – след промяна на ред• RowDeletingRowDeleting – преди изтриване на ред – преди изтриване на ред• RowDeletedRowDeleted – след изтриване на ред – след изтриване на ред

• Класът Класът DataRowDataRow представя ред от таблица представя ред от таблица• this[]this[] – дава достъп до стойността в дадена – дава достъп до стойността в дадена

колона (по име или индекс)колона (по име или индекс)• DeleteDelete – маркира реда като изтрит – маркира реда като изтрит• SetAdded SetAdded и и SetModifiedSetModified – маркират реда като – маркират реда като

добавен и променен, съответнодобавен и променен, съответно

• Класът Класът DataColumnDataColumn представя колона представя колона• NameName – име на колоната – име на колоната• DataTypeDataType – тип на колоната ( – тип на колоната (intint, , stringstring, …), …)

• Събития на класа DataTableСъбития на класа DataTable• RowChangingRowChanging – преди промяна на ред – преди промяна на ред• RowChangedRowChanged – след промяна на ред – след промяна на ред• RowDeletingRowDeleting – преди изтриване на ред – преди изтриване на ред• RowDeletedRowDeleted – след изтриване на ред – след изтриване на ред

• Класът Класът DataRowDataRow представя ред от таблица представя ред от таблица• this[]this[] – дава достъп до стойността в дадена – дава достъп до стойността в дадена

колона (по име или индекс)колона (по име или индекс)• DeleteDelete – маркира реда като изтрит – маркира реда като изтрит• SetAdded SetAdded и и SetModifiedSetModified – маркират реда като – маркират реда като

добавен и променен, съответнодобавен и променен, съответно

• Класът Класът DataColumnDataColumn представя колона представя колона• NameName – име на колоната – име на колоната• DataTypeDataType – тип на колоната ( – тип на колоната (intint, , stringstring, …), …)

Page 91: ADO.NET

Работа с Работа с DataTableDataTable – – примерпримерРабота с Работа с DataTableDataTable – – примерпример

DataTable tbl = new DataTable("Authors");DataTable tbl = new DataTable("Authors");

tbl.Columns.Add("au_id", typeof(int));tbl.Columns.Add("au_id", typeof(int));tbl.Columns.Add("au_fname", typeof(string));tbl.Columns.Add("au_fname", typeof(string));tbl.Columns.Add("au_lname", typeof(string));tbl.Columns.Add("au_lname", typeof(string));tbl.Columns.Add("au_phone",typeof(string));tbl.Columns.Add("au_phone",typeof(string));

// The row is detached (not added to the table)// The row is detached (not added to the table)DataRow row = tbl.NewRow();DataRow row = tbl.NewRow();

row[0] = 1;row[0] = 1;row[1] = "Branimir";row[1] = "Branimir";row[2] = "Giurov";row[2] = "Giurov";row["phone"] = "+359 2 XXX XXXX";row["phone"] = "+359 2 XXX XXXX";

tbl.Rows.Add(row);tbl.Rows.Add(row);

Page 92: ADO.NET

Демонстрация Демонстрация ##2121Демонстрация Демонстрация ##2121

• Работа сРабота с класа класа DataTableDataTable• Работа сРабота с класа класа DataTableDataTable

Page 93: ADO.NET

Използване на Използване на ограничения (ограничения (constraints)constraints)Използване на Използване на ограничения (ограничения (constraints)constraints)

• Дефиниране на първичен ключ Дефиниране на първичен ключ (Primary key)(Primary key)

• Дефиниране на първичен ключ Дефиниране на първичен ключ (Primary key)(Primary key)

// Single column PK// Single column PKdtCustomers.PrimaryKey = dtCustomers.PrimaryKey = nnew DataColumn()ew DataColumn(){{ dtCustomers.Columns("CustomerID")dtCustomers.Columns("CustomerID")}}

// Multiple columns PK// Multiple columns PKdtEmployees.PrimaryKey = dtEmployees.PrimaryKey = nnew DataColumn()ew DataColumn(){{ dtEmployees.Columns("LastName"), dtEmployees.Columns("LastName"), dtEmployees.Columns("FirstName")dtEmployees.Columns("FirstName")}}

Page 94: ADO.NET

Използване на Използване на ограничения (ограничения (constraints)constraints)Използване на Използване на ограничения (ограничения (constraints)constraints)

• Дефиниране на Дефиниране на UniqueConstraintUniqueConstraint и и ForeignKeyConstraintForeignKeyConstraint

• Дефиниране на Дефиниране на UniqueConstraintUniqueConstraint и и ForeignKeyConstraintForeignKeyConstraint

ds.Tables["Product"].Constraints.Add(ds.Tables["Product"].Constraints.Add( new UniqueConstraint("UC_ProductName",new UniqueConstraint("UC_ProductName", ds.Tables["Product"].Columns["ProductName"]));ds.Tables["Product"].Columns["ProductName"]));

ForeignKeyConstraint custOrderFK = ForeignKeyConstraint custOrderFK = new ForeignKeyConstraint("CustOrderFK",new ForeignKeyConstraint("CustOrderFK", ds.Tables["CustTable"].Columns["CustomerID"], ds.Tables["CustTable"].Columns["CustomerID"], ds.Tables["OrdersTable"].Columns["CustomerID"]);ds.Tables["OrdersTable"].Columns["CustomerID"]);

custOrderFK.DeleteRule = Rule.None; custOrderFK.DeleteRule = Rule.None; // Cannot delete a customer value // Cannot delete a customer value // that has associated existing orders.// that has associated existing orders.

ds.Tables["OrdersTable"].Constraints.Add(custOrderFK);ds.Tables["OrdersTable"].Constraints.Add(custOrderFK);

Page 95: ADO.NET

Потребителски изразиПотребителски изразиПотребителски изразиПотребителски изрази

• Изразите са формули, дефинирани от Изразите са формули, дефинирани от програмистапрограмиста

• Дефинират се с Дефинират се с ExpressionExpression свойството на свойството на DataColumnDataColumn класа класа

• Sum([Unit Price] * [Quantity])Sum([Unit Price] * [Quantity])

• Агрегатните функции могат да Агрегатните функции могат да използват родител/наследник използват родител/наследник релациитерелациите

• AvgAvg, , CountCount, , SumSum, , MaxMax, , MinMin

• Изразите са формули, дефинирани от Изразите са формули, дефинирани от програмистапрограмиста

• Дефинират се с Дефинират се с ExpressionExpression свойството на свойството на DataColumnDataColumn класа класа

• Sum([Unit Price] * [Quantity])Sum([Unit Price] * [Quantity])

• Агрегатните функции могат да Агрегатните функции могат да използват родител/наследник използват родител/наследник релациитерелациите

• AvgAvg, , CountCount, , SumSum, , MaxMax, , MinMin

Page 96: ADO.NET

Потребителски изразиПотребителски изразиПотребителски изразиПотребителски изрази

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

наследникнаследник• Пример:Пример:

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

наследникнаследник• Пример:Пример:

// Calculated field// Calculated field – VAT– VATDataColumn priceVat = new DataColumn(DataColumn priceVat = new DataColumn( "Price(VAT)"Price(VAT)"", typeof(decimal));, typeof(decimal));

priceVat.Expression = priceVat.Expression = ""Price * 1.2Price * 1.2"";;

productsTproductsTableable.Columns.Add(priceVat);.Columns.Add(priceVat);

Page 97: ADO.NET

DataRelationDataRelation обектиобектиDataRelationDataRelation обектиобекти

• Дефинират релации между родител / Дефинират релации между родител / наследник колони в таблици с наследник колони в таблици с навигационна целнавигационна цел

• Не създават ограничения (constraints)Не създават ограничения (constraints)

• Могат да се дефинират и към същата Могат да се дефинират и към същата таблицатаблица

• Често се използват за навигация през Често се използват за навигация през потребителския интерфейс потребителския интерфейс

• Използват се от колоните с потребителски Използват се от колоните с потребителски изрази за дефиниране на агрегатни изразиизрази за дефиниране на агрегатни изрази

• Дефинират релации между родител / Дефинират релации между родител / наследник колони в таблици с наследник колони в таблици с навигационна целнавигационна цел

• Не създават ограничения (constraints)Не създават ограничения (constraints)

• Могат да се дефинират и към същата Могат да се дефинират и към същата таблицатаблица

• Често се използват за навигация през Често се използват за навигация през потребителския интерфейс потребителския интерфейс

• Използват се от колоните с потребителски Използват се от колоните с потребителски изрази за дефиниране на агрегатни изразиизрази за дефиниране на агрегатни изрази

Page 98: ADO.NET

DataRelationDataRelation обектиобекти(2)(2)DataRelationDataRelation обектиобекти(2)(2)

• Съдържат се вСъдържат се в::

• RelationsRelations колекцията на колекцията на DataSetDataSet обекта обекта

• ChildRelationsChildRelations колекцията на колекцията на DataTableDataTable

• ParentRelations ParentRelations колекцията на колекцията на DataTableDataTable

• Създаване на нова релацияСъздаване на нова релация

• Съдържат се вСъдържат се в::

• RelationsRelations колекцията на колекцията на DataSetDataSet обекта обекта

• ChildRelationsChildRelations колекцията на колекцията на DataTableDataTable

• ParentRelations ParentRelations колекцията на колекцията на DataTableDataTable

• Създаване на нова релацияСъздаване на нова релация

dsNorthwind.Relations.Add("FK_CustomersOrders",dsNorthwind.Relations.Add("FK_CustomersOrders", dtCustomers.Columns["CustomerID"],dtCustomers.Columns["CustomerID"], dtOrders.Columns["CustomerID"], true);dtOrders.Columns["CustomerID"], true);

Page 99: ADO.NET

DataRelationDataRelation обектиобекти(3)(3)DataRelationDataRelation обектиобекти(3)(3)

• GetChildRows()GetChildRows() – връща редовете наследници на – връща редовете наследници на даден реддаден ред по име на релацияпо име на релация ( (метод на метод на DataRowDataRow))

• GetChildRows()GetChildRows() – връща редовете наследници на – връща редовете наследници на даден реддаден ред по име на релацияпо име на релация ( (метод на метод на DataRowDataRow))

dsNorthwind.Relations.Add("FK_CustomersOrders",dsNorthwind.Relations.Add("FK_CustomersOrders", dtCustomers.Columns["CustomerID"],dtCustomers.Columns["CustomerID"], dtOrders.Columns["CustomerID"], true);dtOrders.Columns["CustomerID"], true);

//// Process all customers and their orders Process all customers and their ordersforeach (DataRow drCustomer in foreach (DataRow drCustomer in dsNorthwind.Tables[dsNorthwind.Tables[""CustomersCustomers""].Rows)].Rows){{ foreach (DataRow drOrder in drCustomer.foreach (DataRow drOrder in drCustomer. GetChildRows(GetChildRows(""FK_CustomerOrdersFK_CustomerOrders"")))) {{ // Do some work with the rows// Do some work with the rows }}}}

Page 100: ADO.NET

DataViewDataView клас класDataViewDataView клас клас

• Аналогия на изгледите (Аналогия на изгледите (ViewView обектите) обектите) в базите от даннив базите от данни

• Динамичен изглед на данните базиран Динамичен изглед на данните базиран на израз за филтриранена израз за филтриране

• Филтриране по версията на даннитеФилтриране по версията на данните DataViewRowStateDataViewRowState ((AddedAdded , Changed, , Changed, Unchanged, Unchanged, OriginalRowsOriginalRows… )… )

• Сортиране по колона или колониСортиране по колона или колони

• Всеки Всеки DataTableDataTable обект има обект има DataView DataView ((DefaultViewDefaultView))

• Аналогия на изгледите (Аналогия на изгледите (ViewView обектите) обектите) в базите от даннив базите от данни

• Динамичен изглед на данните базиран Динамичен изглед на данните базиран на израз за филтриранена израз за филтриране

• Филтриране по версията на даннитеФилтриране по версията на данните DataViewRowStateDataViewRowState ((AddedAdded , Changed, , Changed, Unchanged, Unchanged, OriginalRowsOriginalRows… )… )

• Сортиране по колона или колониСортиране по колона или колони

• Всеки Всеки DataTableDataTable обект има обект има DataView DataView ((DefaultViewDefaultView))

Page 101: ADO.NET

DataViewDataView клас клас (2) (2)DataViewDataView клас клас (2) (2)

• Някои свойства на Някои свойства на DataViewDataView

• AllowNew, AllowEdit, AllowDelete AllowNew, AllowEdit, AllowDelete

• RowFilterRowFilter – филтър на данните– филтър на данните

• RowStateFilterRowStateFilter – – филтър по филтър по версията на даннитеверсията на данните

• Count Count – – брой на записитеброй на записите

• SortSort – указва сортирането – указва сортирането

• TableTable – връща/задава таблица – връща/задава таблица

• Някои свойства на Някои свойства на DataViewDataView

• AllowNew, AllowEdit, AllowDelete AllowNew, AllowEdit, AllowDelete

• RowFilterRowFilter – филтър на данните– филтър на данните

• RowStateFilterRowStateFilter – – филтър по филтър по версията на даннитеверсията на данните

• Count Count – – брой на записитеброй на записите

• SortSort – указва сортирането – указва сортирането

• TableTable – връща/задава таблица – връща/задава таблица

Page 102: ADO.NET

DataViewDataView клас клас(3)(3)DataViewDataView клас клас(3)(3)

• Пример:Пример:

• Създаване на нов обектСъздаване на нов обект

• Филтриране по версия на даннитеФилтриране по версия на данните

• Пример:Пример:

• Създаване на нов обектСъздаване на нов обект

• Филтриране по версия на даннитеФилтриране по версия на данните

DataTable usersTable = ...;DataTable usersTable = ...;

DataView usersView = new DataView(usersTable);DataView usersView = new DataView(usersTable);

// Show only modified versions of current rows and new rows// Show only modified versions of current rows and new rowsusersView.RowStateFilter = usersView.RowStateFilter = DataViewRowState.ModifiedCurrent |DataViewRowState.ModifiedCurrent | DataViewRowState.Added;DataViewRowState.Added;

Page 103: ADO.NET

Запазване и зареждане на Запазване и зареждане на данните от данните от DataSetDataSetЗапазване и зареждане на Запазване и зареждане на данните от данните от DataSetDataSet

• Два основни методаДва основни метода• ReadXml(ReadXml(……)) – зарежда – зарежда DataSetDataSet от XML от XML• WriteXml(WriteXml(……)) – записва – записва DataSetDataSet в XML в XML

• Пътят до файла се подава като параметърПътят до файла се подава като параметър

• ReadXml(ReadXml(……)) хвърля изключение ако хвърля изключение ако файлът не съществува или потребителят файлът не съществува или потребителят няма права няма права

• WriteXml(WriteXml(……)) припокрива съществуващи припокрива съществуващи файловефайлове

• Два основни методаДва основни метода• ReadXml(ReadXml(……)) – зарежда – зарежда DataSetDataSet от XML от XML• WriteXml(WriteXml(……)) – записва – записва DataSetDataSet в XML в XML

• Пътят до файла се подава като параметърПътят до файла се подава като параметър

• ReadXml(ReadXml(……)) хвърля изключение ако хвърля изключение ако файлът не съществува или потребителят файлът не съществува или потребителят няма права няма права

• WriteXml(WriteXml(……)) припокрива съществуващи припокрива съществуващи файловефайлове

Page 104: ADO.NET

DataSet.ReadXml()DataSet.ReadXml()DataSet.ReadXml()DataSet.ReadXml()

• Приема източник на XML данните:Приема източник на XML данните:• StreamStream, , TextReaderTextReader – отворен за четене – отворен за четене

потокпоток• StringString – път до файл или URL – път до файл или URL• XmlReaderXmlReader – XML четец – XML четец

• Може да се задава режим на четене Може да се задава режим на четене ((XmlReadModeXmlReadMode))• AutoAuto, , DiffGramDiffGram, , FragmentFragment, , IgnoreSchemaIgnoreSchema, ,

InferSchemaInferSchema, , ReadSchemaReadSchema

• Текущата схема на данните може да се Текущата схема на данните може да се запазва, да се прочете наново или да се запазва, да се прочете наново или да се генерира от самите даннигенерира от самите данни

• Приема източник на XML данните:Приема източник на XML данните:• StreamStream, , TextReaderTextReader – отворен за четене – отворен за четене

потокпоток• StringString – път до файл или URL – път до файл или URL• XmlReaderXmlReader – XML четец – XML четец

• Може да се задава режим на четене Може да се задава режим на четене ((XmlReadModeXmlReadMode))• AutoAuto, , DiffGramDiffGram, , FragmentFragment, , IgnoreSchemaIgnoreSchema, ,

InferSchemaInferSchema, , ReadSchemaReadSchema

• Текущата схема на данните може да се Текущата схема на данните може да се запазва, да се прочете наново или да се запазва, да се прочете наново или да се генерира от самите даннигенерира от самите данни

Page 105: ADO.NET

DataSet.WriteXml()DataSet.WriteXml()DataSet.WriteXml()DataSet.WriteXml()

• Възможност за записване на данните и Възможност за записване на данните и схемата на схемата на DataSetDataSet в XMLв XML форматформат

• Синхронизация със Синхронизация със XmlDataDocumentXmlDataDocument класакласа

• Може да се задава режим на записване Може да се задава режим на записване ((XmlWriteModeXmlWriteMode))

• DiffGramDiffGram – записва оригиналните данни – записва оригиналните данни и нанесените в тях промении нанесените в тях промени

• IgnoreSchemaIgnoreSchema – не записва схемата – не записва схемата

• WriteSchemaWriteSchema – записва и схемата – записва и схемата

• Възможност за записване на данните и Възможност за записване на данните и схемата на схемата на DataSetDataSet в XMLв XML форматформат

• Синхронизация със Синхронизация със XmlDataDocumentXmlDataDocument класакласа

• Може да се задава режим на записване Може да се задава режим на записване ((XmlWriteModeXmlWriteMode))

• DiffGramDiffGram – записва оригиналните данни – записва оригиналните данни и нанесените в тях промении нанесените в тях промени

• IgnoreSchemaIgnoreSchema – не записва схемата – не записва схемата

• WriteSchemaWriteSchema – записва и схемата – записва и схемата

Page 106: ADO.NET

ReadXmlReadXml и и WriteXmlWriteXml – – примерпримерReadXmlReadXml и и WriteXmlWriteXml – – примерпример

DataSet dsStudents = new DataSet();DataSet dsStudents = new DataSet();// A string that contains the XML data// A string that contains the XML data

string xmlStudentData = string xmlStudentData = "<students><student>" +"<students><student>" +

"<name>Petar Petrov</name><fn>12345</fn>" + "<name>Petar Petrov</name><fn>12345</fn>" +

"</student><student>" +"</student><student>" +

"<name>Ivan Ivanov</name><fn>54321</fn>" +"<name>Ivan Ivanov</name><fn>54321</fn>" +

"</student></students>";"</student></students>";

// // A StringReader to pass the XML to ReadXml(...)A StringReader to pass the XML to ReadXml(...)

StringReader srXmlStudents = newStringReader srXmlStudents = new

StringReader(xmlStudentData);StringReader(xmlStudentData);

dsStudents.ReadXml(srXmlStudents,dsStudents.ReadXml(srXmlStudents,

XmlReadMode.InferSchema);XmlReadMode.InferSchema);

srXmlStudents.Close();srXmlStudents.Close();

((примерът продължавапримерът продължава))

Page 107: ADO.NET

ReadXmlReadXml и и WriteXmlWriteXml – – примерпримерReadXmlReadXml и и WriteXmlWriteXml – – примерпример

// A StringWriter to store the data from the DataSet// A StringWriter to store the data from the DataSet

StringWriter swStudents = new StringWriter();StringWriter swStudents = new StringWriter();

dsStudents.WriteXml(swStudents, dsStudents.WriteXml(swStudents, XmlWriteMode.WriteSchema);XmlWriteMode.WriteSchema);

string strStudents = swStudents.ToString();string strStudents = swStudents.ToString();

swStudents.Close();swStudents.Close();

// Print to the console the XML before reading it// Print to the console the XML before reading it

// in the DataSet, and the XML produced by the // in the DataSet, and the XML produced by the

// DataSet's WriteXml(...) method// DataSet's WriteXml(...) method

Console.WriteLine("XML before:\n" +Console.WriteLine("XML before:\n" +

xmlStudentData + "\n\n\nXML after:\n " +xmlStudentData + "\n\n\nXML after:\n " +

strStudents);strStudents);

Page 108: ADO.NET

Демонстрация Демонстрация ##2222Демонстрация Демонстрация ##2222

• Четене и писане на Четене и писане на DataSetDataSet от XML файл от XML файл• Четене и писане на Четене и писане на DataSetDataSet от XML файл от XML файл

Page 109: ADO.NET

Зареждане наЗареждане на DataSetDataSet отот DataReaderDataReaderЗареждане наЗареждане на DataSetDataSet отот DataReaderDataReader

• Метод Метод LoadLoad(…) (…) с параметри:с параметри:

• DataReader DataReader обект, чието съдържание обект, чието съдържание на се зарежда в на се зарежда в DataSetDataSet обекта обекта

• LoadOptionLoadOption, който указва как да се , който указва как да се комбинират заредените редове с вече комбинират заредените редове с вече съществуващитесъществуващите

• Масив от таблици или имена на Масив от таблици или имена на таблицитаблици

• Метод Метод LoadLoad(…) (…) с параметри:с параметри:

• DataReader DataReader обект, чието съдържание обект, чието съдържание на се зарежда в на се зарежда в DataSetDataSet обекта обекта

• LoadOptionLoadOption, който указва как да се , който указва как да се комбинират заредените редове с вече комбинират заредените редове с вече съществуващитесъществуващите

• Масив от таблици или имена на Масив от таблици или имена на таблицитаблици

Page 110: ADO.NET

Зареждане наЗареждане на DataSetDataSet отот DataReaderDataReader – пример – пример Зареждане наЗареждане на DataSetDataSet отот DataReaderDataReader – пример – пример

// // Initialize connection and commandInitialize connection and command

// …// …

aadventureWorksdventureWorksConnectionConnection.Open();.Open();

aadventureWorksdventureWorksDataReaderDataReader = cmdSelect.ExecuteReader(); = cmdSelect.ExecuteReader();

aadventuredventureDataSetDataSet = new DataSet(); = new DataSet();

// Load table from DataReader// Load table from DataReader

aadventuredventureDataSetDataSet.Load(.Load(aadventureWorksdventureWorksDataReaderDataReader, , LoadOption.Upsert, "Currency");LoadOption.Upsert, "Currency");

// Use data from data set// Use data from data set

// …// …

Page 111: ADO.NET

Използване на Използване на DataAdapterDataAdapterИзползване на Използване на DataAdapterDataAdapter

• DataAdapter DataAdapter свързва свързва DataSetDataSet с с източника на данниизточника на данни

• Използва се за:Използва се за:• Запълване на Запълване на DataSetDataSet с даннис данни• Обновяване на данните в източника Обновяване на данните в източника

след извършване на промени в след извършване на промени в тяхното копие в тяхното копие в DataSetDataSet обекта обекта

• Метод Метод Fill()Fill() на на DataAdapterDataAdapter• Запълва таблица в Запълва таблица в DataSetDataSet• Запълва Запълва DataTableDataTable обект обект• Използва Използва SelectCommandSelectCommand

• DataAdapter DataAdapter свързва свързва DataSetDataSet с с източника на данниизточника на данни

• Използва се за:Използва се за:• Запълване на Запълване на DataSetDataSet с даннис данни• Обновяване на данните в източника Обновяване на данните в източника

след извършване на промени в след извършване на промени в тяхното копие в тяхното копие в DataSetDataSet обекта обекта

• Метод Метод Fill()Fill() на на DataAdapterDataAdapter• Запълва таблица в Запълва таблица в DataSetDataSet• Запълва Запълва DataTableDataTable обект обект• Използва Използва SelectCommandSelectCommand

Page 112: ADO.NET

Използване на Използване на DataAdapterDataAdapterИзползване на Използване на DataAdapterDataAdapter

• Свойство Свойство MissingSchemaActionMissingSchemaAction

• Запълване на повече от една Запълване на повече от една таблица в таблица в DataSetDataSet

• Задаване на съответствие между Задаване на съответствие между таблици и колони в източника на таблици и колони в източника на данни и данни и DataSetDataSet• Свойство Свойство TableMappingsTableMappings на на DataAdapterDataAdapter

• Метод Метод FillSchema()FillSchema() на на DataAdapterDataAdapter – извличане на схемата от източника– извличане на схемата от източника

• Свойство Свойство MissingSchemaActionMissingSchemaAction

• Запълване на повече от една Запълване на повече от една таблица в таблица в DataSetDataSet

• Задаване на съответствие между Задаване на съответствие между таблици и колони в източника на таблици и колони в източника на данни и данни и DataSetDataSet• Свойство Свойство TableMappingsTableMappings на на DataAdapterDataAdapter

• Метод Метод FillSchema()FillSchema() на на DataAdapterDataAdapter – извличане на схемата от източника– извличане на схемата от източника

Page 113: ADO.NET

Използване на Използване на DataAdapterDataAdapterИзползване на Използване на DataAdapterDataAdapter

• Изпращане на обновяваните редове Изпращане на обновяваните редове към източника на данни на групи - към източника на данни на групи - свойство свойство UpdateBatchSize UpdateBatchSize

• Свойства на Свойства на DataAdapterDataAdapter

• AcceptChangesDuringFillAcceptChangesDuringFill

• ContinueUpdateOnErrorContinueUpdateOnError

• Събития на Събития на DataAdapterDataAdapter

• FillErrorFillError

• RowUpdatingRowUpdating

• RowUpdatedRowUpdated

• Изпращане на обновяваните редове Изпращане на обновяваните редове към източника на данни на групи - към източника на данни на групи - свойство свойство UpdateBatchSize UpdateBatchSize

• Свойства на Свойства на DataAdapterDataAdapter

• AcceptChangesDuringFillAcceptChangesDuringFill

• ContinueUpdateOnErrorContinueUpdateOnError

• Събития на Събития на DataAdapterDataAdapter

• FillErrorFillError

• RowUpdatingRowUpdating

• RowUpdatedRowUpdated

Page 114: ADO.NET

Използване на Използване на DataAdapterDataAdapterИзползване на Използване на DataAdapterDataAdapter

• Обновяване на данните в източникаОбновяване на данните в източника• Свойства Свойства InsertCommandInsertCommand, , UpdateCommandUpdateCommand, , DeleteCommandDeleteCommand

• Класът Класът CommandBuilderCommandBuilder

• Обновяване на източника с Обновяване на източника с потребитеска логикапотребитеска логика

• Извличане на обновени стойности в Извличане на обновени стойности в DataSetDataSet

• Обновяване на свързани таблициОбновяване на свързани таблици

• Обновяване на данните в източникаОбновяване на данните в източника• Свойства Свойства InsertCommandInsertCommand, , UpdateCommandUpdateCommand, , DeleteCommandDeleteCommand

• Класът Класът CommandBuilderCommandBuilder

• Обновяване на източника с Обновяване на източника с потребитеска логикапотребитеска логика

• Извличане на обновени стойности в Извличане на обновени стойности в DataSetDataSet

• Обновяване на свързани таблициОбновяване на свързани таблици

Page 115: ADO.NET

DataAdapterDataAdapter – – архитектураархитектураDataAdapterDataAdapter – – архитектураархитектура

SQL Server 7.0 /SQL Sever 2000

SqlConnectionSqlConnection

SelectCommandSelectCommandDataSetDataSet

……22

……33

……44

……11

DataTableDataTable

……22

……33

……44

……11

DataTableDataTable

……22

……33

……44

……11

DataTableDataTable

……22

……33

……44

……11

DataTableDataTable

……22

……33

……44

……11

DataTableDataTable

……22

……33

……44

……11

DataTableDataTable InsertCommandInsertCommand

UpdateCommandUpdateCommand

DeleteCommandDeleteCommand

SqlDataAdapterSqlDataAdapter

Page 116: ADO.NET

DataAdapterDataAdapter – пример – примерDataAdapterDataAdapter – пример – примерstatic void Main()static void Main()

{{ string strCon = "Data Source=(local);" +string strCon = "Data Source=(local);" +

"Integrated Security=SSPI;Database=Northwind";"Integrated Security=SSPI;Database=Northwind";

SqlConnection cnNorthwind = new SqlConnection(strCon);SqlConnection cnNorthwind = new SqlConnection(strCon);

SqlCommand cmdSelect = CreateSelectCommand(cnNorthwind);SqlCommand cmdSelect = CreateSelectCommand(cnNorthwind);

SqlDataAdapter daEmployees = new SqlDataAdapter daEmployees = new SqlDataAdapter(cmdSelect);SqlDataAdapter(cmdSelect);

DataSet dsNorthwind = new DataSet();DataSet dsNorthwind = new DataSet();

daEmployees.Fill(dsNorthwind, "Employees");daEmployees.Fill(dsNorthwind, "Employees");

// Set the AutoIncrement property of EmployeeID column// Set the AutoIncrement property of EmployeeID column

DataTable employeesTable = DataTable employeesTable = dsNorthwind.Tables["Employees"];dsNorthwind.Tables["Employees"];

DataColumn columnEmployeeId =DataColumn columnEmployeeId =

employeesTable.Columns["EmployeeID"];employeesTable.Columns["EmployeeID"];

columnEmployeeId.AutoIncrement = true;columnEmployeeId.AutoIncrement = true;

columnEmployeeId.AutoIncrementSeed = -1;columnEmployeeId.AutoIncrementSeed = -1;

columnEmployeeId.AutoIncrementStep = -1;columnEmployeeId.AutoIncrementStep = -1;

(примерът продължава)(примерът продължава)

Page 117: ADO.NET

DataAdapterDataAdapter – пример – примерDataAdapterDataAdapter – пример – пример // Create the commands for the data adapter// Create the commands for the data adapter

daEmployees.InsertCommand = CreateInsertCommand(cnNorthwind);daEmployees.InsertCommand = CreateInsertCommand(cnNorthwind);

daEmployees.DeleteCommand = CreateDeleteCommand(cnNorthwind);daEmployees.DeleteCommand = CreateDeleteCommand(cnNorthwind);

daEmployees.UpdateCommand = CreateUpdateCommand(cnNorthwind);daEmployees.UpdateCommand = CreateUpdateCommand(cnNorthwind);

// Add new record and update the database// Add new record and update the database

DataRow row = employeesTable.NewRow();DataRow row = employeesTable.NewRow();

row["LastName"] = "Ivanov";row["LastName"] = "Ivanov";

row["FirstName"] = "Ivan";row["FirstName"] = "Ivan";

employeesTable.Rows.Add(row);employeesTable.Rows.Add(row);

daEmployees.Update(dsNorthwind, "Employees");daEmployees.Update(dsNorthwind, "Employees");

Console.WriteLine("Inserted row id={0}.", row["EmployeeID"]);Console.WriteLine("Inserted row id={0}.", row["EmployeeID"]);

// Change the added record and update the database// Change the added record and update the database

row["LastName"] = "Petrov";row["LastName"] = "Petrov";

daEmployees.Update(dsNorthwind, "Employees");daEmployees.Update(dsNorthwind, "Employees");

Console.WriteLine("Updated the row.");Console.WriteLine("Updated the row.");

(примерът продължава)(примерът продължава)

Page 118: ADO.NET

DataAdapterDataAdapter – пример – примерDataAdapterDataAdapter – пример – пример // Delete the added record and update the database// Delete the added record and update the database row.Delete();row.Delete(); daEmployees.Update(dsNorthwind, "Employees");daEmployees.Update(dsNorthwind, "Employees"); Console.WriteLine("Deleted the row.");Console.WriteLine("Deleted the row.");}}

static SqlCommand CreateSelectCommand(SqlConnection aConnection)static SqlCommand CreateSelectCommand(SqlConnection aConnection){{ string strSelect = "SELECT EmployeeID, LastName, FirstName" +string strSelect = "SELECT EmployeeID, LastName, FirstName" +

" FROM Employees";" FROM Employees";

SqlCommand cmdSelect = new SqlCommand(strSelect, aConnection);SqlCommand cmdSelect = new SqlCommand(strSelect, aConnection); return cmdSelect;return cmdSelect;}}

static SqlCommand CreateInsertCommand(SqlConnection aConnection)static SqlCommand CreateInsertCommand(SqlConnection aConnection){{ string strInsert = "INSERT Employees(LastName, FirstName) "+string strInsert = "INSERT Employees(LastName, FirstName) "+

"VALUES(@LastName, @FirstName);" +"VALUES(@LastName, @FirstName);" +"SET @EmployeeID=Scope_Identity()";"SET @EmployeeID=Scope_Identity()";

(примерът продължава)(примерът продължава)

Page 119: ADO.NET

DataAdapterDataAdapter – пример – примерDataAdapterDataAdapter – пример – пример SqlCommand cmdInsert = new SqlCommand(strInsert, aConnection);SqlCommand cmdInsert = new SqlCommand(strInsert, aConnection);

SqlParameterCollection cparams = cmdInsert.Parameters;SqlParameterCollection cparams = cmdInsert.Parameters;

SqlParameter empID = cparams.Add("@EmployeeID", SqlParameter empID = cparams.Add("@EmployeeID", SqlDbType.Int, 0, "EmployeeID");SqlDbType.Int, 0, "EmployeeID");

empID.Direction = ParameterDirection.Output;empID.Direction = ParameterDirection.Output;

cparams.Add("@LastName", SqlDbType.NVarChar, 20,cparams.Add("@LastName", SqlDbType.NVarChar, 20, "LastName");"LastName");

cparams.Add("@FirstName", SqlDbType.NVarChar,cparams.Add("@FirstName", SqlDbType.NVarChar, 10,"FirstName");10,"FirstName");

return cmdInsert;return cmdInsert;

}}

static SqlCommand CreateUpdateCommand(SqlConnection aConnection)static SqlCommand CreateUpdateCommand(SqlConnection aConnection)

{{

string strUpdate = "UPDATE Employees SET " +string strUpdate = "UPDATE Employees SET " +

"LastName=@LastName, FirstName=@FirstName " +"LastName=@LastName, FirstName=@FirstName " +

"WHERE EmployeeID=@EmployeeID";"WHERE EmployeeID=@EmployeeID";

SqlCommand cmdUpdate = new SqlCommand(strUpdate,SqlCommand cmdUpdate = new SqlCommand(strUpdate, aConnection);aConnection);

SqlParameterCollection cparams = cmdUpdate.Parameters;SqlParameterCollection cparams = cmdUpdate.Parameters;

SqlCommand cmdUpdate = new SqlCommand(strUpdate,SqlCommand cmdUpdate = new SqlCommand(strUpdate, aConnection);aConnection);

SqlParameterCollection cparams = cmdUpdate.Parameters;SqlParameterCollection cparams = cmdUpdate.Parameters; (примерът продължава)(примерът продължава)

Page 120: ADO.NET

DataAdapterDataAdapter – пример – примерDataAdapterDataAdapter – пример – пример SqlParameter empID = cparams.Add("@EmployeeID", SqlParameter empID = cparams.Add("@EmployeeID",

SqlDbType.Int, 0, "EmployeeID");SqlDbType.Int, 0, "EmployeeID");

empID.SourceVersion = DataRowVersion.Original;empID.SourceVersion = DataRowVersion.Original;

cparams.Add("@LastName", SqlDbType.NVarChar,20,"LastName");cparams.Add("@LastName", SqlDbType.NVarChar,20,"LastName");

cparams.Add("@FirstName", SqlDbType.NVarChar, 10, cparams.Add("@FirstName", SqlDbType.NVarChar, 10, "FirstName");"FirstName");

return cmdUpdate;return cmdUpdate;

}}

static SqlCommand CreateDeleteCommand(SqlConnection static SqlCommand CreateDeleteCommand(SqlConnection aConnection)aConnection)

{{

string strDelete = "DELETE FROM Employees " +string strDelete = "DELETE FROM Employees " +"WHERE EmployeeID = @EmployeeID";"WHERE EmployeeID = @EmployeeID";

SqlCommand cmdDelete = new SqlCommand(strDelete, SqlCommand cmdDelete = new SqlCommand(strDelete, aConnection);aConnection);

SqlParameter empID = cmdDelete.Parameters.Add( SqlParameter empID = cmdDelete.Parameters.Add( "@EmployeeID", SqlDbType.Int, 0, "EmployeeID");"@EmployeeID", SqlDbType.Int, 0, "EmployeeID");

empID.SourceVersion = DataRowVersion.Original;empID.SourceVersion = DataRowVersion.Original;

return cmdDelete;return cmdDelete;

}}

Page 121: ADO.NET

DataSet.GetChanges()DataSet.GetChanges() и и DataSet.HasChanges()DataSet.HasChanges()DataSet.GetChanges()DataSet.GetChanges() и и DataSet.HasChanges()DataSet.HasChanges()

• Могат да приемат параметър за версията Могат да приемат параметър за версията на данните от тип на данните от тип DataRowStateDataRowState• AddedAdded – добавени редове – добавени редове• DeletedDeleted – изтрити редове – изтрити редове• DetachedDetached – разкачени от таблицата редове – разкачени от таблицата редове• ModifiedModified – променени редове – променени редове• UnchangedUnchanged – непроменени редове – непроменени редове

• GetChanges()GetChanges() връща копие на връща копие на DataSetDataSet-а, -а, съдържащо промените след последното съдържащо промените след последното обръщение на обръщение на AcceptChanges()AcceptChanges() метода метода

• Могат да приемат параметър за версията Могат да приемат параметър за версията на данните от тип на данните от тип DataRowStateDataRowState• AddedAdded – добавени редове – добавени редове• DeletedDeleted – изтрити редове – изтрити редове• DetachedDetached – разкачени от таблицата редове – разкачени от таблицата редове• ModifiedModified – променени редове – променени редове• UnchangedUnchanged – непроменени редове – непроменени редове

• GetChanges()GetChanges() връща копие на връща копие на DataSetDataSet-а, -а, съдържащо промените след последното съдържащо промените след последното обръщение на обръщение на AcceptChanges()AcceptChanges() метода метода

Page 122: ADO.NET

DataSet.GetChanges()DataSet.GetChanges() – – примерпримерDataSet.GetChanges()DataSet.GetChanges() – – примерпример

if(! myDataSet.HasChanges(DataRowState.Modified)) if(! myDataSet.HasChanges(DataRowState.Modified)) return;return;

// Create temporary DataSet variable// Create temporary DataSet variable

DataSet DataSet modifiedmodifiedDataSet;DataSet;

// GetChanges for modified rows only// GetChanges for modified rows onlymodifiedmodifiedDataSet = myDataSet.GetChanges(DataSet = myDataSet.GetChanges( DataRowState.Modified);DataRowState.Modified);

// Check the DataSet for errors// Check the DataSet for errorsif(if(modifiedmodifiedDataSet.HasErrors) {DataSet.HasErrors) { // Insert code to resolve errors// Insert code to resolve errors}}

// After fixing errors, update the data source // After fixing errors, update the data source // with the DataAdapter used to create the DataSet// with the DataAdapter used to create the DataSetadp.Update(adp.Update(modifiedmodifiedDataSet);DataSet);

Page 123: ADO.NET

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

1.1. Зареждаме данните в Зареждаме данните в DataSetDataSet чрез чрез DataAdapter.Fill()DataAdapter.Fill() или по друг начин: или по друг начин:

2.2. Обработваме данните – променяме, Обработваме данните – променяме, добавяме и изтриваме записидобавяме и изтриваме записи

3.3. Извличаме направените промени:Извличаме направените промени:

GetChanges()GetChanges() връща връща nullnull ако няма ако няма промени в промени в DataSetDataSet-а-а

1.1. Зареждаме данните в Зареждаме данните в DataSetDataSet чрез чрез DataAdapter.Fill()DataAdapter.Fill() или по друг начин: или по друг начин:

2.2. Обработваме данните – променяме, Обработваме данните – променяме, добавяме и изтриваме записидобавяме и изтриваме записи

3.3. Извличаме направените промени:Извличаме направените промени:

GetChanges()GetChanges() връща връща nullnull ако няма ако няма промени в промени в DataSetDataSet-а-а

userDataAdapter.Fill(dsUsers);userDataAdapter.Fill(dsUsers);

DataSet dsChanges = dsUsers.GetChanges();DataSet dsChanges = dsUsers.GetChanges();

Page 124: ADO.NET

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

4.4. Прилагаме направените промени и Прилагаме направените промени и разрешаваме конфликтитеразрешаваме конфликтите

5.5. Зареждаме отново Зареждаме отново DataSetDataSet-а от базата -а от базата данни, за да работим с актуални данниданни, за да работим с актуални данни

4.4. Прилагаме направените промени и Прилагаме направените промени и разрешаваме конфликтитеразрешаваме конфликтите

5.5. Зареждаме отново Зареждаме отново DataSetDataSet-а от базата -а от базата данни, за да работим с актуални данниданни, за да работим с актуални данниuserDataAdapter.Fill(dsUsers);userDataAdapter.Fill(dsUsers);

userDataAdapter.RowUpdated +=userDataAdapter.RowUpdated +=new SqlRowUpdatedEventHandler(OnRowUpdated);new SqlRowUpdatedEventHandler(OnRowUpdated);

private void OnRowUpdated(object sender,private void OnRowUpdated(object sender,SqlRowUpdatedEventArgs e)SqlRowUpdatedEventArgs e)

{{// Handle the conflict …// Handle the conflict …е.е.Status = UpdateStatus.Continue;Status = UpdateStatus.Continue;

}}userDataAdapter.userDataAdapter.UpdateUpdate(dsChanges);(dsChanges);

Page 125: ADO.NET

Демонстрация Демонстрация ##2323Демонстрация Демонстрация ##2323

• Реализация на несвързан модел с Реализация на несвързан модел с DataSetDataSet и и DataAdapterDataAdapter

• Реализация на несвързан модел с Реализация на несвързан модел с DataSetDataSet и и DataAdapterDataAdapter

Page 126: ADO.NET

Връзка между Връзка между ADO.NET ADO.NET и и XMLXMLВръзка между Връзка между ADO.NET ADO.NET и и XMLXML

• Възможност за достъп до Възможност за достъп до XML XML данни, данни, съхранени в съхранени в SQL ServerSQL Server

• XML XML стойност в колона от таблица в стойност в колона от таблица в базатабазата

• Класът Класът SqlXmlSqlXml

• Възможност за достъп до Възможност за достъп до XML XML данни, данни, съхранени в съхранени в SQL ServerSQL Server

• XML XML стойност в колона от таблица в стойност в колона от таблица в базатабазата

• Класът Класът SqlXmlSqlXml

Page 127: ADO.NET

Класът Класът SqlXmlSqlXmlКласът Класът SqlXmlSqlXml

• Намира се в пространството на имената Намира се в пространството на имената System.Data.SqlTypesSystem.Data.SqlTypes

• Използва се за запазване на стойност, Използва се за запазване на стойност, извлечена от колона с тип извлечена от колона с тип xml xml на таблица на таблица в базатав базата

• Извлича се чрез метода Извлича се чрез метода GetSqlXml()GetSqlXml() на на класа класа SqlDataReaderSqlDataReader

• Играе роля на Играе роля на factory factory за обекти от клас за обекти от клас XmlReaderXmlReader за представяне на за представяне на XML XML даннитеданните • Метод Метод CreateReader()CreateReader() – – извлича извлича

стойността на стойността на XML XML данните от данните от SqlXmlSqlXml обекта като обекта като XmlReaderXmlReader

• Намира се в пространството на имената Намира се в пространството на имената System.Data.SqlTypesSystem.Data.SqlTypes

• Използва се за запазване на стойност, Използва се за запазване на стойност, извлечена от колона с тип извлечена от колона с тип xml xml на таблица на таблица в базатав базата

• Извлича се чрез метода Извлича се чрез метода GetSqlXml()GetSqlXml() на на класа класа SqlDataReaderSqlDataReader

• Играе роля на Играе роля на factory factory за обекти от клас за обекти от клас XmlReaderXmlReader за представяне на за представяне на XML XML даннитеданните • Метод Метод CreateReader()CreateReader() – – извлича извлича

стойността на стойността на XML XML данните от данните от SqlXmlSqlXml обекта като обекта като XmlReaderXmlReader

Page 128: ADO.NET

Класът Класът SqlXmlSqlXml - - примерпримерКласът Класът SqlXmlSqlXml - - примерпример

// Initialize connection and command// Initialize connection and command // …// …

// Load data from database// Load data from database adventureWorksConnection.Open();adventureWorksConnection.Open(); adventureWorksDataReader = selectCommand.ExecuteReader();adventureWorksDataReader = selectCommand.ExecuteReader();

// Read the xml value in each row and print it// Read the xml value in each row and print it while(adventureWorksDataReader.Read())while(adventureWorksDataReader.Read()) {{

salesSqlXml = adventureWorksDataReader.GetSqlXml(0);salesSqlXml = adventureWorksDataReader.GetSqlXml(0);salesXmlReader = salesSqlXml.CreateReader();salesXmlReader = salesSqlXml.CreateReader();

// // Print the content of the xmlPrint the content of the xml// …// …

}}

Page 129: ADO.NET

Класът Класът XmlDataDocumentXmlDataDocumentКласът Класът XmlDataDocumentXmlDataDocument

• Интеграция и поддръжка на XML през Интеграция и поддръжка на XML през XmlDataDocumentXmlDataDocument класа класа

• Класът Класът XmlDataDocumentXmlDataDocument

• Представлява DOM дървоПредставлява DOM дърво

• Наследник на Наследник на XmlDocumentXmlDocument

• Реализира автоматична синхронизация на Реализира автоматична синхронизация на DataSetDataSet с DOM дърво с DOM дърво

• При промяна в DOM дървото се промяна При промяна в DOM дървото се промяна DataSetDataSet-а-а

• При промяна на При промяна на DataSetDataSet-а се промяна DOM -а се промяна DOM дървотодървото

• Интеграция и поддръжка на XML през Интеграция и поддръжка на XML през XmlDataDocumentXmlDataDocument класа класа

• Класът Класът XmlDataDocumentXmlDataDocument

• Представлява DOM дървоПредставлява DOM дърво

• Наследник на Наследник на XmlDocumentXmlDocument

• Реализира автоматична синхронизация на Реализира автоматична синхронизация на DataSetDataSet с DOM дърво с DOM дърво

• При промяна в DOM дървото се промяна При промяна в DOM дървото се промяна DataSetDataSet-а-а

• При промяна на При промяна на DataSetDataSet-а се промяна DOM -а се промяна DOM дървотодървото

Page 130: ADO.NET

XmlDataDocumentXmlDataDocument – – примерпримерXmlDataDocumentXmlDataDocument – – примерпример

DataSet myDataSet = new DataSet();DataSet myDataSet = new DataSet();

// // … … Fill the DataSetFill the DataSet … …

XmlDataDocument xmlDoc =XmlDataDocument xmlDoc = new XmlDataDocument(myDataSet); new XmlDataDocument(myDataSet);

// Get all elements with ProductID = 43// Get all elements with ProductID = 43XmlNodeList nodeList = xmlDoc.DocumentElement. XmlNodeList nodeList = xmlDoc.DocumentElement. SelectNodes("descendant::Customers[*/OrderDetails/SelectNodes("descendant::Customers[*/OrderDetails/ProductID=43]");ProductID=43]");

foreach (XmlNode myNode in nodeList)foreach (XmlNode myNode in nodeList){{ DataRow customer = xmlDoc.GetRowFromElement(DataRow customer = xmlDoc.GetRowFromElement( (XmlElement)myNode);(XmlElement)myNode); Console.WriteLine(customer["CompanyName"]);Console.WriteLine(customer["CompanyName"]);}}

Page 131: ADO.NET

Демонстрация Демонстрация ##2424Демонстрация Демонстрация ##2424

• Използване на XPath за търсене в Използване на XPath за търсене в DataSetDataSet чрез чрез XmlDataDocumentXmlDataDocument

• Използване на XPath за търсене в Използване на XPath за търсене в DataSetDataSet чрез чрез XmlDataDocumentXmlDataDocument

Page 132: ADO.NET

Страниране на данниСтраниране на данниСтраниране на данниСтраниране на данни

• Какво е страниране на данни?Какво е страниране на данни?

• Извличане само на необходимите Извличане само на необходимите данниданни

• Оптимизира мрежовият трафикОптимизира мрежовият трафик

• Минимизира използваната памет Минимизира използваната памет ( ( на на сървъра и слоя на сървъра и слоя на DAL )DAL )

• Съкращава времето за отговорСъкращава времето за отговор

• Налага се при работа с Налага се при работа с многомного записизаписи

• Какво е страниране на данни?Какво е страниране на данни?

• Извличане само на необходимите Извличане само на необходимите данниданни

• Оптимизира мрежовият трафикОптимизира мрежовият трафик

• Минимизира използваната памет Минимизира използваната памет ( ( на на сървъра и слоя на сървъра и слоя на DAL )DAL )

• Съкращава времето за отговорСъкращава времето за отговор

• Налага се при работа с Налага се при работа с многомного записизаписи

Page 133: ADO.NET

Страниране на данни Страниране на данни (2)(2)Страниране на данни Страниране на данни (2)(2)

• Удобно за работа със статични данни Удобно за работа със статични данни

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

• Страниране на данни отСтраниране на данни от

• MS SQL 6.5, 7, 2000, MySQL MS SQL 6.5, 7, 2000, MySQL и др. – и др. – използване на съхранена процедураизползване на съхранена процедура

• MS SQL 2005 – MS SQL 2005 – използване на новата използване на новата функция функция ROW_NUMBER()ROW_NUMBER()

• Удобно за работа със статични данни Удобно за работа със статични данни

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

• Страниране на данни отСтраниране на данни от

• MS SQL 6.5, 7, 2000, MySQL MS SQL 6.5, 7, 2000, MySQL и др. – и др. – използване на съхранена процедураизползване на съхранена процедура

• MS SQL 2005 – MS SQL 2005 – използване на новата използване на новата функция функция ROW_NUMBER()ROW_NUMBER()

Page 134: ADO.NET

Страниране на данни Страниране на данни ((33))Страниране на данни Страниране на данни ((33))

• Страниране на данни от Страниране на данни от SQL 6.5, 7, SQL 6.5, 7, 20002000..

• Временна таблицаВременна таблица

• SET ROWCOUNTSET ROWCOUNT – – оператороператор

• Използване на подзаявкаИзползване на подзаявка

• Използване на курсорИзползване на курсор

• Страниране на данни от Страниране на данни от SQL 6.5, 7, SQL 6.5, 7, 20002000..

• Временна таблицаВременна таблица

• SET ROWCOUNTSET ROWCOUNT – – оператороператор

• Използване на подзаявкаИзползване на подзаявка

• Използване на курсорИзползване на курсор

Page 135: ADO.NET

Страниране на данни Страниране на данни (4)(4)Страниране на данни Страниране на данни (4)(4)

• Страниране на данни от Страниране на данни от SQL 6.5, 7, SQL 6.5, 7, 20002000.. - - Временна таблицаВременна таблица

• Страниране на данни от Страниране на данни от SQL 6.5, 7, SQL 6.5, 7, 20002000.. - - Временна таблицаВременна таблица

• CREATE PROCEDURE GetProductsPagedCREATE PROCEDURE GetProductsPaged• @startRow int,@startRow int,• @EndRow int@EndRow int• ASAS• CREATE TABLE #Temp (CREATE TABLE #Temp (• ID int IDENTITY PRIMARY KEY,ID int IDENTITY PRIMARY KEY,• ProductID /* here goes PK type */ProductID /* here goes PK type */• ))

• INSERT INTO #Temp SELECT ProductID FROM Table ORDER BY [Criteria INSERT INTO #Temp SELECT ProductID FROM Table ORDER BY [Criteria that leaves ProductID monotonically increasing]that leaves ProductID monotonically increasing]

• SELECT p.* FROM Products p JOIN #Temp temp ON p. ProductID = SELECT p.* FROM Products p JOIN #Temp temp ON p. ProductID = temp. ProductID ORDER BY temp.ID temp. ProductID ORDER BY temp.ID

• WHERE ID > @StartRow AND ID < @EndRowWHERE ID > @StartRow AND ID < @EndRow• GOGO

Page 136: ADO.NET

Страниране на данни Страниране на данни ((55))Страниране на данни Страниране на данни ((55))

• Страниране на данни от Страниране на данни от SQL 6.5, 7, SQL 6.5, 7, 20002000.. - - SET ROWCOUNTSET ROWCOUNT – – оператороператор

• Страниране на данни от Страниране на данни от SQL 6.5, 7, SQL 6.5, 7, 20002000.. - - SET ROWCOUNTSET ROWCOUNT – – оператороператор

• CREATE PROCEDURE GetProductsPagedCREATE PROCEDURE GetProductsPaged• @lastProductID int,@lastProductID int,• @pageSize int@pageSize int• ASAS• SET ROWCOUNT @pageSizeSET ROWCOUNT @pageSize

• SELECT *SELECT *• FROM ProductsFROM Products• WHERE [standard search criteria]WHERE [standard search criteria]• AND ProductID > @lastProductIDAND ProductID > @lastProductID• ORDER BY [Criteria that leaves ProductID monotonically ORDER BY [Criteria that leaves ProductID monotonically

increasing]increasing]• GOGO

Page 137: ADO.NET

Страниране на данни Страниране на данни ((66))Страниране на данни Страниране на данни ((66))

• Страниране на данни от Страниране на данни от SQL 6.5, 7, SQL 6.5, 7, 20002000.. - - Използване на подзаявкаИзползване на подзаявка

• Страниране на данни от Страниране на данни от SQL 6.5, 7, SQL 6.5, 7, 20002000.. - - Използване на подзаявкаИзползване на подзаявка

• CREATE PROCEDURE GetProductsPagedCREATE PROCEDURE GetProductsPaged• @startRow int,@startRow int,• @EndRow int@EndRow int• ASAS

• SELECT * FROM Products WHERE ProductID IN SELECT * FROM Products WHERE ProductID IN • (SELECT TOP @PageSize ProductID FROM Product WHERE ProductID (SELECT TOP @PageSize ProductID FROM Product WHERE ProductID

NOT INNOT IN• (SELECT TOP @StartRow ProductID FROM Product ORDER BY (SELECT TOP @StartRow ProductID FROM Product ORDER BY

[Criteria...])[Criteria...])• ORDER BY [Criteria...])ORDER BY [Criteria...])• ORDER BY [Criteria that leaves ProductID monotonically ORDER BY [Criteria that leaves ProductID monotonically

increasing]increasing]

• GOGO

Page 138: ADO.NET

Страниране на данни Страниране на данни ((77))Страниране на данни Страниране на данни ((77))

• Използване на курсорИзползване на курсор• Използване на курсорИзползване на курсор• DECLARE @PK /* PK Type */DECLARE @PK /* PK Type */• DECLARE @tblPK TABLE (DECLARE @tblPK TABLE (• PK /* PK Type */ NOT NULL PRIMARY KEYPK /* PK Type */ NOT NULL PRIMARY KEY• ))

• DECLARE PagingCursor CURSOR DYNAMIC READ_ONLY FORDECLARE PagingCursor CURSOR DYNAMIC READ_ONLY FOR• SELECT @PK FROM Table ORDER BY SortColumnSELECT @PK FROM Table ORDER BY SortColumn

• OPEN PagingCursorOPEN PagingCursor• FETCH RELATIVE @StartRow FROM PagingCursor INTO @PKFETCH RELATIVE @StartRow FROM PagingCursor INTO @PK

• WHILE @PageSize > 0 AND @@FETCH_STATUS = 0WHILE @PageSize > 0 AND @@FETCH_STATUS = 0• BEGINBEGIN• INSERT @tblPK(PK) VALUES(@PK)INSERT @tblPK(PK) VALUES(@PK)• FETCH NEXT FROM PagingCursor INTO @PKFETCH NEXT FROM PagingCursor INTO @PK• SET @PageSize = @PageSize - 1SET @PageSize = @PageSize - 1• ENDEND

• CLOSE PagingCursorCLOSE PagingCursor• DEALLOCATE PagingCursorDEALLOCATE PagingCursor

• SELECT ... FROM Table JOIN @tblPK temp ON Table.PK = temp.PK SELECT ... FROM Table JOIN @tblPK temp ON Table.PK = temp.PK • ORDER BY SortColumnORDER BY SortColumn

Page 139: ADO.NET

Страниране на данни Страниране на данни (8)(8)Страниране на данни Страниране на данни (8)(8)

• Страниране на данни от Страниране на данни от SQLSQL 2005 2005• Страниране на данни от Страниране на данни от SQLSQL 2005 2005CREATE PROCEDURE GetProductsPagedCREATE PROCEDURE GetProductsPaged

@startRowNumber int,@startRowNumber int,@pageSize int@pageSize int

ASASWITH NumberedProjects AS (WITH NumberedProjects AS (

SELECT SELECT ROW_NUMBER()ROW_NUMBER() OVER (order by ProductID) OVER (order by ProductID) as Row,* FROM Products)as Row,* FROM Products)

SELECT*SELECT* FROM FROM NumberedProjectsNumberedProjectsWHERE WHERE (Row (Row BETWEENBETWEEN @startRowNumber AND @startRowNumber AND

@startRowNumber + @pageSize))@startRowNumber + @pageSize))ORDER BY [Criteria that leaves ProductID ORDER BY [Criteria that leaves ProductID

monotonically increasing]monotonically increasing]GOGO

Page 140: ADO.NET

ДемонстрацияДемонстрацияДемонстрацияДемонстрация

• Страниране на данни с Страниране на данни с MS SQL Server MS SQL Server 20052005

• Страниране на данни с Страниране на данни с MS SQL Server MS SQL Server 20052005

Page 141: ADO.NET

http://http://academy.devbg.orgacademy.devbg.org Христо РадковХристо РадковХристо РадковХристо Радков

• Лазар КирчевЛазар Кирчев

• Галин ИлиевГалин Илиев

• Стефан ЗахариевСтефан Захариев

• Стефан КирязовСтефан Кирязов

• Лазар КирчевЛазар Кирчев

• Галин ИлиевГалин Илиев

• Стефан ЗахариевСтефан Захариев

• Стефан КирязовСтефан Кирязов

Специални благодарности към Специални благодарности към контрибуторите:контрибуторите:

Page 142: ADO.NET

Lecture TopicLecture TopicLecture TopicLecture Topic

Questions?Questions?Questions?Questions?