Основы ASP.NET 2.0

       

Окно внешних источников данных


В Visual Studio 2005 существует 3 вкладки просмотра проектов: Solution Explorer, Class Explorer, Server Explorer. Первыми двумя активно пользовались все, кто писал программы на C# (или другом языке), а третий по умолчанию не виден, откройте его из меню View

—> Server Explorer. Это окно позволяет работать с соединениями баз данных, просматривать статистику работы сервера (в VWD Express нет пункта Servers).


Рис. 6.1. 

Соединение можно установить как с MS SQL, так и с файлом Access и любым источником ODBC, а также Oracle. Можно также создать новую базу данных MS SQL.


Рис. 6.2. 

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

В лекции 3 мы создали страницы с голосованиями, но никак не обрабатывали результаты. Сейчас мы будем сохранять результаты голосования.

1. Вначале надо создать базу данных. В окне Server Explorer нажмите правой клавишей мыши на пункт Data Connections, в контекстном меню выберите Create New Sql Database.


Рис. 6.3. 

.\SQLExpress равносильно (local) SQLExpress и означает сервер на локальной машине. Можно подключиться к серверу и по сети. Мы создали базу данных Polls, которая находится на сервере. Можно создать базу данных в отдельном файле .mdf, тогда ее можно будет переносить на другой компьютер.

2. Создание таблицы. Это можно сделать и программно, и через окно Server Explorer. Там уже появился узел созданной базы Polls.dbo. Раскройте его, правой клавишей мыши кликните на пункт Tables, в контекстном меню выберите Add New Table.


Заполните следующие значения:

Column NameData TypeAllow Nulls
Idint+
variantnvarchar(100)
voicesint
Поле id создается как уникальный идентификатор варианта, и оно должно быть первичным ключом таблицы. Кликните мышью на первой строке и выберите пункт Set Primary Key. Поле voices (количество голосов) при создании должно быть равно 0. В Columns Properties найдите строчку Default Value or Binding и впишите значение 0.

Создание той же самой таблицы в программном режиме:

protected void Page_Load(object sender, EventArgs e) { String strCreateTable = "create table poll(id int NOT NULL PRIMARY KEY, variant nvarchar(100), voices int DEFAULT 0)"; CreateSqlTable(strCreateTable, "Data Source=.\\SQLEXPRESS;Initial Catalog=Polls;Integrated Security=True"); }

public void CreateSqlTable(string SqlQuery, string myConnectionString) { SqlConnection myConnection = new SqlConnection(myConnectionString); SqlCommand myCommand = new SqlCommand(SqlQuery, myConnection); myCommand.Connection.Open(); myCommand.ExecuteNonQuery(); myConnection.Close(); }

3. Заполнение таблицы вариантами. Кликните мышью на таблице и выберите пункт Show Table Data. Значения id не должны повторяться.


Рис. 6.4. 

4. Создание серверной процедуры. При каждом голосовании значение поля voices одной из записей таблицы, соответствующей нужному пункту, должно возрастать. Это удобнее сделать с помощью процедуры, которая принимает аргумент id и обновляет нужное поле. Кликните мышью на узел Stored Procedures и выберите пункт Add New Stored Procedure:



CREATE PROCEDURE dbo.CountVote ( @choiceid int = 0 )

AS DECLARE @Count INT SELECT @Count = voices FROM poll WHERE id=@choiceid UPDATE poll SET voices=@Count+1 WHERE id=@choiceid RETURN

В этой процедуре заключены 2 взаимосвязанных команды, связанных общей логикой, а для выполнения ее понадобится только один объект Command. Также заметьте, что для ее вызова не нужно знать внутреннее устройство таблицы. Перед переменными процедуры и параметрами ставится @, чтобы отличить их от полей таблицы.

Оператор SELECT извлекает записи из таблицы poll, которые соответствуют условию после ключевого слова WHERE. Так как id — ключевое (уникальное) поле и выбирается одно поле voices, возвращается одно значение, которое можно записать в переменную. Затем в операторе UPDATE изменяется на увеличенное значение переменной @Count.

5. Привязка к данным. На новой странице создайте элементы Button и RadioButtonList (можно и CheckBoxList) перетаскиванием из Toolbox. На RadioButtonList имеется стрелка, открывающая Smart Tag. С помощью него можно сконфигурировать соединение с нужной таблицей или внести значения вручную. При нажатии на Configure Data Source появится мастер соединений. Выберите New Data Source. На втором шаге мастер предложит выбрать тип источника. Выберите Database. На следующем шаге из выпадающего списка выберите .\sqlexpress.Polls.dbo. На четвертом шаге мастер предложит сохранить строку соединения в конфигурационном файле. Сохраним, она может понадобиться. Для заполнения переключателей необходимы 2 поля: в variant содержится текст варианта, который будет виден в форме, а в id — номер варианта, который связан с DataValueField списка переключателей и будет передаваться в процедуру сервера как параметр.




Рис. 6.5. 

При желании на этом шаге можно отсортировать значения, например, по алфавитному порядку текстов нажатием на кнопку ORDER BY. На предпоследнем шаге можно протестировать полученный запрос, и если все в порядке, то на последнем шаге ставим variant как источник для показа и id для значений. На странице должно получиться примерно следующее:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Voting.aspx.cs" Inherits="Voting" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Голосование для программистов</title> </head> <body> <br /><br /> Какой язык программирования Вы предпочитаете?<br /> <form runat="server" id="voting"> <asp:RadioButtonList ID="RadioButtonList1" runat="server" DataSourceID="SqlDataSource1" DataTextField="variant" DataValueField="id"> </asp:RadioButtonList> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:PollsConnectionString %>" SelectCommand="SELECT [id], [variant] FROM [poll] ORDER BY [variant] "></asp:SqlDataSource> <br /> <br /> <asp:Button ID="Button1" runat="server" Text="Button" /><br /> <br /> <br /><br /> </form> <asp:Label id="Message" runat="server" /> </body> </html>



6. Обработка результатов. Процедуру необходимо вызвать с параметром, взятым из свойства Value группы переключателей. Свойство Parameters SqlCommand является коллекцией, в данном случае в нее надо добавить один элемент:

public partial class Voting : System.Web.UI.Page { public void ExecuteStoredProcedure(string ProcedureName, string myConnectionString, int id) { SqlConnection myConnection = new SqlConnection(myConnectionString); SqlCommand myCommand = new SqlCommand(ProcedureName, myConnection); myCommand.CommandType = CommandType.StoredProcedure; SqlParameter myParm = myCommand.Parameters.Add("@choiceid", SqlDbType.Int, 4); myParm.Value = id; myCommand.Connection.Open(); myCommand.ExecuteNonQuery();

myConnection.Close(); }

protected void Page_Load(object sender, EventArgs e) { String strConnection = "Data Source=.\\SQLEXPRESS;Initial Catalog=Polls;Integrated Security=True"; if (Page.IsPostBack) { String strProc="CountVote"; Message.Text = RadioButtonList1.SelectedValue; ExecuteStoredProcedure(strProc, strConnection, Int32.Parse(RadioButtonList1.SelectedValue) ); } } }

При работе с базами данных важно соблюдать принцип: "занимай ресурсы как можно позже и освобождай как можно раньше". Поэтому соединение закрывается сразу после выполнения процедуры сервера.


Содержание раздела