Опубликован: 14.11.2006 | Доступ: свободный | Студентов: 5898 / 532 | Оценка: 4.18 / 3.74 | Длительность: 16:37:00
ISBN: 978-5-9556-0085-7
Лекция 6:

Работа с базами данных

< Лекция 5 || Лекция 6: 12345 || Лекция 7 >

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

В 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.

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

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

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 Name Data Type Allow Nulls
Id int
variant nvarchar(100) +
voices int

Поле 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) );
        }
    }
}

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

Заключение

Работа с базами данных в ASP .NET — настолько обширная тема, что ее невозможно охватить в одной лекции. Хотя классы ADO .NET инкапсулированы в более удобные классы источников данных, их необходимо знать, чтобы лучше понять новую модель, принятую в ASP .NET 2.0.

< Лекция 5 || Лекция 6: 12345 || Лекция 7 >
Алексей Савельев
Алексей Савельев

https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx

Денис Прокофьев
Денис Прокофьев

Везде написано, что это самый независимый и простой в использовании навигационный элемент управления, что он работает сразу с web.sitemap и не требует определения SiteMapDataSource.

Моя карта сайта состоит из двух страниц, вложенных друг в друга. asp:Menu, asp:TreeView отбображаются как ожидалось, а вот asp:SiteMapPath - нет. Он не виден нигде. Однако на его месте формируется разметка: <span id="SiteMapPath1"><a href="#SiteMapPath1_SkipLink" style="position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden;">Проход по ссылкам навигации</a><a id="SiteMapPath1_SkipLink"></a></span> - т.е. элемент отрабатывает.

В словах xHTML это выглядит так: <asp:SiteMapPath ID="SiteMapPath1" runat="server" />. Причем не важно - внутри тега form или снаружи - всегда одинаково.

Т.к. другие нав. ЭУ работают через простой источник данных без ошибок, делаю вывод - карта составлена правильно. ИД: <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

Карта: <?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/L11_1_simplePage.aspx" title="Страница 1"  description="Простая страница 1." >
    <siteMapNode url="~/L11_1SimplePage2.aspx" title="Страница 2"  description="Простая страница 2" />
  </siteMapNode>
</siteMap>

Почему так происходит? Вроде делаю все по примерам. VS Community 2015. NetFramework в проекте: v4.0.30319