Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Генератор поставщиков данных




Визуальное создание отношений между таблицами

Создание таблиц Customers и Orders

Создание хранимой процедуры GetPetName()

Создание таблицы inventory

Чтобы приступить к созданию тестовой базы данных, запустите Visual Studio 2010 и откройте Database Explorer через меню View (Просмотр). Затем щелкните правой кнопкой мыши на узле Data Connections (Подключения к данным) и выберите в контекстном меню пункт Create New SQL Server Database (Создать новую базу данных SQL Server). В открывшемся диалоговом окне подключитесь к SQL Server, установленному на вашей локальной машине (с именем (local)), и укажите в поле имени базы данных AutoLot. Для наших целей можно оставить аутентификацию Windows:

Примечание: У меня, после создания проекта, меню Data à Add New Data Source. Далее Database, Entity Data Model, Generate from database, New Connection, далее как на рис. 1.1. Далее создать БД.

Рисунок 1.1. Создание новой БД SQL Server

Сейчас база данных AutoLot совершенно пуста и не содержит никаких объектов (таблиц, хранимых процедур и т.п.). Для добавления новой таблицы щелкните правой кнопкой мыши на узле Tables (Таблицы) и выберите в контекстном меню пункт Add New Table:

С помощью редактора таблиц добавьте в таблицу четыре столбца данных: CarID (Идентификатор автомобиля), Make (Модель), Color (Цвет) и PetName (Дружественное имя). У столбца CarID должно быть установлено свойство Primary Key (первичный ключ) — для этого щелкните правой кнопкой мыши на строке CarID и выберите в контекстном меню пункт Set Primary Key (Установить первичный ключ). Окончательные параметры таблицы показаны на рисунке ниже. На панели Column Properties (Свойства столбца) ничего делать не надо, просто запомните типы данных для каждого столбца:

Сохраните и закройте новую таблицу; новый объект базы данных должен иметь имя Inventory. Теперь таблица Inventory должна быть видна под узлом Tables (Таблицы) в Server Explorer. Щелкните правой кнопкой мыши на ее значке и выберите в контекстном меню пункт Show Table Data (Просмотр данных таблицы). Введите информацию о нескольких новых автомобилях по своему усмотрению (чтобы было интереснее, пусть у некоторых автомобилей совпадают цвета и модели). Один из возможных вариантов списка товаров приведен на рисунке:

В последующих статьях будет показано, как вызывать хранимые процедуры в ADO.NET. Возможно, вы уже знаете, что хранимые процедуры — это подпрограммы, хранимые непосредственно в базе данных; обычно они работают с данными таблиц и возвращают какое-то значение. Мы добавим в базу данных одну хранимую процедуру, которая по идентификатору автомобиля будет возвращать его дружественное имя. Для этого щелкните правой кнопкой мыши на узле Stored Procedures (Хранимые процедуры) базы данных AutoLot в Server Explorer и выберите в контекстном меню пункт Add New Stored Procedure (Добавить новую хранимую процедуру). В появившемся окне редактора введите следующий текст:

ALTER PROCEDURE GetPetName@carID int,@petName char(10) outputAS SELECT @petName = PetName from Inventory where CarID = @carID

При сохранении, этой процедуре автоматически будет присвоено имя GetPetName, взятое из оператора CREATE PROCEDURE (учтите, что при первом сохранении Visual Studio 2010 автоматически изменяет имя SQL-сценария на "ALTER PROCEDURE..."). После этого новая хранимая процедура будет видна в Server Explorer:

Хранимые процедуры не обязательно должны возвращать данные через выходные параметры, как это сделано здесь; однако это пригодится, когда речь пойдет о свойстве Direction объектов SqlParameter.

В нашей тестовой базе данных должны быть еще две таблицы: Customers (Клиенты) и Orders (Заказы). Таблица Customers будет содержать список клиентов и состоять из трех столбцов: CustID (Идентификатор клиента; должен быть первичным ключом), FirstName (Имя) и LastName (Фамилия). Повторите шаги, которые были выполнены для создания таблицы Inventory, и создайте таблицу Customers, пользуясь схемой, приведенной на рисунке:

После сохранения этой таблицы добавьте в нее несколько записей:

