Главная страница статей --> Хитрости при программировании php, заметки по базам данных

Лекция 6. Работа с базами данных.

Источник: realcoding.net

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

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



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

2. Создание таблицы. Это можно сделать и программно, и через окно Server Exlorer. Там уже появился узел созданной базы 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 не должны повторяться.



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

CREATE PROCEDURE dbo.CountVote 
       
(
        @
choiceid int =
       
)
  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 списка переключателей, и будет передаваться в процедуру сервера как параметр.



При желании на этом шаге можно отсортировать значения, например, по алфавитному порядку текстов нажатием на кнопку 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 />
      &
nbsp; &nbsp;&nbsp;<br />
      &
nbsp;<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.

Контакты
Редакция:
[0.001]