Свойства, методы и события класса OleDbConnection
Лабораторная работа 8. Работа с базой данных
Компоненты для связи с БД
Провайдеры
Поставщик данных для приложения (Провайдер) – объект, предназначенный для обеспечения взаимодействия приложения с хранилищем информации (базами данных).
Естественно, приложению нет никакого дела до того, где хранится и как извлекается потребляемая приложением информация. Для приложения источником данных является тот, кто передаёт данные приложению. И как сам этот источник эту информацию добывает – никого не касается.
Источник данных (Data Provider) – это набор взаимосвязанных компонентов, обеспечивающих доступ к данным. Функциональность и само существование провайдера обеспечивается набором классов, специально для этой цели разработанных.
ADO.NET поддерживает два типа источников данных, соответственно, два множества классов:
§ SQL Managed Provider (SQL Server.NET Data Provider) - для работы с Microsoft SQL Server 7.0 и выше. Работает по специальному протоколу, называемому TabularData Stream (TDS) и не использует ни ADO, ни ODBC, ни какую-либо еще технологию. Ориентированный специально на MS SQL Server, протокол позволяет увеличить скорость передачи данных и тем самым повысить общую производительность приложения.
§ ADO Managed Provider (OleDb.NET Data Provider) - для всех остальных баз данных. Обеспечивает работу с произвольными базами данных. Однако за счет универсальности есть проигрыш по сравнению с SQL Server Provider, так что при работе с SQL Server рекомендовано использовать специализированные классы.
В следующих разделах приводится описание составных элементов провайдера.
Connection
Объект-представитель класса Connection представляет соединение с источником (базой) данных и обеспечивает подключение к базе данных. Visual Studio.NET поддерживает два класса:
§ SQLConnection (обеспечивает подключение к SQL Server 7.0 и выше),
§ OleDbConnection (обеспечивает подключение к прочим вариантам БД).
Компонента Connection (независимо от того, представителем какого класса она является) имеет свойство ConnectionString, в котором фиксируется вся необходимая для установления соединения с БД информация. Кроме того, поддерживается ряд методов, позволяющих обрабатывать данные с применением транзакций.
Свойства объекта Connection позволяют:
§ задавать реквизиты пользователя,
§ указывать расположение источника данных.
Методы объекта позволяют управлять соединением с источником данных.
В процессе соединения с помощью объекта-представителя класса OleDbConnection (аналогично SQLConnection) создаётся и инициализируется соответствующий объект с использованием одного из вариантов конструктора и строки соединения.
Формирование строки и последовательность действий при инициализации объекта соединения – дело техники. Главное – это чтобы свойство ConnectionString в результате получило бы ссылку на строку символов, содержащую необходимую для установления соединения информацию.
Свойства, методы и события класса OleDbConnection
Свойства.
ConnectionString | string | Строка, определяющая способ подключения объекта к источнику данных. |
ConnectionTimeout | Int32 | Интервал времени, в течение которого объект пытается установить соединение с источником данных (только для чтения). |
Container | string | Gets the IContainer that contains the Component. |
Database | string | Gets текущей базы данных или базы, которая использовалась после установления соединения. |
DataSource | string | Gets the server name or file name of the data source. Всё зависит от того, с каким хранилищем информации ведётся работа. Серверное хранилище данных (SQL Server, Oracle) – имя компа, выступающего в роли сервера. Файловые БД (Access) – имя файла. |
Provider | string | Gets имя OLE DB провайдера, которое было объявлено в "Provider= …" clause строки соединения. |
ServerVersion | string | Gets a string containing the version of the server to which the client is connected. |
Site | string | Gets or sets the ISite of the Component. |
State | string | Gets текущее состояние соединения. |
Текущее состояние соединения кодируется как элемент перечисления ConnestionState. Список возможных значений представлен ниже.
Имя члена | Описание | Value |
Broken | The connection to the data source is broken. Подобное может случиться только после того, как соединение было установлено. A connection in this state may be closed and then re-opened. (This value is reserved for future versions of the product.) | |
Closed | Соединение закрыто. | |
Connecting | The connection object is connecting to the data source. (This value is reserved for future versions of the product.) | |
Executing | The connection object в процессе выполнения команды. (This value is reserved for future versions of the product.) | |
Fetching | Объект соединения занят выборкой данных. (This value is reserved for future versions of the product.) | |
Open | Соединение открыто. |
Открытые методы
BeginTransaction | Перегружен. Начинает транзакцию базы данных. |
ChangeDatabase | Изменяет текущую базу данных для открытого OleDbConnection. |
Close | Закрывает подключение к источнику данных. Это рекомендуемый метод закрытия любого открытого подключения. |
CreateCommand | Создает и возвращает объект OleDbCommand, связанный с OleDbConnection. |
CreateObjRef (унаследовано от MarshalByRefObject) | Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для коммуникации с удаленными объектами. |
Dispose (унаследовано от Component) | Перегружен. Освобождает ресурсы, используемые объектом Component. |
EnlistDistributedTransaction | Зачисляет в указанную транзакцию в качестве распределенной транзакции. |
Equals (унаследовано от Object) | Перегружен. Определяет, равны ли два экземпляра Object. |
GetHashCode (унаследовано от Object) | Служит хеш-функцией для конкретного типа, пригоден для использования в алгоритмах хеширования и структурах данных, например в хеш-таблице. |
GetLifetimeService (унаследовано от MarshalByRefObject) | Извлекает служебный объект текущего срока действия, который управляет средствами срока действия данного экземпляра. |
GetOleDbSchemaTable | Возвращает сведения схемы из источника данных так же, как указано в GUID, и после применения указанных ограничений. |
GetType (унаследовано от Object) | Возвращает Type текущего экземпляра. |
InitializeLifetimeService (унаследовано от MarshalByRefObject) | Получает служебный объект срока действия, для управления средствами срока действия данного экземпляра. |
Open | Открывает подключение к базе данных со значениями свойств, определяемыми ConnectionString. |
ReleaseObjectPool | Статический. Означает, что пул объектов OleDbConnection может быть освобожден, когда последнее основное подключение будет освобождено. |
ToString (унаследовано от Object) | Возвращает String, который представляет текущий Object. |
Защищенные методы
Dispose | Перегружен. Переопределен. Освобождает ресурсы, используемые объектом OleDbConnection. |
Finalize (унаследовано от Component) | Переопределен. Освобождает неуправляемые ресурсы и выполняет другие действия по очистке, перед тем как пространство, которое использует Component, будет восстановлено сборщиком мусора. В языках C# и C++ для функций финализации используется синтаксис деструктора. |
GetService (унаследовано от Component) | Возвращает объект, представляющий службу, которую предоставляет Component или его Container. |
MemberwiseClone (унаследовано от Object) | Создает неполную копию текущего Object. |
События
Disposed | Adds an event handler to listen to the Disposed event on the component. |
InfoMessage | Некоторые СУБД (SQL Server) поддерживают механизм информационных сообщений. Это событие occurs when the provider sends a warning or an informational message. |
StateChange | Occurs when the state of the connection changes. |
Command
Объект Команда – стартовый стол для запуска непосредственно из приложения команд управления БД, которыми и осуществляется непосредственное управление БД. Команда в приложении обеспечивает взаимодействие приложения с базой данных, позволяя при этом:
§ сохранять параметры команд, которые используются для управления БД,
§ выполнять специфические команды БД INSERT, UPDATE, DELETE, которые не возвращают значений,
§ выполнять команды, возвращающие единственное значение,
§ выполнять команды специального языка определения баз данных DataBase Definition Language (DDL), например CREATE TABLE,
§ работать с объектом DataAdapter, возвращающим объект DataSet,
§ работать с объектом DataReader,
§ для класса SqlCommand – работать с потоком XML,
§ создавать результирующие наборы, построенные на основе нескольких таблиц или в результате исполнения нескольких операторов.
Объект Command обеспечивает управление источником данных, которое заключается:
§ в выполнении DML (Data Manipulation Langauge) запросов – запросов, не возвращающих данные (INSERT, UPDATE, DELETE),
§ в выполнении DDL (Data Definition Language) запросов – запросов, которые изменяют структуру Базы Данных (CREATE)
§ в выполнении запросов, возвращающих данные через объект DataReader (SELECT).
§ Представлен двумя классами – SqlCommand и OleDbCommand. Позволяет исполнять команды на БД и при этом использует установленное соединение. Исполняемые команды могут быть представлены:
§ хранимыми процедурами,
§ командами SQL,
§ операторами, возвращающими целые таблицы.
Объект–представитель класса Command поддерживает два варианта (варианты методов определяются базовым классом) методов:
§ ExecuteNonQuery – обеспечивает выполнение команд, не возвращающих данные, например, INSERT, UPDATE, DELETE,
§ ExecuteScalar – исполняет запросы к БД, возвращающие единственное значение,
§ ExecuteReader – возвращает результирующий набор через объект DataReader.
Доступ к данным в ADO.NET с помощью Data Provider’а осуществляется следующим образом:
§ Объект-представитель класса Connection устанавливает соединение между БД и приложением.
§ Это соединение становится доступным объектам Command и DataAdapter.
§ При этом объект Command позволяет исполнять команды непосредственно над БД.
§ Если исполняемая команда возвращает несколько значений, Command открывает доступ к ним через объект DataReader.
§ Результаты выполнения команды обрабатываются либо напрямую, с использованием кода приложения, либо через объект DataSet, который заполняется при помощи объекта DataAdapter.
§ Для обновления БД применяют также объекты Command и DataAdapter.
Итак, в любом случае, независимо от выбранного поставщика данных, при работе с данными в ADO.NET используем:
§ Connection Object – для установки соединения с базой данных,
§ Dataset Object – для представления данных на стороне приложения,
§ Command Object – для изменения состояния базы.
Способы создания объекта Command:
§ С использованием конструкторов и с последующей настройкой объекта (указание строки запроса и объекта Connection),
§ Вызов метод CreateCommand объекта Connection.
DataReader
Компонента провайдера, объект класса DataReader.
Предоставляет подключённый к источнику данных набор записей, доступный лишь для однонаправленного чтения.
Позволяет просматривать результаты запроса по одной записи за один раз. Для доступа к значениям столбцов используется свойство Item, обеспечивающее доступ к столбцу по его индексу (то есть, ИНДЕКСАТОР!).
При этом метод GetOrdinal объекта-представителя класса DataReader принимает строку с именем столбца и возвращает целое значение, соответствующее индексу столбца.
Непосредственно обращением к конструктору эту компоненту провайдера созать нельзя. Этим DataReader отличается от других компонентов провайдера данных.
Объект DataReader создаётся в результате обращения к одному из вариантов метода ExecuteReader объекта Command (SqlCommand.ExecuteReader возвращает ссылку на SqlDataReader, OleDbCommand.ExecuteReader возвращает ссылку на OleDbDataReader).
То есть, выполняется команда (например, запрос к базе данных), а соответствующий результат получается при обращении к объекту-представителю класса DataReader.
Метод ExecuteReader возвращает множество значений как ОДИН ЕДИНСТВЕННЫЙ ОБЪЕКТ – объект-представитель класса DataReader. Остаётся только прочитать данные.
Выполняется запрос, получается объект-представитель класса DataReader, который позволяет перебирать записи результирующего набора и… ПЕРЕДАВАТЬ НУЖНЫЕ ЗНАЧЕНИЯ КОДУ ПРИЛОЖЕНИЯ.
При этом DataReader обеспечивает чтение непосредственно из базы. И потому требует монопольного доступа к активному соединению. DataReader реализован без излишеств. Только ОДНОНАПРАВЛЕННОЕ чтение! Любые другие варианты его использования невозможны.
Элементы-источники данных(Data Source Controls)
Эти элементы облегчают работу с ADO.NET, инкапсулируя работу с соединениями, командами и адаптерами. Они реализуют интерфейс IDataSource, в котором определен базовый набор возможностей работы с источниками данных. Большинство этих классов предоставляют функциональность для чтения и записи. Они являются обертками объектов ADO.NET. В предыдущих версиях надо было создавать объекты ADO самим, и связывать элементы-управления с ними посредством команды DataBind. Например:
<asp:BulletedList ID="BulletedList1" runat="server" BulletStyle="Square" DataTextField="CategoryName" DataValueField="CategoryID"> </asp:BulletedList> protected void Page_Load(object sender, EventArgs e) { SqlConnection conn = new SqlConnection(@"Data Source=(local)\sqlexpress;Initial Catalog=Northwind;Integrated Security=True"); SqlCommand cmd = new SqlCommand("SELECT CategoryID, CategoryName FROM Categories", conn); SqlDataAdapter da = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); da.Fill(ds); BulletedList1.DataSource = ds; BulletedList1.DataBind(); }Теперь элементы управления связываются c элементом-источником посредством свойства DataSourceID. Любой класс – источник данных может быть связан почти с любым классом для отображения данных. Это предоставляет большую гибкость.
Всего в ASP .NET 5 элементов-источников данных: SqlDataSource, AccessDataSource и ObjectDataSource для работы с табличными источниками данных и XmlDataSource и SiteMapDataSource – для работы с иерархическими данными.
SqlDataSource позволяет соединяться с большинством реляционных СУБД. Sql в названии класса означает, что служит для соединения с базами, которые понимают язык запросов Sql, а не только с MS SQL Server.
AccessDataSource оптимизирован для работы с базами Access. Например,
<asp:AccessDataSource ID="AccessDataSource1" runat="server" DataFile="~/App_Data/guestbook.mdb" SelectCommand="SELECT [WriteDate], [UserName], [UserMail], [Message] FROM [guestbook]"> </asp:AccessDataSource>SiteMapDataSource – это специализация XmlDataSource, работает с файлами навигации по сайту и служит источником данных для элементов управления навигации.
ObjectDataSource нужен для соединения с написанными программистом бизнес-объектами.
Элементы – источники данных предназначены для двустороннего обмена данными, то есть как для чтения, так и для записи. Сами по себе они ничего не отображают. Данные будут доступны подключенным к ним элементам управления.
SqlDataSource
SqlDataSource объединяет в себе возможности SqlConnection и SqlDataAdapter(плюс дополнительные).
Итак, у нас есть строка подключения в файле web.config.
<add name="DemoBaseConnectionString1" connectionString="Data Source=(local)\SQLEXPRESS;Initial Catalog=DemoBase;Integrated Security=True" providerName="System.Data.SqlClient" />В свойство ConnectionString записывается эта строка.
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DemoBaseConnectionString1 %>" ProviderName="<%$ ConnectionStrings:DemoBaseConnectionString1.ProviderName %>" </asp:SqlDataSource>В свойстве DataSourceMode SqlDataSource задается, посредством DataReader или DataSet получаются данные. При чтении посредством DataReader некоторые возможности не поддерживаются.
Получение данных связано со свойствами, похожими на свойства SqlDataAdapter: SelectCommand, SelectCommandType, DeleteCommand, DeleteCommandType и так далее. SelectCommandType может быть 2 типов – Text и StoredProcedure. Команды выполняются, когда вызываются соответствующие методы.
Метод Select вызывается с параметром типа DataSourceSelectArguments и возвращает DataSet или IDataReader в зависимости от значения свойства DataSourceMode, остальные же методы вызываются без параметров и возвращают количество обработанных строк.
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="SELECT * FROM [Customers]" ProviderName="<%$ ConnectionStrings:NorthwindConnectionString.ProviderName %>"> </asp:SqlDataSource>Этот SqlDataSource читает все записи из таблицы Customers с помощью простого запроса в DataSet.
<asp:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="[Ten Most Expensive Products]" DeleteCommandType="StoredProcedure"> </asp:SqlDataSource>Метод Select нет необходимости вызывать явно. Он вызывается автоматически, когда связанному с SqlDataSource элементу нужны данные для отображения.
Процедуры сервера обычно имеют параметры. Поэтому предусмотрены также коллекции параметров. Сами параметры могут быть обычными или связанными с элементами управления.
Значения параметров можно получать и из других разнообразных источников.
Есть несколько классов параметров – наследников класса Parameter: CookieParameter использует значение ключа файла cookie, FormParameter - переменных формы, QuerystringParameter адресной строки, ProfileParameter профиля пользователя и SessionParameter -переменной сессии.
<asp:Parameter Name="UID" Type="Int32" DefaultValue="0" />Такой тип параметров используется, если SqlDataSource используется как источник данных для элементов с автоматическим связыванием – GridView, FormView, DetailsView. Значение параметра передается во «внутренностях» этих элементов.
В других случаях используется ControlParameter, то есть значение параметра берется из элемента управления. Также задается свойство, откуда и берется значение. Хотя если это Text, его можно не писать.
<asp:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="Sales by Year" SelectCommandType="StoredProcedure"> <SelectParameters> <asp:Parameter Name="Beginning_Date" Type="DateTime" DefaultValue="01.01.1998"/> <asp:ControlParameter Name="Ending_Date" Type="DateTime" ControlID="Calendar2"/> </SelectParameters> </asp:SqlDataSource>Источник параметра типа дата – элемент управления календарь. При заданном свойстве параметра ConvertEmptyToNull текстовый параметр конвертируется в Null, если он пустой(равен System.String.Empty).
Свойство CancelSelectOnNullParameter определяет, будет ли прерван запрос, если значение какого-либо параметра равно Null.
<asp:SqlDataSource ID="SqlDataSource4" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="SELECT * FROM [Customers] where @Country is null or Country = @Country" ProviderName="<%$ ConnectionStrings:NorthwindConnectionString.ProviderName %>" CancelSelectOnNullParameter="False"> <SelectParameters> <asp:QueryStringParameter Name="Country" QueryStringField="Country" /> </SelectParameters> </asp:SqlDataSource>Этот запрос будет брать параметр из командной строки, например
http://localhost:3457/WebSite4/CustomersByCountry.aspx?Country=UKКеширование
Кеширование нужно для увеличения эффективности работы с данными. При включенном кешировании SqlDataSource «запоминает» большое количество записей на заданное время, даже если все данные не отображаются сразу, но могут понадобиться при перелистывании. Например, студент читает первую страницу лекции, логично, что он вскоре перейдет ко второй. Если сервер хранит в оперативной памяти все страницы лекции, он их оперативно выдаст, не обращаясь к базе.
При включенном кешировании данные читаются «большим куском», а выборка записей происходит с помощью фильтрования.
В SqlDataSource кеширование и сортировка возможны только при получении данных через DataSet. Если DataSourceMode равно DataReader, а EnableCaching – True, будет выброшено исключение NonSupportedException.
Длительность кеширования можно задать в свойстве CacheDuration, это может быть определенное количество секунд или Infinite, то есть данные никогда не обновляются.
Поведение кеширования зависит от сочетания свойств CacheDuration и CacheExpirationPolicy. Если значение CacheExpirationPolicy равно Absolute, то элемент запрашивает информацию через промежутки времени, определенные в CacheDuration, а старую стирает из памяти. Если CacheExpirationPolicy равен значению Sliding, то SqlDataSource начинает отсчет времени после каждого к нему запроса. Данные из кеша устаревают, если в течение времени CacheDuration не было ни одного Select-запроса.
В FilterExpression задается выражение для фильтрации, причем формат этих выражений аналогичен тому, что используется для форматирования строк с параметрами в фигурных скобках {0}, {1}, в которые подставляются значения из источника, указанного в FilterParameters.
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="SELECT * FROM [Customers]" ProviderName="<%$ ConnectionStrings:NorthwindConnectionString.ProviderName %>" EnableCaching="True" CacheExpirationPolicy="Sliding"> </asp:SqlDataSource>У этого элемента включено кеширование, и он является источником данных для GridView.
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="SELECT * FROM [Customers]" ProviderName="<%$ ConnectionStrings:NorthwindConnectionString.ProviderName %>" FilterExpression="CustomerID=’{0}’ " <FilterParameters> <asp:ControlParameter Name="CustomerID" ControlId="GridView1" PropertyName=”SelectedValue"></asp:ControlParameter> </FilterParameters> </asp:SqlDataSource>А у этого включена фильтрация, и он является источником данных для DetailsView. Контрол DetailsView всегда отображает одну запись, при этом в данном случае эта та запись, которая выбрана в контроле GridView1.
Сортировка
В свойстве SortParameterName можно записать список полей, по которым проводится сортировка, возможно с добавлением опции Desc для сортировки в порядке убывания. Параметры передаются в команду Select, если это серверная процедура.
ObjectDataSource
Как уже было сказано, этот класс работает с бизнес-объектами. А что же это такое? Это такие классы, которые инкапсулируют логику работы с данными, нужными в приложении. Класс бизнес-объекта может быть написан на любом языке .NET. Как и все классы, он располагается в папке App_Code. ObjectDataSource работает как связующее звено между бизнес-объектами и элементами управления, отображающими данные. Получается многоуровневая компонентная архитектура. Классы бизнес-объектов могут поменять свое внутреннее представление, и это никак не отразится на страницах, которые их используют. ObjectDataSource работает во многом так же, как SqlDataSource, с той разницей, что он имеет дело не с базой данных, а с классом.
Свойство TypeName класса ObjectDataSource указывает на используемый класс. Класс бизнес-объекта должен поддерживать конструктор и 4 метода(может и больше) – для чтения, редактирования, удаления и добавления данных в источник данных. Элемент управления ObjectDataSource пользуется этими методами.
Например, свойство SelectMethod указывает на метод класса бизнес-объекта, который возвращает данные.
Откуда бизнес-объект берет данные, ему не важно. Некоторые бизнес-объекты работают с базами данных, некоторые с сессией или текстовыми файлами. Главное, что метод, который он использует для чтения, должен возвращать класс, реализующий интерфейс IEnumerable. UpdateMethod– метод, который обновляет данные. Аналогичную функцию выполняют DeleteMethod и InsertMethod.
Класс бизнеса-объект может поддерживать метод SelectCount, который возвращает общее количество объектов в источнике данных.ObjectDataSource вызывает этот метод, чтобы реализовать разбиение на страницы.
Рассмотрим это на примере:
public class Continent { ArrayList ContinentArrayList; public Continent() { ContinentArrayList = new ArrayList(); ContinentArrayList.Add("Worldwide"); ContinentArrayList.Add("America"); ContinentArrayList.Add("Africa"); ContinentArrayList. Add("Asia-Pacific"); } public ArrayList List() { return ContinentArrayList; } public int SelectCount() { return ContinentArrayList.Length; } }Даже такой примитивный класс может использоваться как источник данных для ObjectDataSource, так как ArrayList реализует IEnumerable. Вместо свойств *Command ObjectDataSource использует *Method.
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="List" TypeName=" Continent "> </asp:ObjectDataSource> <asp:RadioButtonList ID="RadioButtonList1" runat="server" DataSourceID="ObjectDataSource1"> </asp:RadioButtonList></div>Достигается тот же эффект, что и раньше, когда данные вставлялись на странице или в классе страницы, но теперь получение данных инкапсулировано в классе Continent. Класс может изменить способ получения данных, не меняя интерфейса. Чаще всего данные все-таки получают из баз данных, XML-файлов или веб-сервисов. Классы бизнес-логики могут разрабатывать одни члены команды, а заниматься дизайном страниц другие. Их можно использовать и в обычных приложениях в Windows Forms.
ObjectDataSource может работать и с типизированными наборами данных, которые можно создать с помощью мастера. Попробуем это сделать на примере таблицы Customers. Создайте в папке App_Code новый файл и в диалоге выбора типа файла выберите dataset. Назовите его Customers. Мастер предложит выбрать строку соединения. Выберите NorthWindConnectionString (если его нет в проекте, создайте, как показано в предыдущей лекции). На следующем шаге мастер предложит выбрать из трех вариантов: использование запросов SQL, создание хранимых процедур или использование готовых процедур. Выберите второе, так как готовых процедур, которые бы обновляли данные, в базе Northwind нет. На следующем шаге нужно будет создать процедуры, это можно сделать с помощью QueryBuilder, очень похожем на дизайнер запросов в MS Access. В списке таблиц выберите Customers, а в таблице несколько полей. Должен получиться запрос
SELECT CustomerID, CompanyName, ContactName, ContactTitle, Country, City FROM Customers
После этого закройте QueryBuilder и нажмите на кнопку AdvancedOptions.
Как видите, мастер предлагает сгенерировать остальные команды самому. Прекрасно, мы не против. На следующем шаге мастер предложит изменить имена процедур и увидеть, что же он сгенерировал. Через остальные шаги можно пройти без изменений.
В результате получится файл Customers.xsd, по формату – файл схемы XML(XML Schema Definition, в котором описано и создание процедур, и команды для работы с базой вместе с параметрами, и еще один маленький файл Customers.xss. После этого проект желательно скомпилировать.
Мы получили компонент данных. Все готово для связывания его с ObjectDataSource. Перетащите значок нужного класса на форму и с помощью SmartTag запустите еще один мастер. На первом шаге настройте его на CustomersDataAdapters.CustomersDataAdapter. На втором надо выбрать подходящие функции для команд Select, Update, Delete, Insert. Вариантов будет немного и Finish. Можно привязывать наш ObjectDataSource к любому подходящему элементу управления, например GridView.
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetData" TypeName="CustomersTableAdapters.CustomersTableAdapter" DeleteMethod="Delete" InsertMethod="Insert" OldValuesParameterFormatString="original_{0}" UpdateMethod="Update"> <DeleteParameters> <asp:Parameter Name="Original_CustomerID" Type="String" /> </DeleteParameters> <UpdateParameters> <asp:Parameter Name="CustomerID" Type="String" /> <asp:Parameter Name="CompanyName" Type="String" /> <asp:Parameter Name="ContactName" Type="String" /> <asp:Parameter Name="ContactTitle" Type="String" /> <asp:Parameter Name="Country" Type="String" /> <asp:Parameter Name="City" Type="String" /> <asp:Parameter Name="Original_CustomerID" Type="String" /> </UpdateParameters> <InsertParameters> <asp:Parameter Name="CustomerID" Type="String" /> <asp:Parameter Name="CompanyName" Type="String" /> <asp:Parameter Name="ContactName" Type="String" /> <asp:Parameter Name="ContactTitle" Type="String" /> <asp:Parameter Name="Country" Type="String" /> <asp:Parameter Name="City" Type="String" /> </InsertParameters> </asp:ObjectDataSource> <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="CustomerID" DataSourceID="ObjectDataSource1"> <Columns> <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" ShowSelectButton="True" /> <asp:BoundField DataField="CustomerID" HeaderText="CustomerID" ReadOnly="True" SortExpression="CustomerID" /> <asp:BoundField DataField="CompanyName" HeaderText="CompanyName" SortExpression="CompanyName" /> <asp:BoundField DataField="ContactName" HeaderText="ContactName" SortExpression="ContactName" /> <asp:BoundField DataField="ContactTitle" HeaderText="ContactTitle" SortExpression="ContactTitle" /> <asp:BoundField DataField="Country" HeaderText="Country" SortExpression="Country" /> <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" /> </Columns> </asp:GridView>Класс бизнес-объекта создается неявно. Из файла .xsd vожно получить класс типизированного набора данных на языке C# с помощью утилиты xsd.exe.
xsd.exe /dataset /language:CS Customers.xsd.Из одного класса могут получать данные разные элементы ObjectDataSource. В приложении Personal Starter Kit определен класс PhotoManager, который работает с базой данных Personal.mdf.
public static Stream GetPhoto(int photoid, PhotoSize size) { using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Personal"].ConnectionString)) { using (SqlCommand command = new SqlCommand("GetPhoto", connection)) { command.CommandType = CommandType.StoredProcedure; command.Parameters.Add(new SqlParameter("@PhotoID", photoid)); command.Parameters.Add(new SqlParameter("@Size", (int)size)); bool filter = !(HttpContext.Current.User.IsInRole("Friends") || HttpContext.Current.User.IsInRole("Administrators")); command.Parameters.Add(new SqlParameter("@IsPublic", filter)); connection.Open(); object result = command.ExecuteScalar(); try { return new MemoryStream((byte[])result); } catch { return null; } } }В этой функции полезно для усвоения получение двоичной информации, например, изображений, из базы данных.