Последняя наша таблица — Orders — предназначена для связи клиентов и интересующих их автомобилей. Для этого выполняется отображение значений OrderID на CarID/CustID. Ее структура показана ниже (здесь OrderID также является первичным ключом):

Теперь добавьте в таблицу Orders данные. Выберите для каждого значения CustID уникальное значение CarID (предположим, что значения OrderID начинаются с 1000):

Например, в соответствии с информацией, приведенной на рисунках, видно, что Дэйв Бреннер (Dave Brenner, CustID = 1) мечтает о черном BMW (CarID = 1000), а Пэт Уолтон (Pat Walton, CustID = 4) приглянулся розовый Saab (CarID = 1992).

И, наконец, между таблицами Customers, Orders и Inventory нужно установить отношения "родительский-дочерний". В Visual Studio 2010 это выполняется очень просто, т.к. она позволяет вставить новую диаграмму базы данных на этапе проектирования. Для этого откройте Server Explorer, щелкните правой кнопкой мыши на узле Database Diagrams базы AutoLot и выберите пункт контекстного меню Add New Diagram (Добавить новое представление). Откроется диалоговое окно, в котором можно выбирать таблицы и добавлять их в диаграмму. Выберите все таблицы из базы данных AutoLot:

Чтобы начать устанавливать отношения между таблицами, щелкните на ключе CarID таблицы Inventory, а затем (не отпуская кнопку мыши) перетащите его на поле CarID таблицы Orders. Когда вы отпустите кнопку, появится диалоговое окно; согласитесь со всеми предложенными в нем значениями по умолчанию.

Теперь повторите те же действия для отображения ключа CustID таблицы Customers на поле CustID таблицы Orders. После этого вы увидите диалоговое окно классов, показанное на рисунке ниже (было включено отображение отношений между таблицами за счет щелчка правой кнопкой мыши на конструкторе и выбора в контекстном меню пункта Show Relationship Labels (Показывать метки взаимосвязи)).

Вот и все, база AutoLot полностью готова. Конечно, это лишь бледное подобие реальных корпоративных баз данных, но для тестовых примеров этого вполне достаточно. И теперь, имея тестовую базу, можно начать подробно разбираться в модели генератора поставщиков данных ADO.NET.

Генератор поставщиков данных.NET позволяет создать единую кодовую базу с помощью обобщенных типов доступа к данным. Более того, посредством конфигурационных файлов приложения (и подэлемента <connectionStrings>) можно получить поставщики и строки подключения без необходимости в повторной компиляции или развертывания сборки, в которой используются API ADO.NET.

Чтобы разобраться в реализации генератора поставщиков данных, вспомните, что все классы в поставщике данных порождены от одних и тех же базовых классов, определенных в пространстве имен System.Data.Common:

DbCommand абстрактный базовый класс для всех объектов команд;
DbConnection абстрактный базовый класс для всех объектов подключений;
DbDataAdapter абстрактный базовый класс для всех объектов адаптеров данных;
DbDataReader абстрактный базовый класс для всех объектов чтения данных;
DbParameter абстрактный базовый класс для всех объектов параметров;
DbTransaction абстрактный базовый класс для всех объектов транзакций.

Все поставщики данных, разработанные Microsoft, содержат класс, порожденный от System.Data.Common.DbProviderFactory. В этом базовом классе определен ряд методов, которые выбирают объекты данных, характерные для конкретных поставщиков.

Для получения типа, порожденного от DbProviderFactory, непосредственно для вашего поставщика данных в пространстве имен System.Data.Common имеется класс DbProviderFactories. С помощью метода GetFactory() можно получить конкретный объект DbProviderFactory для указанного поставщика данных. Для этого нужно указать строковое имя, которое представляет пространство имен.NET, содержащее функциональность поставщика:

DbProviderFactory sqlFactory = DbProviderFactories.GetFactory("System.Data.SqlClient");

Разумеется, генератор можно получить не с помощью жестко закодированного строкового литерала, а, например, прочитать эту информацию из клиентского файла *.config (приблизительно так же, как в предыдущем примере с MyConnectionFactory). Вскоре вы увидите, как это сделать, а пока после получения генератора для поставщика данных можно получить связанные с ним объекты данных (например, подключения, команды и объекты чтения данных).

Для всех практических целей можно рассматривать аргумент, передаваемый в DbProviderFactories.GetFactory(), как имя пространства имен.NET для поставщика данных. В реальности это строковое значение используется в значении machine.config для динамической загрузки нужной библиотеки из глобального кэша сборок.

Для примера мы создадим новое консольное C#-приложение с именем DataProviderFactory, которое выводит список всех автомобилей из базы данных AutoLot. Поскольку это первый пример, мы жестко закодируем логику доступа к данным непосредственно в сборке DataProviderFactory.exe (чтобы пока не усложнять программирование). Но когда мы начнем разбираться в деталях модели программирования ADO.NET, мы изолируем логику данных в специальную кодовую библиотеку.NET, которая будет использоваться на протяжении всего оставшегося текста.

Вначале добавьте ссылку на сборку System.Configuration.dll и импортируйте пространство имен System.Configuration. Затем добавьте файл Арр.config в текущий проект и определите пустой элемент <appSettings>. Добавьте новый ключ по имени provider, который отображает в пространство имен нужное имя поставщика данных (System.Data.SqlClient). Кроме того, определите строку подключения, которая описывает подключение к базе данных AutoLot (с помощью локального экземпляра SQL Server Express):

<?xml version="1.0" encoding="utf-8"?><configuration> <appSettings> <!-- Поставщик --> <add key="provider" value="System.Data.SqlClient"/> <!-- Строка подключения --> <add key="cnStr" value="Data Source=MICROSOF-1EA29E\SQLEXPRESS; Initial Catalog=AutoLot;Integrated Security=True;Pooling=False"/> </appSettings></configuration>

Чуть ниже мы рассмотрим строки подключения подробнее. А пока учтите, что если выбрать в Server Explorer значок базы данных AutoLot, то можно скопировать и вставить правильную строку подключения из свойства Connection String (Строка подключения) в окне Properties (Свойства) Visual Studio 2010.

Теперь у вас есть корректный файл *.config, и вы можете прочитать значения provider и cnStr с помощью индексатора ConfigurationManager.AppSettings.

Значение provider нужно передать в метод DbProviderFactories.GetFactory(), чтобы получить тип генератора для необходимого поставщика данных. Значение cnStr будет использовано для установки свойства ConnectionString в типе, порожденном от DbConnection.

Если вы импортировали пространства имен System.Data и System.Data.Common, метод Main() можно изменить следующим образом:

