Книга: C# для профессионалов. Том II

Соединение с базой данных

Соединение с базой данных

Два элемента управления, которые мы хотели бы связать с данными, — attendeeList и roomList. Чтобы сделать это, мы должны задать свойства DataSource этих элементов управления как таблицы, содержащие данные. Код должен загрузить данные в эти таблицы и выполнить соединение. Оба эти элемента управления имеют также свойства DataTextField и DataValueField, которые определяют, какие столбцы использовать для вывода элементов списка и задания свойств value, соответственно. В обоих случаях можно задать эти свойства во время проектирования как Name и ID, что будет использоваться, как только задается свойство DataSource для заполнения элементами списка элемента управления.

Теперь мы можем сделать это в построителе форм Web. Удалите существующие записи из кода ASP.NET для этих элементов управления. Теперь что объявления будут выглядеть следующим образом:

...
<asp:dropdownlist runat="server" width="160px" datatextfield="Room" datavaluefield="ID" / >
...
<asp:listbox runat="server" width="160px" selectionmode="Multiple" rows="6" datatextfield="Name" datavaluefield=" " >

Следующая задача состоит в создании соединения с базой данных. Существует несколько способов это сделать. Как мы видели в главе ADO.NET ранее, обычно для создания нового соединения используется окно Server Explorer. Так как мы работаем с Access, то тип провайдера для этого соединения будет Microsoft Jet 4.0 OLE DB Provider. Когда это будет задано в окне сервера, мы сможем перетащить соединение на форму Web, что добавит объект Data.OleDb.OleDbConnection к форме с именем oleDbConnection1:

public class WebForm1: System.Web.UI.Page {
 ...
 protected System.Data.OleDb.OleDbConnection oleDbConnection1;

Для соединения SQL Server будет добавлен объект SqlClient.SqlConnection.

В метод InitializeComponent() также добавится код для задания свойства ConnectionString формы oleDbConnection1, таким образом все будет готово для использования в коде.

Мы хотим выполнить соединение данных в обработчике событий Page_Load(), так что элементы управления будут полностью заполнены, когда мы захотим использовать их в других частях кода. Приступаем к считыванию данных из базы данных, независимо от того, выполняется ли в данный момент операция обратной отправки (даже если элементы управления списком будут сохранять свое содержимое с помощью viewstate), чтобы гарантировать, что мы имеем доступ ко всем данным, которые могут понадобиться, хотя нам и не нужно выполнять само соединение данных при обратной отправке. Это может показаться слегка расточительным, но читатель при желании может в качестве упражнения добавить дополнительную логику к коду для оптимизации такого поведения. Здесь мы сосредоточимся на том, как заставить все работать, не входя в практические детали.

Весь наш код будет помещен между вызовами методов Open() и Close() нашего объекта соединения:

private void Page_Load(object sender, System.EventArgs e) {
 validationSummary.Enabled = false;
 foreach (System.Web.UI.WebControls.WebControl validator in this.Validators) {
  validator.Enabled = false;
 }
 oleDbConnection1.Open();
 if (!this.IsPostBack) {
  calendar.SelectedDate = System.DateTime.Now;
 }
 OleDbConnection1.Close();
}

Мы вскоре увидим, почему задание данных календаря оставлено внутри этого кода проверки обратной отправки.

Для обмена данными нам необходимо использовать несколько объектов хранения данных. Мы можем объявить их на уровне класса, чтобы мы имели к ним доступ из других функций. Нам понадобится объект DataSet для хранения информации базы данных, три объекта OleDb.OleDbDataAdapter для выполнения запросов на множестве данных и объект DataTable хранения событий для последующего доступа. Они объявляются следующим образом:

public class WebForm1 : System.Web.UI.Page {
 ...
 protected System.Data.DataSet ds;
 protected System.Data.DataTable eventTable;
 protected System.DataOleDb.OleDbDataAdapter daAttendees;
 protected System.DataOleDb.OleDbDataAdapter daRooms;
 protected System.Data.OleDb.OleDbDataAdapter daEvents;

Существуют версии SQL Server всех объектов OLE DB, и их использование идентично.

Теперь для Page_Load() надо создать объект DataSet:

private void Page_Load(object sender, System.EventArgs e) {
 ...
 oleDbConnection1.Open();
 ds = new DataSet();

Затем мы должны присвоить объектам OleDbDataAdapter запросы и соединить их с объектом соединения:

 ds = new DataSet();
 daAttendees =
  new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM Attendees", oleDbConnection1);
 daRooms =
  new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM Rooms", oleDbConnection1);
 daEvents =
  new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM Events", oleDbConnection1);

Затем мы выполняем запросы с помощью вызовов Fill():

 daEvents =
  new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM Events", oleDbConnection1);
 daAttendees.Fill(ds, "Attendees");
 daRooms.Fill(ds, "Rooms");
 daEvents.Fill(ds, "Events");

Теперь переходим непосредственно к самому соединению данных. Как упоминалось ранее, это несложно и включает задание для свойства DataSource элементов управления соединением таблиц, с которыми мы хотим соединиться:

 daEvent s.Fill(ds, "Events");
 attendeeList.DataSource = ds.Tables["Attendees"];
 roomList.DataSource = ds.Tables["Rooms"];

Этот код задает свойства, но само соединение данных не произойдет, пока не будет вызван метод формы DataBind(), что мы сейчас и сделаем. Но прежде чем это сделать, заполним объект DataTable данными таблицы событий:

 roomList.DataSource = ds.Tables["Rooms"];
 eventTable = ds.Tables["Events"];

Будем соединять данные только в том случае, если нет обратной отправки, иначе происходит просто обновление данных (которые, по предположению, являются статическими в базе данных в течение выполнения запроса заказа события). Соединение данных при обратной отправке будет также стирать выбранные значения в элементах управления roomList и attendeeList. Мы могли бы сделать об этом замечание перед соединением, а затем обновить их, но проще вызвать DataBind() в существующем операторе if (причина, почему этот оператор содержался в области кода, где открыто соединение с данными):

 eventTable = ds.Tables["Events"];
 if (!this.IsPostBack) {
  calendar.SelectedDate = System.DateTime.Now;
  this.DataBind();
 }
 oleDbConnection1.Close();
}

Теперь выполнение приложения приведет к доступности всех данных о помещениях и приглашенных гостях из элементов управления соединением данных.

Оглавление книги


Генерация: 5.381. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз