Проектирование и разработка веб-приложений на основе технологий Microsoft

Технология ASP.Net: методы доступа к данным, управление состоянием

Разбить на страницы
Показывать лекцию целиком

Естественно, для начала эту БД необходимо создать. В качестве СУБД, в нашем демонстрационном примере, мы будем использовать MS SQL 2008, для выполнения же самого задания допускается использование любой СУБД по выбору учащегося.

Подробнее о методах доступа к данным и управлении состоянием см. в лекции 10 и лекции 14.

Подготовка Базы данных

  • Начнем с того, что создадим БД для нашего занятия.

    Поскольку наша база данных будет служить исключительно демонстрационным целям, не будем изменять никаких настроек, ограничимся тем, что введем имя для новой БД - MSWebCourse

  • Создадим несколько таблиц, необходимых нам для нашего примера

    Таблица User - в данной таблице будет храниться информация о пользователях нашего приложения

  • Выберите функцию - создать таблицу - из выпадающего меню соответствующей вкладки "Таблицы" созданной БД.

    Зададим следующие имена столбцов для нашей таблица и типы данных:

    Определим столбец UserID как первичный ключ

    На панели свойств столбца UserID, в нижней части экрана, в разделе "Спецификация идентификатора"поменяйте значение свойства "Идентификатор" на "Да".

    Сохраните таблицу под именем User.

    Аналогичным образом создайте следующие таблицы

    Определение связей между таблицами

    Создадим диаграмму БД

    Добавим к нашей диаграмме только что созданные таблицы

    Свяжем таблицы Order и Customer по атрибуту CustomerID, для этого просто выделим этот атрибут в таблице Order и, не отпуская левой кнопки мыши, соединим его с соответствующим атрубутом таблицы Customer. Мы увидим следующее окно:

    Убедившись в правильности параметров, нажмем OK.

    Следующее окно уведомит нас о создании связи по внешнему ключу, также нажмем ОК.

    Связь создана

    Сохраните изменения в диаграмме и аналогичным образом свяжите следующие таблицы:

    Order и GoodsInOrder по атрибуту OrderID, Good и GoodsInOrder по атрибуту GoodID.

    Теперь нужно заполнить таблицы данными.

    Создайте не менее 3-5 записей для каждой из таблиц.

    После этого БД готова для использования в примере.

    Элементы управления с привязкой к данным

    Создадим веб - страницу средствами Visual Studio 2008, на которой будет выводить информация о выбранном из списка заказе OrderInfo.aspx.

    На странице разместим элементы управления DropDownList с ID - ddl_orders и Label с ID - lbl_orders.

    Чтобы осуществить привязку к данным выберем пункт меню "Выбрать источник данных"

    В мастере конфигурации источника данных в качестве источника данных выберем "Новый источник данных"

    В качестве типа источника данных укажем - База данных, в качестве имени источника данных - OrdersDS.

    В окне выбора соединения данных нажмите на кнопку - "Новое соединение".

    В появившемся окне выберите Microsoft SQL Server и нажмите "Продолжить".

    Дальше необходимо добавить подключение к БД. Здесь все зависит от того, как сформирован ваш SQL сервер и типа аутентификации, установите параметры в соответствии с настройками вашего SQL сервера.

    После окончания настройки соединения и сохранения строки подключения, необходимо настроить оператор Select для нашего элемента управления. В нашем выпадающем списке будут содержаться названия заказов. Настройка оператора Select будет выглядеть следующим образом:

    При этом в качестве поля данных для отображения выберем OrderName, а в качестве поля данных для значения укажем OrderID.

    На этом настройка элемента управления с привязкой к данным закончена.

    Запустив отладку проекта, мы можем убедиться, что выпадающий список отображает значения соответствующего поля в таблице Order.

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

    LINQ to SQL

    Рассмотрим аналогичный пример, но в качестве источника данных всесто SqlDataSource используем LinqDataSource.

    Для начала, для того чтобы можно было работать с LinqDataSource необходимо создать класс представления Linq в SQL.

    Для этого:

  • Добавьте папку
  • Щелкните на папке
  • Выберите
  • Подключитесь к вашей базе данных через
  • Затем просто перетащите таблицы, необходимые для выполнения задания в поле
  • Поместите на нашу веб – страницу элемент управления
  • Выберите данные, которые мы "привяжем" к нашему выпадающему списку.
  • Укажите LinqDataSource в качестве источника данных для выпадающего списка.
  • В качестве поля данных для отображения выберете OrderName, а в качестве поля данных для значения укажем OrderID.
  • Привязка ЭУ к источнику данных выполнена.

    Элементы управления источником данных, управление состоянием.

    Рассмотрим простой пример, иллюстрирующий работу в целом как элементов управления с привязкой к источнику данных и элементов управления источником данных, так и управление состоянием на стороне сервера. Управление состоянием на стороне клиента предлагается рассмотреть самостоятельно.

    Для начала снова подготовим нашу базу данных для выполнения примера. Создадим хранимую SQL-процедуру, выводящую в зависимости от введенного идентификатора заказа, товары в заказе и их количество.

    Конечно, реализовать данный функционал можно и при помощи SQL – запроса непосредственно при редактировании C# кода нашей страницы, но это будет не лучшее решение, с точки зрения безопасности и уязвимости сайта.

  • Нажмите правой кнопкой мыши на папке
  • Введите следующий код.
    CREATE PROCEDURE dbo.orderInfo
    (@ordID int) 
    
    AS
    BEGIN
    select dbo.Good.GoodName, dbo.GoodsInOrder.NumberOfGoods
    from dbo.GoodsInOrder INNER JOIN dbo.Good ON dbo.Good.GoodID=dbo.GoodsInOrder.GoodID
    where dbo.GoodsInOrder.OrderID=@ordID
    	
    END
  • Нажмите Выполнить. На этом создание процедуры закончено, теперь мы можем обращаться к ней.

    Добавьте на веб - страницу следующие ЭУ: SqlDataSource и GridView. В качестве источника данных для GridView укажите SqlDataSource и при настройке оператора Select источника данных выберите пункт Укажите специальный оператор SQL или хранимую процедуру и нажмите Далее.

    В качестве хранимой процедуры для оператора Select укажите только что созданную нами orderInfo и нажмите Далее.

    В качестве источника параметров укажите Session, В качестве Session Field укажите orderID и значение по умолчанию 1.

    Добавьте следующий код для события выпадающего списка SelectedIndexChanged

    //вот собственно и иллюстрация применения Session – передача данных 
    
    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Session["OrderID"] = DropDownList1.SelectedValue;
        }

    В свойствах выпадающего списка присвойте параметру AutoPostBack значение True.

    Теперь при изменении текущего знаячения выпадающего списка мы будем видеть более подробную информацию о выбранном заказе. Логика выполнения такова: при изменении значения выпадающего списка в сессию OrderID передается значение идентификатора заказа, затем в соответствии с настройкой источника данных выполняется хранимая SQL – процедура, кооторая возвращает наименования товаров в данном заказе и их количество, что и отображается в "привязанном" к источнику данных GridView.

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

    CREATE PROCEDURE dbo.Updt
    (@id int,
    @newValue int,
    @goodname nvarchar(50))
    AS
    BEGIN
    Update dbo.GoodsInOrder set NumberOfGoods=@newValue
    where OrderID=@id and GoodID = (Select GoodID from dbo.Good where dbo.Good.GoodName = @goodname)
    END

    Затем добавим GridView командную колонку Правка, для этого выберите Правка столбцов в меню задач GridView.

    Добавьте столбец Правка, Обновить, Отмена и с помощью стрелок справа от поля Выбранные поля переместите его в начало списка.

    В asp – коде для GridView добавьте свойство ReadOnly=true, для колонки GoodName, это необходимо для того, чтобы сделать возможным только изменение поля Number.

    <asp:GridView ID="gv_goods" runat="server" AutoGenerateColumns="False" 
                  DataSourceID="ordInfo" onrowupdating="gv_goods_RowUpdating">
      <Columns>
          <asp:CommandField ShowEditButton="True" />
          <asp:BoundField DataField="GoodName" HeaderText="GoodName" ReadOnly=true 
              SortExpression="GoodName" />
          <asp:BoundField DataField="NumberOfGoods" HeaderText="NumberOfGoods" 
              SortExpression="NumberOfGoods" />
      </Columns>

    У элемента управления SqlDataSource есть параметр UpdateString, определяющий sql – команду выполняемую в случае обновления источника данных. Метод Update этого же элемента управления осуществляет непосредственное обновление источника данных, в нашем случае таблицы GoodsInOrder.

    Напишем обработчик события RowUpdating для GridView.

    C# - код итоговой веб – страницы

    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data.Linq;
    using System.Data.SqlClient;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web.Security;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    
    
    public partial class OrderInfo : System.Web.UI.Page
    {
      
      protected void Page_Load(object sender, EventArgs e)
      {
      }
    
      protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
      {
        Session["OrderID"] = DropDownList1.SelectedValue;
      }
      protected void gv_goods_RowUpdating(object sender, GridViewUpdateEventArgs e)
      {
        int orderID = 0;
    
        try
        {
          orderID = Convert.ToInt32(Session["OrderID"].ToString());
        }
        catch (Exception exc)
        {
          //не очень изящный код, используется исключительно для упрощения самого примера
          //по сути, если в сессии у нас нет значений, т.е. не произошла смена значения 
          // выпадающего списка мы в качестве идентификатора заказа передаем процедуре 1
          orderID = 1;
        }
        
        int newGoodNumber = 0;
        //получаем наименование товара, для которого необходимо поменять количество
        string nameOfGood = gv_goods.Rows[e.RowIndex].Cells[1].Text;
    
        foreach (DictionaryEntry newValues in e.NewValues)
        {
          //поскольку в GridView у нас только один столбец, значение которого можно изменить
          // в словаре e.NewValues содержится только одно единственное значение нового количества
          //в результате мы получаем измененное количество определенного товара в заказе
          newGoodNumber = Convert.ToInt32(e.NewValues[0].ToString());
        }
    
        //вызываем процедуру обновления БД с необходимыми параметрами
        ordInfo.UpdateCommand = "exec dbo.Updt '"+orderID+"', '"+
                                newGoodNumber+"', N'"+nameOfGood+"'";
        //обновляем БД средствами элемента управления SqlDataSource
        ordInfo.Update();
      }
    }

    Результат. При выполнении Правка – изменение числа товара – Обновить, обновляются значения в таблице GoodsInOrder в нашей БД.

    В приведенном выше коде отсутствует также проверка правильности вводимых значений. Оставляем это на ваше усмотрение, разумеется, подобные послабления недопустимы в условиях разработки реальных веб – приложений.

    Страницы:

    Естественно, для начала эту БД необходимо создать. В качестве СУБД, в нашем демонстрационном примере, мы будем использовать MS SQL 2008, для выполнения же самого задания допускается использование любой СУБД по выбору учащегося.

    Подробнее о методах доступа к данным и управлении состоянием см. в лекции 10 и лекции 14.

    Подготовка Базы данных

  • Начнем с того, что создадим БД для нашего занятия.

    Поскольку наша база данных будет служить исключительно демонстрационным целям, не будем изменять никаких настроек, ограничимся тем, что введем имя для новой БД - MSWebCourse

  • Создадим несколько таблиц, необходимых нам для нашего примера

    Таблица User - в данной таблице будет храниться информация о пользователях нашего приложения

  • Выберите функцию - создать таблицу - из выпадающего меню соответствующей вкладки "Таблицы" созданной БД.

    Зададим следующие имена столбцов для нашей таблица и типы данных:

    Определим столбец UserID как первичный ключ

    На панели свойств столбца UserID, в нижней части экрана, в разделе "Спецификация идентификатора"поменяйте значение свойства "Идентификатор" на "Да".

    Сохраните таблицу под именем User.

    Аналогичным образом создайте следующие таблицы

    Определение связей между таблицами

    Создадим диаграмму БД

    Добавим к нашей диаграмме только что созданные таблицы

    Свяжем таблицы Order и Customer по атрибуту CustomerID, для этого просто выделим этот атрибут в таблице Order и, не отпуская левой кнопки мыши, соединим его с соответствующим атрубутом таблицы Customer. Мы увидим следующее окно:

    Убедившись в правильности параметров, нажмем OK.

    Следующее окно уведомит нас о создании связи по внешнему ключу, также нажмем ОК.

    Связь создана

    Сохраните изменения в диаграмме и аналогичным образом свяжите следующие таблицы:

    Order и GoodsInOrder по атрибуту OrderID, Good и GoodsInOrder по атрибуту GoodID.

    Теперь нужно заполнить таблицы данными.

    Создайте не менее 3-5 записей для каждой из таблиц.

    После этого БД готова для использования в примере.

    Элементы управления с привязкой к данным

    Создадим веб - страницу средствами Visual Studio 2008, на которой будет выводить информация о выбранном из списка заказе OrderInfo.aspx.

    На странице разместим элементы управления DropDownList с ID - ddl_orders и Label с ID - lbl_orders.

    Чтобы осуществить привязку к данным выберем пункт меню "Выбрать источник данных"

    В мастере конфигурации источника данных в качестве источника данных выберем "Новый источник данных"

    В качестве типа источника данных укажем - База данных, в качестве имени источника данных - OrdersDS.

    В окне выбора соединения данных нажмите на кнопку - "Новое соединение".

    В появившемся окне выберите Microsoft SQL Server и нажмите "Продолжить".

    Дальше необходимо добавить подключение к БД. Здесь все зависит от того, как сформирован ваш SQL сервер и типа аутентификации, установите параметры в соответствии с настройками вашего SQL сервера.

    После окончания настройки соединения и сохранения строки подключения, необходимо настроить оператор Select для нашего элемента управления. В нашем выпадающем списке будут содержаться названия заказов. Настройка оператора Select будет выглядеть следующим образом:

    При этом в качестве поля данных для отображения выберем OrderName, а в качестве поля данных для значения укажем OrderID.

    На этом настройка элемента управления с привязкой к данным закончена.

    Запустив отладку проекта, мы можем убедиться, что выпадающий список отображает значения соответствующего поля в таблице Order.

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

    LINQ to SQL

    Рассмотрим аналогичный пример, но в качестве источника данных всесто SqlDataSource используем LinqDataSource.

    Для начала, для того чтобы можно было работать с LinqDataSource необходимо создать класс представления Linq в SQL.

    Для этого:

  • Добавьте папку
  • Щелкните на папке
  • Выберите
  • Подключитесь к вашей базе данных через
  • Затем просто перетащите таблицы, необходимые для выполнения задания в поле
  • Поместите на нашу веб – страницу элемент управления
  • Выберите данные, которые мы "привяжем" к нашему выпадающему списку.
  • Укажите LinqDataSource в качестве источника данных для выпадающего списка.
  • В качестве поля данных для отображения выберете OrderName, а в качестве поля данных для значения укажем OrderID.
  • Привязка ЭУ к источнику данных выполнена.

    Элементы управления источником данных, управление состоянием.

    Рассмотрим простой пример, иллюстрирующий работу в целом как элементов управления с привязкой к источнику данных и элементов управления источником данных, так и управление состоянием на стороне сервера. Управление состоянием на стороне клиента предлагается рассмотреть самостоятельно.

    Для начала снова подготовим нашу базу данных для выполнения примера. Создадим хранимую SQL-процедуру, выводящую в зависимости от введенного идентификатора заказа, товары в заказе и их количество.

    Конечно, реализовать данный функционал можно и при помощи SQL – запроса непосредственно при редактировании C# кода нашей страницы, но это будет не лучшее решение, с точки зрения безопасности и уязвимости сайта.

  • Нажмите правой кнопкой мыши на папке
  • Введите следующий код.
    CREATE PROCEDURE dbo.orderInfo
    (@ordID int) 
    
    AS
    BEGIN
    select dbo.Good.GoodName, dbo.GoodsInOrder.NumberOfGoods
    from dbo.GoodsInOrder INNER JOIN dbo.Good ON dbo.Good.GoodID=dbo.GoodsInOrder.GoodID
    where dbo.GoodsInOrder.OrderID=@ordID
    	
    END
  • Нажмите Выполнить. На этом создание процедуры закончено, теперь мы можем обращаться к ней.

    Добавьте на веб - страницу следующие ЭУ: SqlDataSource и GridView. В качестве источника данных для GridView укажите SqlDataSource и при настройке оператора Select источника данных выберите пункт Укажите специальный оператор SQL или хранимую процедуру и нажмите Далее.

    В качестве хранимой процедуры для оператора Select укажите только что созданную нами orderInfo и нажмите Далее.

    В качестве источника параметров укажите Session, В качестве Session Field укажите orderID и значение по умолчанию 1.

    Добавьте следующий код для события выпадающего списка SelectedIndexChanged

    //вот собственно и иллюстрация применения Session – передача данных 
    
    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Session["OrderID"] = DropDownList1.SelectedValue;
        }

    В свойствах выпадающего списка присвойте параметру AutoPostBack значение True.

    Теперь при изменении текущего знаячения выпадающего списка мы будем видеть более подробную информацию о выбранном заказе. Логика выполнения такова: при изменении значения выпадающего списка в сессию OrderID передается значение идентификатора заказа, затем в соответствии с настройкой источника данных выполняется хранимая SQL – процедура, кооторая возвращает наименования товаров в данном заказе и их количество, что и отображается в "привязанном" к источнику данных GridView.

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

    CREATE PROCEDURE dbo.Updt
    (@id int,
    @newValue int,
    @goodname nvarchar(50))
    AS
    BEGIN
    Update dbo.GoodsInOrder set NumberOfGoods=@newValue
    where OrderID=@id and GoodID = (Select GoodID from dbo.Good where dbo.Good.GoodName = @goodname)
    END

    Затем добавим GridView командную колонку Правка, для этого выберите Правка столбцов в меню задач GridView.

    Добавьте столбец Правка, Обновить, Отмена и с помощью стрелок справа от поля Выбранные поля переместите его в начало списка.

    В asp – коде для GridView добавьте свойство ReadOnly=true, для колонки GoodName, это необходимо для того, чтобы сделать возможным только изменение поля Number.

    <asp:GridView ID="gv_goods" runat="server" AutoGenerateColumns="False" 
                  DataSourceID="ordInfo" onrowupdating="gv_goods_RowUpdating">
      <Columns>
          <asp:CommandField ShowEditButton="True" />
          <asp:BoundField DataField="GoodName" HeaderText="GoodName" ReadOnly=true 
              SortExpression="GoodName" />
          <asp:BoundField DataField="NumberOfGoods" HeaderText="NumberOfGoods" 
              SortExpression="NumberOfGoods" />
      </Columns>

    У элемента управления SqlDataSource есть параметр UpdateString, определяющий sql – команду выполняемую в случае обновления источника данных. Метод Update этого же элемента управления осуществляет непосредственное обновление источника данных, в нашем случае таблицы GoodsInOrder.

    Напишем обработчик события RowUpdating для GridView.

    C# - код итоговой веб – страницы

    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data.Linq;
    using System.Data.SqlClient;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web.Security;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    
    
    public partial class OrderInfo : System.Web.UI.Page
    {
      
      protected void Page_Load(object sender, EventArgs e)
      {
      }
    
      protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
      {
        Session["OrderID"] = DropDownList1.SelectedValue;
      }
      protected void gv_goods_RowUpdating(object sender, GridViewUpdateEventArgs e)
      {
        int orderID = 0;
    
        try
        {
          orderID = Convert.ToInt32(Session["OrderID"].ToString());
        }
        catch (Exception exc)
        {
          //не очень изящный код, используется исключительно для упрощения самого примера
          //по сути, если в сессии у нас нет значений, т.е. не произошла смена значения 
          // выпадающего списка мы в качестве идентификатора заказа передаем процедуре 1
          orderID = 1;
        }
        
        int newGoodNumber = 0;
        //получаем наименование товара, для которого необходимо поменять количество
        string nameOfGood = gv_goods.Rows[e.RowIndex].Cells[1].Text;
    
        foreach (DictionaryEntry newValues in e.NewValues)
        {
          //поскольку в GridView у нас только один столбец, значение которого можно изменить
          // в словаре e.NewValues содержится только одно единственное значение нового количества
          //в результате мы получаем измененное количество определенного товара в заказе
          newGoodNumber = Convert.ToInt32(e.NewValues[0].ToString());
        }
    
        //вызываем процедуру обновления БД с необходимыми параметрами
        ordInfo.UpdateCommand = "exec dbo.Updt '"+orderID+"', '"+
                                newGoodNumber+"', N'"+nameOfGood+"'";
        //обновляем БД средствами элемента управления SqlDataSource
        ordInfo.Update();
      }
    }

    Результат. При выполнении Правка – изменение числа товара – Обновить, обновляются значения в таблице GoodsInOrder в нашей БД.

    В приведенном выше коде отсутствует также проверка правильности вводимых значений. Оставляем это на ваше усмотрение, разумеется, подобные послабления недопустимы в условиях разработки реальных веб – приложений.

    Вернуться к учебному плану