static void Main(string[] args) { // Получение строки подключения и поставщика из *.config string dp = ConfigurationManager.AppSettings["provider"]; string cnStr = ConfigurationManager.AppSettings["cnStr"]; // Получение генератора поставщика DbProviderFactory df = DbProviderFactories.GetFactory(dp); // Получение объекта подключения using (DbConnection cn = df.CreateConnection()) { Console.WriteLine("Объект подключения --> " + cn.GetType().Name); cn.ConnectionString = cnStr; cn.Open(); // Создание объекта команды DbCommand cmd = df.CreateCommand(); Console.WriteLine("Объект команды --> " + cmd.GetType().Name); cmd.Connection = cn; cmd.CommandText = "Select * From Inventory"; // Вывод данных с помощью объекта чтения данных using (DbDataReader dr = cmd.ExecuteReader()) { Console.WriteLine("Объект чтения данных --> " + dr.GetType().Name); Console.WriteLine("\n*** Текущее содержимое Inventory ***\n"); while (dr.Read()) Console.WriteLine("-> Автомобиль #{0} - {1}\n", dr["CarID"], dr["Make"].ToString()); } Console.ReadLine(); }

Здесь в целях диагностики с помощью службы рефлексии выводятся полностью определенные имена соответствующих объектов подключения, команды и чтения данных. Если запустить это приложение, то на консоль будут выведены текущие данные из таблицы Inventory базы данных AutoLot:

Теперь укажите в файле *.config в качестве поставщика данных System.Data.OleDb (и измените строку подключения и сегмент Provider):

<?xml version="1.0" encoding="utf-8"?><configuration> <appSettings> <!-- Поставщик --> <add key="provider" value="System.Data.OleDb"/> <!-- Строка подключения --> <add key="cnStr" value="Provider=SQLOLEDB;Data Source=MICROSOF-1EA29E\SQLEXPRESS; Initial Catalog=AutoLot;Integrated Security=True;Pooling=False"/> </appSettings></configuration>

Вы обнаружите, что неявно были задействованы типы System.Data.OleDb.

Конечно, при недостатке опыта работы с ADO.NET вы можете не быть уверенными, что именно делают объекты подключения, команды и чтения данных. Пока не вдавайтесь в детали и просто уясните, что модель генератора поставщиков данных ADO.NET позволяет создать единую кодовую базу, которая может использовать различные поставщики данных в декларативной манере.

Это действительно очень мощная модель, но все же нужно проверить, что в кодовой базе используются только типы и методы, общие для всех поставщиков как потомков абстрактных базовых классов. Поэтому при разработке кодовой базы следует ограничиться членами из DbConnection, DbCommand и других типов из пространства имен System.Data.Common.

Но такой обобщенный подход не позволит непосредственно задействовать дополнительные возможности конкретной СУБД. Если все же потребуются вызовы специфических членов конкретного поставщика (например, SqlConnection), то это можно сделать с помощью явного преобразования типа, как в данном примере:

Console.WriteLine("Объект подключения --> " + cn.GetType().Name); cn.ConnectionString = cnStr; cn.Open(); if (cn is SqlConnection) { // Вывод используемой версии SQL Server Console.WriteLine(((SqlConnection)cn).ServerVersion); }...

Однако при этом сопровождение кодовой базы несколько затруднится (а гибкость снизится), поскольку придется еще добавить ряд проверок времени выполнения. И все же если понадобится создать библиотеки доступа к данным наиболее гибким способом, то модель генератора поставщиков данных предоставляет для этого замечательный механизм.

1.6. Элемент <connectionStrings>

Пока наша строка подключения находится в элементе <appSettings> файла *.config. В конфигурационных файлах приложения может быть определен элемент <connectionStrings>. В этом элементе можно задать любое количество пар имя/значение, которые программа может прочитать в память с помощью индексатора ConfigurationManager.ConnectionStrings. Одним из преимуществ данного подхода (по сравнению с использованием элемента <appSettings> и индексатора ConfigurationManager.AppSettings) является то, что при этом можно однотипным образом определить несколько строк подключения для одного приложения.

Чтобы увидеть все это в действии, модифицируйте текущий файл Арр.config следующим образом (обратите внимание, что каждая строка подключения описывается с помощью атрибутов name и connectionString, а не атрибутов key и value, как в <appSettings>):

<?xml version="1.0" encoding="utf-8"?><configuration> <appSettings> <!-- Поставщик --> <add key="provider" value="System.Data.SqlClient"/> </appSettings> <connectionStrings> <add name="AutoLotSqlProvider" connectionString="Data Source=MICROSOF-1EA29E\SQLEXPRESS; Initial Catalog=AutoLot;Integrated Security=True;Pooling=False"/> <add name="AutoLotOleDbProvider" connectionString="Provider=SQLOLEDB;Data Source=MICROSOF-1EA29E\SQLEXPRESS; Initial Catalog=AutoLot;Integrated Security=True;Pooling=False"/> </connectionStrings></configuration>

Теперь можно изменить метод Main():

// Получение строки подключения и поставщика из *.config string dp = ConfigurationManager.AppSettings["provider"]; string cnStr = ConfigurationManager.ConnectionStrings["AutoLotSqlProvider"].ConnectionString;...

Мы получили приложение, которое может выводить содержимое таблицы Inventory базы данных AutoLot, используя нейтральную кодовую базу. Вынесение имени поставщика и строки подключения во внешний файл *.config позволяет модели генератора поставщиков данных самостоятельно динамически загружать нужный поставщик.

Итак, первый пример закончен, и теперь можно углубиться в детали работы с подключенным уровнем ADO.NET. Теперь вы уже оценили роль генераторов поставщиков данных в ADO.NET, и в последующих примерах мы будем явно использовать типы из пространства имен System.Data.SqlClient, чтобы не отвлекаться от текущих задач. Если вы пользуетесь другой СУБД (например, Oracle), то вам надо будет соответствующим образом изменить кодовую базу.




Поделиться с друзьями:


Дата добавления: 2015-05-09; Просмотров: 796; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.026 сек.