Доступ к данным пользователя Начиная с главы 3, в которой было введено понятие переменных и буквенных значений, мы уже осуществляли манипуляции с данными в С#. Однако до настоя- щего момента мы использовали только те данные, которые были "зашиты" в про- граммах. Если такие данные изменялись, то нам приходилось вносить изменения непосредственно в саму программу. В настоящей главе мы собираемся рассмот- реть то, каким образом можно осуществлять доступ к данным, хранящимся за пре- делами программ — в базах данных, распределенных документах и т. д. Основное содержание любого бизнес-приложения — его данные. В любой компании хранятся данные, которые касаются ее служащих,— зарплата и выпол- няемая работа, информация о заказчиках и т. д. Большинству программ, которые вы будете писать в дальнейшем, будет требоваться осуществляемый тем или иным способом доступ к этим внешним данным независимо от того, является ли ваше приложение небольшой поисковой программой, позволяющей персоналу компании вводить и редактировать информацию о служащих в базе данных компании, или это полномасштабный web-сайт для ведения электронной коммерции (e-commerce), где активно используется каталог продукции и информация о заказчиках, напри- мер, номера их кредитных карточек и адреса доставки, которая хранится в базе данных на сервере. В .NET Framework предусмотрен специальный набор объектов, находящихся в пространстве имен system.Data, которые обеспечивают возможность относитель- но простого доступа ко всем данным такого рода. В совокупности такие объекты известны под названием ADO.NET (это имя происходит от предшествующей тех- нологии доступа к данным, которая называется ActiveX Data Objects — объекты данных ActiveX). ADO.NET будет подробно рассматриваться в следующей главе, а эта глава посвящена изучению того, как можно заставить Visual Studio.NET вы- полнять практически всю черновую работу за нас. Мы воспользуемся мощными возможностями Visual Studio (VS) для написания приложений, обрабатывающих данные. Это позволит познакомиться с наиболее важными понятиями, относящи- мися к работе с базами данных, использование которых позволяет обходиться без написания больших объемов кода. Если вы из тех, кто обожает писать код страни- цу за страницей, чтобы выполнить даже самое простое задание, то эта глава не для вас! А вот тем из вас, кто получает удовольствие, когда работа оказывается сделанной качественно и быстро, мы говорим: "Добро пожаловать!". Доступ к данным в VS ADO.NET является достаточно емкой темой, которой может быть посвящена отдельная книга, и прежде чем приступить к более детальному ее рассмотрению в следующей главе, нужно достаточно подробно изучить основные понятия, которые 482 Глава 18 позволят двигаться дальше. ADO.NET основывается на предшествующих ей техно- логиях доступа к данным и позволяет использовать их; поэтому начнем с рассмот- рения ситуации, которая сложилась к моменту появления .NET. Краткая история обеспечения доступа к данным Когда были созданы самые первые БД, такие как Oracle и DB2 компании IBM, каждому разработчику, которому требовался доступ к хранящимся в них данным, приходилось использовать функции, специфические для конкретной базы данных. Каждая система обладала собственной библиотекой функций, например, для Oracle использовался Oracle Call Interface (OCI — интерфейс обращений к Oracle), а для SQL Server компании SyBase (позже купленной компанией Microsoft) — библио- тека DBLib. Это обеспечивало быстрый доступ к данным, поскольку программы из этих библиотек работали с БД напрямую. С другой стороны, это означало, что программисты должны быть знакомы с библиотеками для каждой БД, с которыми им приходилось работать, поэтому задача написания приложений для работы с данными была весьма сложна. Это также означало, что, если компания перехо- дила на использование другой БД, приложения приходилось переписывать заново. Эта проблема была решена с помощью Open Database Connectivity (ODBC — открытая система связи с базами данных). Система ODBC была создана в нача- ле 90-х гг. компанией Microsoft совместно с рядом других компаний и представля- ла собой стандартный набор функций, которые разработчики могли применять при работе с любыми базами данных. Эти функции транслировались в вызовы функ- ций, присущих конкретной базе данных, с помощью драйверов, специфических для этой базы данных. Это позволило решить основные проблемы, вызванные существованием раз- личных библиотек баз данных,— разработчикам теперь нужно было уметь пользо- ваться только одним набором функций (функциями ODBC), и если компания переходила от одной БД к другой, то все, что им приходилось изменять,— это код, отвечающий за установление соединения с базой данных. При этом одна проблема все равно оставалась нерешенной. Хотя "безбумажный офис" по-прежнему оста- вался по большей части мифом, у компаний скопилось огромное количество пред- ставленных в электронном виде данных, хранящихся в самых разнообразных формах,— в виде электронных писем, web-страниц, файлов Project 2000 и т.п. ODBC замечательно работала с данными в традиционных базах данных, но не справлялась с другими типами данных, которые не хранились в виде аккуратных столбцов и строк и у которых могла отсутствовать какая-либо связная структура. Решение этой проблемы привело к появлению OLE DB. OLE DB работает аналогично ODBC, представляя уровень абстракции между БД и приложениями, которым требуется доступ к данным. Клиентские приложения взаимодействуют с источником данных, который может представлять собой традиционную базу дан- ных или любое другое хранилище информации, посредством провайдера OLE DB ддя этого источника. Данные, извлекаемые из источника, представляются в прило- жении в табличном формате — т. е. так, как будто они были извлечены из базы данных. OLE DB позволяет осуществлять доступ к данным, которые представля- ются существующими драйверами ODBC, и, таким образом,, может быть исполь- зована для доступа к любым базам данных, поддерживающихся ODBC. ADO.NET поддерживает и OLE DB, и ODBC весьма сходным образом. Последняя технология доступа к данным, о которой необходимо упомянуть,— это ActiveX Data Objects (ADO). ADO — это просто тонкий слой, который нахо- дится над OLE DB и позволяет программам, написанным на языках высокого уровня вроде Visual Basic, получать доступ к данным OLE DB. Доступ к данным пользователя 483 Введение в ADO.NET Хотя название ADO.NET и происходит от ADO, отличия между ними, на самом деле, весьма существенны. С точки зрения архитектуры эта система даже ближе к OLE DB. ADO.NET состоит из набора объектов, находящихся в пространстве имен System.Data, которые взаимодействуют с базами данных посредством про- вайдеров данных .NET. Объекты ADO.NET позволяют устанавливать соединения с базами данных, а также извлекать, редактировать, уничтожать и вставлять дан- ные в базы данных и, кроме того, осуществлять манипуляции с данными програм- мным путем. Провайдеры данных .NET ADO.NET состоит из двух фундаментальных частей — объекта DataSet и про- вайдера данных .NET. Объект DataSet используется для того, чтобы хранить в программе набор данных, представленных в табличном виде; при этом совершенно безразлично, откуда поступили эти данные. Провайдер данных состоит из набора компонентов, специфических для конкретного источника данных, которые позволя- ют устанавливать соединение и осуществлять взаимодействие с этим источником. Каждый провайдер находится в собственном пространстве имен в рамках про- странства имен System.Data. На момент написания настоящей книги существовало три доступных провайдера данных: • Провайдер данных для SQL Server. Он находится в пространстве имен System.Data.Sgiciient и предназначается для работы с базами данных SQL Server версий 7.0 и выше, а также с базами данных MSDE (MSDE — это сокращенная версия SQL Server). Провайдер SQL Server является составной частью .NET Framework. Если возникает необходимость работы с базами данных SQL Server версий 6.5 или более ранних, то следует использовать провайдер OLE DB. • Провайдер данных для OLE DB. Он используется для установления соединений с источниками данных посредством OLE DB и находится в пространстве имен system.Data.oieDb. Так же, как и провайдер SQL Server, провайдер OLE DB является составной частью .NET Framework. Провайдер OLE DB не может использоваться для установления соединений с базами данных посредством драйверов ODBC. • Провайдер данных для ODBC. Он может использоваться для установления соединений с базами данных, обладающими драйверами ODBC. Провайдер данных ODBC находится в пространстве имен System.Data.odbc. Он может быть загружен с web-сайта компании Microsoft, расположенного по адресу http://download.microsoft.com/download/dasdk/ Beta/1.О.2914.58/W98NT42KMeXP/EN-US/odbc_net.ехе. Хотя на настоящий момент имеется возможность непосредственно устанавливать соединение только с БД SQL Server и MSDE, ожидается, что число доступных провайдеров данных будет увеличиваться с ростом числа пользователей .NET. Не так долго осталось ждать появления провайдера для Oracle. Но сейчас, при необходимости установить соединение с каким-либо другим источником данных вам придется воспользоваться либо OLE DB, либо ODBC. 484 Глава 18 Провайдеры данных состоят из четырех основных частей, описанных в следую- щей таблице: Имя компонента Описание Connection Используется для установления соединения с БД или каким-либо другим источником данных. Command Используется для извлечения, редактирования, уничтожения и включения данных в базу данных. DataReader Обеспечивает поток данных из источника данных. Такие данные могут только читаться (но не модифицироваться), и просмотр таких данных допускается только в прямом направлении. DataAdapter Используется для наполнения DataSet данными из источника данных, а также для обновления источника данных при внесении любых изменений в DataSet. При использовании этих объектов не происходит обращения к ним по этим именам. Каждый провайдер обладает своей собственной реализацией этих классов, и, поскольку в классах каждого провайдера реализованы одинаковые интерфейсы, они все обладают одними и теми же методами и свойствами (хотя включение в класс какого-либо конкретного провайдера дополнительных методов и свойств, присущих только данному провайдеру, ничему не противоречит). Например, если требуется установить соединение с базой данных SQL Server, то для этих целей используется объект sqiconnection, а при необходимости соединения с источником данных ODBC — объект odbcConnection. В обоих объектах реализуется интерфейс iDbConnection, поэтому они обладают одним и тем же набором методов и свойств. Объект DataSet После установления соединения с БД и получения данных из нее предоставля- ется возможность выполнять различные манипуляции над данными с помощью объекта DataSet, представляющего собой семейство объектов DataTabie (таблица данных). Объект DataTabie позволяет хранить данные в табличном виде; т. е. в виде столбцов и строк. Объект DataSet не является составной частью провайде- ра данных (существует только один тип объекта DataSet независимо от того, по- ступили данные из источника данных SQL Server или OLE DB), следовательно, объект DataSet не отвечает за установление соединения с источником. Это означа- ет, что когда мы выполняем какие-либо манипуляции надданными, находящимися в DataSet, то мы на самом деле работаем всего лишь с копией этих данных, распо- ложенных в памяти локального компьютера. Это позволяет уменьшить нагрузку на сервер и на сеть, поскольку установление соединения с источником данных про- исходит только в момент первоначального обращения к данным и тогда, когда мы завершаем их редактирование и необходимо внести сделанные изменения в саму базу данных. Наряду с преимуществами, такая архитектура работы без установ- ленного соединения приводит к возникновению определенных проблем. В среде с полностью разорванным соединением пользователь не может быть уведомлен об изменениях, которые были внесены в данные другими пользователями. Если для принятия решений используются данные, выведенные на экран, то всегда су- ществует вероятность того, что эта информация уже устарела, если другие пользо- ватели в этот момент вносят изменения в эти же самые данные. Запускайте Visual Studio.NET, создавайте в папке Begcsharp\chapteri8 новое С# Windows Application, присваивайте ему имя chiSExOi и приступайте к установ- лению соединения с базой данных! Доступ к данным пользователя 485 Просмотр данных в YS Прежде всего нам потребуется собственно база данных, с которой нужно уста- новить соединение. В данном примере мы соединимся с базой данных SQL Server Northwind. He беспокойтесь, если у вас нет SQL Server! Microsoft Data Engine (MSDE — средство для работы с данными компании Microsoft), которое поставля- ется вместе с Office и Access 2000, представляет собой не что иное, как сокращен- ную версию SQL Server, и с ним можно работать также, как если бы у вас была инсталлирована полная версия. MSDE не инсталлируется по умолчанию, и если MSDE отсутствует в вашей системе, то вы можете воспользоваться пошаговым руководством по инсталляции MSDE и импортированию базы данных Northwind, приведенном в приложении В. Server Explorer Щ &]•• i 1-1 й"-'::'".- |Р \hata Connections! % Servers В- Щ! Julians! в- Цр Sb Щ а- с§ Crystal Services Event Logs Message Queues Performance Counters Services SQL Servers Установка соединения с базой данных После открытия Visual Studio.NET, откройте Server Explorer, наведя курсор мыши на вкладку, расположенную с правой сто- роны экрана (по умолчанию вкладка Server Explorer располага- ется непосредственно над вкладкой Toolbox). В названном окне (см. рис. слева) выводятся службы, которые имеются на локаль- ной машине, а также службы, имеющиеся на любых доступных машинах. В данном случае нас интересует узел самого верхнего уровня в дереве просмотра Server Explorer — Data Connections, поскольку именно он позволяет включать в проект соединения с источниками данных. Щелкните правой кнопкой мыши на узле Data Connections и выберите пункт Add Connections.... Откроется диалоговое окно Data Link Properties (свойства соединений с данными), представленное на рисунке справа. По умолчанию провайдер соединения исходит из предпо- ложения о том, что мы будем осуществлять доступ к базе данных SQL Server, поэтому все выведенные на экран уста- новки относятся к провайдеру OLE DB для SQL Server. Для Ш Date Link Рп-.регЫ Pievki$ Mfctttttft M 4.0 OLE 0B Amita МсюпА OLE 08 Provide? k* DTS Packsgss Microsoft OLE Ш Provide? k* Ыетд Sefvka* Microsoft OLE DO Piovtetef io* Шя/Ш РиЫгЫщ Hbosoft OLE 0B ftovkb Ш 0D8C Driver* МсюиЙ OLE 08 Provider Ш GUM3 Services Nictosolt 0L£ D8 Provider tot 0?«de OLE DB Rovider for Mscfoso^ Directoy SQL Setves DTS Flat Re OLE DS Provider V$£E УтШщ £n!istme^ Vtowgm Pfo:^ Date Source OK' ,tr>SQLS«ve*d*i« нашего примера потребуется образец БД Northwind, поэтому изменять установки нет необходимости. Однако если возник- нет необходимость использовать какую-либо другую систему базы данных, то придется вернуться назад к вкладке Provider (см. рис. слева) и выбрать провайдер, который подходит для вашей базы данных. 486 Глава 18 Щелкнув мышью на вкладке Provider, вы получите перечень провайдеров, ин- сталлированных на системе. Поскольку нам необходим провайдер SQL Server, ис- пользуемый по умолчанию, то следует просто нажать кнопку Next». В настоящей главе будет использоваться SQL Server/MSDE н образец БД Northwind. Если же потребуется использовать какую-либо другую базу данных, то для этого просто выберите какой-либо подходящий для системы вашей базы данных провайдер OLE DB (например, для установления соединения с БД Access следует выбрать провайдер Microsoft Jet). Однако не следует путать эти провайдеры с провайдерами данных .NET. Data Link не позволяет выбирать провайдеры данных .NET, поэтому нам придется использовать провайдер данных OLE DB даже для SQL Server. VS, однако, оказывается в состоянии распознать, что соединение устанавливается с базой данных SQL Server, и создает объект sqicoanection самостоятельно. Щелкнув мышью на кнопке Next», мы вернемся обратно к вкладке Connection. Здесь потребуется задать всю информацию, необходимую VS для установления со- единения с БД. Во-первых, необходимо либо ввести имя сервера, на котором ин- сталлирован SQL Server или MSDE, либо выбрать его из раскрывающегося списка. Далее необходимо указать учетную запись пользователя, которую вы хотите ис- пользовать для установления соединения с базой данных. Если вы воспользуетесь пунктом Use Windows NT Integrated Security (использование объединенной системы безопасности Windows NT), то VS попытается установить соединение с БД с той же самой учетной записью, которую вы использовали для регистрации в Windows. Если для установления соединения с вашим SQL Server вы хотите воспользоваться другим именем пользователя и па- ролем, то необходимо выбрать следующую возможность — Use a specific username and password (использование за- данного имени пользователя и пароля) и ввести необходи- мую информацию в соответствующие окна. По умолчанию при использовании как MSDE, так и SQL Server инстал- лируется пользователь с именем sa и пустым паролем. Наконец, выберите БД Northwind из раскрывающегося списка Select the database on the server (выбор БД на сер- вере). Если вы используете MSDE, a Northwind в списке отсутствует, то следует обратиться к приложению В за по- дробным описанием импорта требуемой базы данных. После ввода всей необходимой информации, щелкните мышью на кнопке Test Connection (проверочное соедине- ние). Если будет выведено диалоговое окно с сообщением: "Тестовое соединение установлено." (см. рис. справа), то соединение установлено. Provider СоплесЬоп j AcVa'wed j Ali j Spec<fy the foiioivlog lo ео-ялес* ?o SOL Sewer da?, 1. Sekct с* &Ш <s «sv« rwrrw: SI ' 2 Ert.: . 03 or to the ;er»'ef <" Use Window; MI trtegiated security ':, Server Explorer % m j Data Connections ЁЬ «lAWSLMorthwind.dbo Database Diagrams Tables Щ- Eh Sfe f±b f|p Stored Procedures k Servers Примите наши поздравления — вы успешно установили свое первое соединение ADO.NET с базой данных! Теперь его можно увидеть — оно расположено непосредственно под Data Connections в Server Explorer (см. рис. слева). Мы-получили доступ к базе данных и ко всем хранящимся в ней данным даже не выходя из VS! Теперь стоит ознакомиться с их структурой. Это пригодится при написании кода, осуществляющего доступ к данным, чем мы будем заниматься в следующей главе. Доступ к данным пользователя 487 Таблицы и 0ТИ01Ш ., ы щ ных Войдите в Server Explorer и откройте узел Tables (таблицы), который находится под только что добавленным соединением. Теперь можно уви- деть список таблиц, имеющихся в базе данных (см. рис. справа). Реляционные базы данных, к которым относятся SQL Server и Oracle, хранят данные в виде последовательности связанных между собой таб- лиц. Эти таблицы состоят из строк и столбцов;, каждая строка представ- ляет собой запись, хранящуюся в базе данных, а каждый столбец представляют собой отдельные поля каждой записи. Для того чтобы по- лучить наглядное представление об этой структуре, щелкните правой кнопкой мыши на узле Customers (потребители) в Server Explorer и вы- берите пункт Retrieve Data from Table (извлечение данных из таблицы). •: Q -f П л О •: D '• U "•"• О л; D ^ D •. С "<• П С и ••£ огк-е rCus t о merOerao Customer -OemugrapHc* Гщ)1и.1в1 Er^ptoyeeTe; Tories Of cfer Details Order* Products Ш К 1 Stfcpcrs а LLL 1 z <i ЖШ AMATR ANTON AROUT BERGS BUU5 6C-LID E.ONAP 6CTT!*: SSBEV CACTU СЕЛГГС CHOPS CCMf-'U CCNSH DRACD Alfred-; Futterkisfce Ana lu i ! i pa • !<>,'.•" . ч '• AfKon •: M J • :•- •. T ->queria Around the Horn Bergkr.cis ^^S* zp Don app' Bottom 'У/-У, Markets Cf. Beverages Ccc^,? CDrnidas ээга iev^r СсЫго cofftercia! Moctezuma Chop-susy Ch:'n«ss Comerdo Wneiro : Consolidated Holdings Otus-ht. iblui Dcukatessen M ^ ki Anders АГЙ TrujiliO Antonio Moreno "hc-nvj? Hardy Cbistins Eergfund Hanrvj Moos Martih Sornmer Lauience Lebihan . Elizabeth Lincoln 1 Victoria Asbwofth Petrki-o Simpson Francisco Chang Vat.g Wdng Pedro Afonso Elaabeth Brown Svers Ottlieb Owner '; Owner S^les Repre$sntaUve Orcf«:: Ad" rastretor Sales Rupr-;5eot-,t-ve : Ower : Owner Accounting Мзпедвг 5.^'e> Represent:ativt :: Sales Agent" i Martet«i9 Manager ; Owner Soies Associate Х-У5 Rep e^entetjve Order Administrator *-! Avdo. deia СоГ Mot3d«r05 231 . 120 Hanover S( Foisterstr. 57 ' * > Л s^< j i ^ * i ; - i - ' E i r - ^ r ' •"••• •- J f e t r • . С/ Агас,Ы, 6? 12, rue de у few 23 T<;owos5en 1 f:.J vui-^rOy CirC : Cerrito 333 HauptsL''. 29 1 Av, cio§ Lusi'a^ i Berkeley Garde j W^serwegZl >] I D к Servers Это приведет к тому, что VS загрузит и выведет на экран данные, хранящиеся в таблице Customers нашей базы данных Northwind (см. рис. слева). Использующаяся в качестве образца база данных Northwind содержит данные о вымыш- ленном торговце продуктами питания, снабжающем различ- ные рестораны и продовольственные магазины. В таблице customers хранится подробное описание каждого такого потребителя. Каждая строка этой таблицы соответствует отдельной компании, которую снабжает продуктами Northwind, а каждый столбец содержит конкретную информацию об этой компании: название компании, ее адрес, а также имя и должность лица, через которого осуществляет- ся контакт с данной компанией. Каждая строка таблицы определяется уникальным пятисимвольным идентифи- кационным кодом, который хранится в поле Customers ID. ЭТОТ код известен под названием основного ключа и является жизненно важным с точки зрения установ- ления отношений между таблицей customers и другими таблицами в базе данных. Для того чтобы увидеть, как это работает, щелкните правой кнопкой мыши на узле Orders (заказы), и снова выберите пункт Retrieve Data from Table, на экран будет выведена необходимая нам таблица (см. рис. справа), в которой представлены за- казы, полученные компа- нией Northwind. Каждая строка соответствует одному заказу. Заметьте, что в таб- лице также присутствует поле customeriD, содержа- щее те же пятисимвольные идентификационные коды, ЧТО И В таблице Customers. OrderiO •таи 10331 Ш332 10333 10534 1.0335 10336 10337 1033S 10339 10340 10341 10342 10343 1034* 10345 Ш346 . . . . . Т.Си IILA5 BONAP MERE? WARTH У 1С ТЕ HUNGO ршЙ1 FRANK OLDWO fMEREP BCNAP SIMOB FRANK 5LEHMS WHITC : QUICK " jRATTC ;3 з "1Л"л"**'^1а ;5 fi _ s ' ••••••••••••• иЙ fi if 1У' ':4 4 .12 •Г j-c ; 16/11/1994 16/11/1994 17/11/1994 J8/H/J994 2 : / i i / : •;?-} 22/11/1994 23/11/1994 24/11/1994 25/11/1994 23/11/199^ 29/11/1994 29/11Л 59-. 30/15/1994 i 01/12/1994 02/1Z/1994 05/12/19^ 06/12/1994 JRequiredDaie H/12/1994 23/12/1994 29/12/1994 16/12/1994 19/12/1994 120/12/1994 21/12/1994 22/12/1994 гз.аг/1994 26/12/1994 27/12/199^ 27/12/1994 :14/12/1994 29/12/1994 30/12/1994 ;Q2/01/1995 •17/01/1995 • ^ J D 5 ^ Ж 1 28/11/1994 ;21/11/1994 | ;21/П/1994 j 25/П/1994 : j [28/11/1994 : 24/11/1994 ,.: 25/11/1994 : ! 29/11/1994 ; 29/n/1994 \ 05/12/1994 j 09/12/1S94 j 06/12/1994 ' i 05/12/1994 j 07/12/1994 j 06/12/1994 12/12/1994 . j 09/12/1994 Yj , : ..•:'.... •'..'.....^Jl:.'iJ 488 Глава 18 Orders Products Region Shippers Add dose Help Выберите все представленные в списке таблицы и щелкните мышью на кнопке Add. Затем щелкните мышью на кнопке Close и закройте диалог Add Table (добавление таблицы). После этого VS создаст диаграмму, в ко- торой будут изображены все заданные табли- цы и отношения между ними (см. рис. справа). Если вы используете MSDE U импортируете БД Northwind с использованием мастера Import and Export Data (импорт и экспорт данных), то на диаграмме не будут отражены отношения между таблицами, поскольку мастер не импортирует информацию об основных и внешних ключах. Для того чтобы получить на экране изоб- ражение всей диаграммы целиком, щелкните правой кнопкой мыши на каком-либо неза- нятом участке диаграммы и выберите пункт Zoom | То Fit из открывшегося меню. Хотя в этом случае, возможно, вы не сможете Значения, находящиеся в этом столбце, используются в качестве указателя на соответствующую строку в таб- лице Customers, в которой может быть найдена дополни- тельная информация о конкретном заказчике. Такой столбец известен под названием внешнего ключа. В VS предусмотрен инструмент, позволяющий пред- ставлять эти взаимоотношения в рамках базы данных между основными и внешними ключами в виде диаграм- мы. Для того чтобы вывести диаграмму на экран, щелк- ните правой кнопкой мыши на узле Database Diagrams (диаграммы базы данных) соединения Northwind в Server Explorer и выберите пункт New Diagram (новая диаграм- ма). После, этого VS выведет окно (см. рис. слева) — запрос относительно того, какие таблицы мы желаем включить в диаграмму. * 1 1 : . . . . . . . •• 1 а. ,:.. прочесть все названия столбцов! Отношения представлены в виде линий, соединя- ющих таблицы, причем на обоих концах линий имеются символы. Изображение ключа, расположенное рядом с таблицей, свидетельствует о том, что основной ключ данной таблицы относится к внешнему ключу таблицы, находящейся на дру- гом конце линии. Значок бесконечности обозначает внешний ключ, который соот- ветствует основному ключу соответствующей таблицы. Вы, однако, покупали VS не для того, чтобы использовать ее в качестве клиент- ской части своей базы данных, поэтому познакомимся с тем, каким .образом можно использовать установленное соединение из программ, написанных на С#! Доступ к данным пользователя 489 Осуществление доступа к базе данных из приложения Вернитесь назад к окну разработки формы в проекте chi8Ex0i, добавьте в него текстовое окно и надпись и измените свойства этих объектов в соответствии с таблицей справа. Управляющий Свойство элемент Значение Cusfcomei ID Form Textbox Label Name Text Name Text Name Text frmMain Data_Examplel txtCustID (пусто) lblCustID Customer ID Окончательный результат должен выглядеть приблизительно так, как показано на рисунке слева. Теперь добавим в проект соединение с базой данных. Откройте окно Toolbox (см. рис. справа) и выберите раздел Data. В этом меню выводятся все доступные управляющие элементы, позволяющие работать с данными. Существуют отдельные Объекты DataAdapter, Connection И Command ДЛЯ провайдеров SQL Server и OLE DB. Для объектов SQL Server использует- ся префикс sqi, а объекты OLE DB начинаются с oieDb. В данном случае, так как мы осуществляем доступ к БД SQL Server, будет использоваться провайдер SQL Server. Щелкните мышью два раза на sqiDataAdapter — откроется диалоговое окно мастера настройки конфигурации адаптера данных. ; Choose Your Date* Connection ГЬ$ &ia 4d**« N I ж Site queries using this eonntcSar» to bud onti update date. Chooje ban ihe ! :t of da\» cwncciion* o > : ^% h Suvcs bffote* o; add а r«w СОГЛФСЙСЛ Which dala connection should the <I«*U» «xiotw Toolbox Data I 1^ Pointer ^ OleDbDataAdopier l.^. O'eDbConr-ectior. ^•5 OteObCommand • Щ SqiDataAdapter -: j|' SqlCcnnection ^ SqJCommand Clipboard Ring_ General Мастер настройки конфигурации адаптера данных Появившись на экране, мастер настройки конфигурации адаптера данных задаст во- прос: какое из соединений с базами данных вы хотите использовать (см. рис. слева). 490 Глава 18 C h o o s e tt Q u e r y T y p e Th Ш Ы$ uses SQL H*tm*vtt How <h*ad rhe do;o adorer ac«*»s «he database? ^ UseSQLtMomenU . ЦЛттМ end Dt • b f ^ V ): due f Usee; • j,^ SQL-операторов). Эта опция делает возможным применение команд, напи- санных на Structured Query Language (SQL — структурированный язык за- просов (не путать с SQL Server!)), для определения данных, которые требует- ся извлечь. SQL — это специальный язык, используемый для работы с ре- ляционными базами данных. Нажмите кнопку Next>, чтобы пе- рейти к диалоговому окну для ввода SQL-оператора, с помощью которого будут извлечены необходимые данные (см. рис. справа). Однако совершенно не обязательно вводить SQL-оператор самостоятельно — это можно пору- чить VS. I - ' ' f ; | V*t4 ,•; j РиГ)СЬ0Г»5 j Categories CustomerCus tome r D emo EmployeeTerritories Order Datais Orders dippers uppiiers yscoiumns :-. f Есть единственное настроенное соедине- ние с базой данных (настроенное ранее для доступа к базе данных Northwind), поэтому только оно и оказывается доступным в списке соединений. Если до настоящего момента ни одного соединения не установлено, т. е. воз- можность выбрать New Connection... (новое соединение) и создать его прямо, здесь. В следующем окне (см. рис. слева) мастер запрашивает, как мы будем определять дан- ные, которые требуется извлечь: Выберите для нашего примера в диалого- вом окне, представленном на рисунке слева, опцию Use SQL Statements (использование i Data Adapter СопПошчй Generate the SQL statements The Select ttetMnoi* v, | bt used tocre^e the insert Update and Delete statement*. p£ in your SQL Seiec! йМЩЩШ Щ ЩЩ ЩШШ д /h^t data should the data adaplei lond in to. ( .: Для того чтобы построить SQL-оператор с помощью VS, в том же диалоговом окне, в котором можно ввести оператр вручную, щелкните мышью на кнопке Query Builder... (построение запросов), расположенной в пра- вом нижнем углу окна. Откроется диалоговое окно Add Table (см. рис. слева), с которым мы уже знакомы. Доступ к данным пользователя 491 Теперь нам представлен список таблиц, хранящихся в базе данных Northwind. Выберите из него таб- лицу Customers. Щелкните мышью на кнопке Add. На экране появит- ся диалоговое окно Query Buiider, представленное на рисунке слева. Добавьте нашу таблицу customers в Query Builder, а затем щелкните мышью на кнопке Close. Теперь у нас появилась возможность вы- бирать отдельные столбцы в таб- лице Customers. Структурированный язык запросов На данном этапе необходимо сделать несколько пояснений, касающихся SQL. Как мы уже отмечали ранее, SQL (допускаются различные варианты произноше- ния — либо "сиквел", либо "эс-кью-эль" ~ на ваше усмотрение) — это язык, ис- пользующийся для работы с базами данных, SQL позволяет создавать команды, с помощью которых можно извлекать данные из баз данных, вставлять, уничто- жать, а также редактировать данные. Более подробно язык SQL будет рассматри- ваться в следующей главе, однако в настоящий момент необходимо познакомиться с командами, которые мы будем использовать для извлечения данных из БД. Операторы SELECT имеют следующий вид SELECT столбец!, столбец2, . . . столбецх FROM table (из таблицы), например: SELECT CompanyName, ContactName FROM Customers Эта команда ПОЗВОЛЯет извлечь Значения Столбцов CompanyName И ContactName ДЛЯ Всех СТрОК таблицы Customers. Существует также возможность ограничить число извлекаемых строк, добавив в оператор SELECT посылку WHERE. Предложение WHERE позволяет задавать значе- ние конкретного столбца; в этом случае из базы данных будут извлекаться только те строки, у которых в соответствующем столбце имеется данное значение. На- пример, SELECT CompanyName FROM Customers WHERE Region = 'WA' Приведенный выше запрос позволяет извлечь названия компаний, расположен- ных вблизи Вашингтона. Вместо указания имен столбцов можно использовать символ звездочки. Это по- зволит получить все столбцы, имеющиеся в таблице. Например: SELECT * FROM Customers Этот оператор извлекает всю таблицу customers целиком. 492 Глава 18 Будьте аккуратны при использовании звездочки. Хотя такая возможность является доступной и кажется весьма соблазнительной, почти все администраторы баз данных и программисты, работающие с базами данных, не советуют ею пользоваться. Использование символа * приводит к тому, что из базы данных извлекаются все столбцы, имеющиеся в данной таблице на момент выполнения запроса, а не только те, что были доступны на момент построения проекта. И если кто-нибудь добавит какие-либо поля в эту таблицу, то эти поля также будут извлекаться приложением наряду с полями, извлечение которых предполагалось изначально. Передача этой дополнительной информации может оказать существенное влияние на приложение. Генерирование SQL-onepamopa В этом примере потребуются столбцы CompanyName, ContactName И CustomerlD. Выберите ЭТИ столбцы В ОКНе Customers в Query Builder и нажмите ОК. Query Builder в этом случае создаст SQL-оператор, кото- рый показан на рисунке справа. Нажмите кнопку Next>. Адаптер данных осуществит проверку всех установок и на- строится на работу с приложением. По окончании нажмите кнопку Finish. Вы уви- дите, что в результате к форме были добав- лены Два НОВЫХ Объекта — SqlDataAdapter И SqlConnection (см. СЛед. рис.). i Data Adapter Conflow Generate the SQL statements The $«tod dateiww* wl be m$4 Ь eiMtt Ш Ы&К Update. Delete &ta*e&*ertfs. Type tn \ -; Q'M SELECT FRON Advanced Option:... j r! J чВаск | [ ш щ У' \ ' ••••••••• ••: sqID.ataAaapterl sqlConnectionl..- В адаптере данных содержится основная информа- ция о данных, которые мы хотим получить из БД. Адап- тер данных можно представить себе в качестве мостика, соединяющего объект DataSet с базой данных. Адаптер данных, являющийся одним из компонентов провайдера данных .NET, используется ддя наполнения объекта Data- Set данными, полученными из базы данных, а также для отсылки всех изменений, сделанных в DataSet, обратно в базу данных. В объекте SqlConnection содержится вся информация, необходимая ADO.NET для установления со- единения с базой данных. Теперь, когда мы располагаем адаптером и установлен- ным соединением с базой данных, нам потребуется объект DataSet, что позволит работать с данными внутри прило- жения. Щелкните правой кнопкой мыши на только что созданном объекте sqiDataAdapteri и выберите опцию Generate Dataset... (создание объекта DataSet). В появив- шемся в результате этого диалоге (см. рис. справа) предо- ставлена возможность выбора: можно либо привязать адаптер данных к уже существующему объекту DataSet, либо создать новый. '251 UvR includes tic* i oc-:..;! .3d.5ta.s-2t: QjpG Q 5 v vs t < x? Q-s^ ', , . . л ; ^ < th» dv.a..-et to У Доступ к данным пользователя 493 Solution ШЗЕхОГ (1 project) f p ChlBEnOl ЦЦ References fi| AssemblyInfccs Щ dsCustomers«xsd EH FormLcs В нашем примере мы создадим новый объект DataSet. Посколь- ку у нашего проекта не имеется ни одного объекта DataSet, опция New (новый) будет выбрана по умолчанию. Измените имя создавае- мого объекта DataSet на dsCustomers И нажмите ОК. Теперь появляется новый объект — DataSet — вслед за соеди- нением и адаптером данных. Вы могли не заметить изменения в Server Explorer. Посмотрите внимательнее, в проекте добавлен новый файл с именем dsCustomers.xsd (см. рис. слева). Названный файл представляет собой схему объекта DataSet. XSD-схема (XML Schema Definition — определение схемы XML) представляет собой документ, с помощью которого можно проверить правильность структуры XML-документа. XML — это текстовый формат, использующийся для представления данных, важ- ность которого существенно возросла, в частности, в связи с распространением Интернета. XML и XSD-схемы будут рассматриваться в последнем разделе этой главы. Схема представляет весьма важный инструмент, использующийся ADO.NET, поскольку, организация и структурирование данных, выполняемые DataSet за ку- лисами, предполагают использование XML. Этот файл генерируется Visual Studio автоматически; в нем задается структура набора данных, все таблицы и все отно- шения между таблицами. Поскольку объект DataSet уже создан, то мы получаем возможность привязать текстовое окно формы к данным, извлеченным из базы данных. Щелкните мышью на текстовом окне txtcustiD, а затем прокрутите свойства этого окна до подразде- ла DataBindings. ЕСЛИ Щелкнуть МЫШЬЮ на сеКЦИИ Text внутри DataBindings, TO можно увидеть комбинированное окно, в котором находится dsCustomersi и все столбцы, имеющиеся в таблице. Выбрав в этом окне произвольный столбец, можно привязать соответствующее поле к этому текстовому окну. Это всего лишь означа- ет, что по мере прокрутки набора данных значения, находящиеся в этом столбце, выводятся в этом окне. Все изменения, которые пользователь вносит в текстовое окно, отображаются также и в объекте DataSet. Объект DataSet не поддерживает постоянного соединения с источником данных; отсюда следует, что сам по себе этот источник не будет обновляться — до тех пор, пока мы не направим с этой целью соответствующий запрос. В данном примере мы хотим привязать тек- стовое ОКНО К СТОЛбцу CustomerlD; ДЛЯ ЭТОГО следует выбрать CustomerlD в комбинирован- ном окне (см. рис. справа). Если теперь вы сохраните и запустите свой проект, то увидите пустое текстовое окно. По- чему это так? Разве те данные, с которыми мы работали на протяжении нескольких предшест- вующих страниц не должны оказаться в нашем распоряжении? Если отвечать на этот вопрос коротко, то нет, не должны. Не следует забывать, что до настоящего момента мы занимались лишь описанием той структуры, которую, как мы предпо- лагаем, будут иметь данные, извлекаемые из таблицы. Мы пока ни разу не попы- тались описать реальные данные, кроме того, мы пока не давали команды приложению считывать какие-либо данные. Для этого потребуется включить в пример определенный код (на самом деле, это лишь малая часть из тех строк кода, который будет использоваться в данной главе). Нам необходимо приказать адаптеру данных наполнить объект DataSet. Щелк- ните мышью дважды на пустом месте формы. После этого вы окажетесь в диалоге dsCustomersi Й"'Ор Customers 1 [ f j CompanyName М П ContactName X None zl 494 Глава 18 редактирования кода, а курсор будет находится внутри обработчика события "за- грузка формы". Введите в этот обработчик событий следующий код: private void frraMain_Load(object sender, System.EventArgs e) // Наполнение набора даннь!хданнь1ми/: х //в базе данных Northwind в таблице "Customers" this vsqlDbDat a Adapter! .Fill (this .dsCustomersl, 1, 0 , "Customers"} ; Customer ID В этих строках происходит обращение к методу Fill о адаптера данных. Этот метод осуществляет наполнение объекта DataTabie, находящегося внутри DataSet, данными, полученными от источника данных. Этому методу передаются четыре параметра. Первый параметр — это объект DataSet, который мы собираемся на- полнять, в данном примере — это набор данных dsCustomeri. Во-вт
|