» ASP
для новичков
» Главная
страница
»
ASP
для новичков
Ввод данных с
Web-страницы
Для начала нам придется разработать
Web-страницу, при помощи которой пользователи смогут ввести информацию о себе в
нашу базу данных. Этой Web-странице мы присвоим наименование "insert.aspx". На
ней следует разместить поля текстового ввода и одну группу кнопок
переключателей, при помощи которой пользователь будет указывать свой пол.
Следовало бы также разместить на этой странице и механизм проверки
достоверности, для контроля соответствия введенных данных установленным
форматам. Иначе говоря, адрес электронной почты должен хотя бы соответствовать
правилам написания этих адресов, а возраст должен быть целым положительным
числом, находящимся в разумных рамках (допустим от 14 до 85), но не стоит в
данном случае так сильно нагружать страницу органами управления. Как их
использовать мы уже знаем, поэтому оставим маленький пример без них.
Итак, HTML-код Web-страницы в
режиме разработки приведен в листинге 4.1.
Листинг 4.1
<%@ Page Language="vb"
AutoEventWireup="false"
Codebe-hind="insert.aspx.vb"
Inherits="datingiWebForml"%>
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD
HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title>
</title>
<meta name="GENERATOR"
content="Microsoft Visual Studio.NET 7.0">
<meta name="CODE_LANGUAGE"
content="Visual Basic 7.0">
<meta
name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema"
content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body
ms_positioning="GridLayout">
<form id="Forml" method="post"
runat="server">
<asp:Label id="Labell"
style="Z-INDEX: 101; LEFT: 49px;
POSITION: absolute; TOP: 20px"
runat="server" Width="215px" Height="19px">BBeflMTe персональные
данные</азр:Label>
<asp:Label id="Labe!2"
style="Z-INDEX: 102; LEFT: 49px;
POSITION: absolute; TOP: 49px"
runat="server">MMH</asp:Label>
<asp:TextBox id="TextBoxl"
style="Z-INDEX: 103; LEFT: 49px;
POSITION: absolute;
TOP: 78px" runat="server"
Width="221px" Height="24px"x/asp:TextBox>
<asp:Label id="Label3"
style="Z-INDEX: 104; LEFT: 49px;
POSITION: absolute; TOP: 114px"
runat="server">non</asp:Label>
<asp:RadioButtonList
id="RadioButtonListl" style="Z-INDEX: 105; LEFT: 49px;
POSITION: absolute; TOP: 143px"
runat="server">
<asp:List!tem Value="0"
Selected="True">Жeнcкий</asp:ListItem> <asp:List!tem
Value="l">Mya;cKoft</asp:ListItem> </asp:RadioButtonList>
<asp:Label id="Labe!4"
style="Z-INDEX: 106; LEFT: 49px;
POSITION: absolute; TOP: 203px"
runat="server">AЈpec электронной no4Tfci</asp:Label>
<asp:TextBox id="TextBox2"
style="Z-INDEX: 107; LEFT: 49px;
POSITION: absolute;
TOP: 232px"
runat="server"x/asp:TextBox>
<asp:Label id="Labe!5"
style="Z-INDEX: 108; LEFT: 282px;
POSITION: absolute;
TOP: 46px"
runat="server">Bo3pacT</asp:Label>
<asp:TextBox id="TextBox3"
style="Z-INDEX: 109; LEFT: 284px;
POSITION: absolute; TOP: 79px"
runat="server"x/asp:TextBox>
<asp:Label id="Labe!6"
style="Z-INDEX: 110; LEFT: 49px;
POSITION: absolute; TOP: 266px"
runat="server">Дoпoлнитeльнaя информация</азр:ЬаЬе1>
<asp:TextBox id="TextBox4"
style="Z-INDEX: 111; LEFT: 49px;
POSITION: absolute;
TOP: 295px" runat="server"
Width="355px" Height="58px" TextMode="MultiLine"x/asp: TextBox>
<asp:Button id="Buttonl"
style="Z-INDEX: 112; LEFT: 49px;
POSITION: absolute;
TOP: 370px" runat="server"
Width="130px" Height="24px" Text="noflTBepfl>iTb "X/asp: Button>
</form>
</body>
</HTML>
Но эта Web-страница пока еще
мертва. Необходимо написать исполняемый код для нее. Идеологически все
достаточно просто. Требуется собрать введенные данные, а затем подставить их в
SQL-запрос insert. Еще раз оговорюсь, что в этой главе не будет рассматриваться
синтаксис языка SQL, поэтому достаточно будет лишь напомнить, что этот оператор
SQL позволяет добавлять данные в таблицы.
Перед тем, как рассматривать
механизм соединения с базой данных и выполнения SQL-запросов, приведем листинг
кода, реализующего класс создаваемой Web-страницы. Это листинг 4.2.
Листинг 4.2
Public Class WebForml
Inherits System.Web.UI.Page
Protected WithEvents Labell As
System.Web.UI.WebControls.Label
Protected WithEvents Label2
As System.Web.Ul.WebControls.Label
Protected WithEvents TextBoxl
As
System.Web.UI.WebControls.TextBox Protected WithEvents Label3
As System.Web.UI.WebControls.Label
Protected WithEvents
RadioButtonListl
As
System.Web.UI.WebControls.RadioButtonList
Protected WithEvents Label4 As
System.Web.UI.WebControls.Label
Protected WithEvents TextBox2 As
System.Web.Ul.WebControls.TextBox
Protected WithEvents Labels As
System.Web.UI.WebControls.Label
Protected WithEvents TextBox3 As
System.Web.Ul.WebControls.TextBox
Protected WithEvents Label6 As
System.Web.Ul.WebControls.Label
Protected WithEvents TextBox4 As
System.Web.Ul.WebControls.TextBox
Protected WithEvents Buttonl As
System.Web.UI.WebControls.Button
#Region " Web Form Designer
Generated Code "
'This call is required by the Web
Form Designer.
<System.Diagnostics.DebuggerstepThrough()>
Private Sub InitializeComponent()
End Sub
Private Sub Page_Init(ByVal sender
As System.Object, ByVal
e As System.EventArgs) Handles
MyBase.Init
'CODEGEN: This method call is
required by the Web Form Designer
'Do not modify it using the code
editor. InitializeComponent() End Sub
#End Region
Private Sub Page_Load(ByVal sender
As System.Object, ByVal
e As System.EventArgs) Handles
MyBase.Load
'Put user code to initialize the
page here End Sub
Private Sub Buttonl_Click(ByVal
sender
As System.Object, ByVal
e As System.EventArgs) Handles
Buttonl.Click
Dim DataConnection As
Data.SqlClient.SqlConnection
DataConnection = New
Data.SqlClient.SqlConnection ("server=(LOCAL);
uid=sa;
pwd=;
database=Dating")
Dim DataCommand As
Data.SqlClient.SqlCommand
Dim InsertCmd As String = "insert
into Dating (USNAME, SEX, \ EMAIL, ABOUT, AGE)
values OUsname, @Sex, @Email,
gAbout, @Age)"
DataCommand = New
Data.SqlClient.SqlCoramand(InsertCmd, DataConnection)
DataCornmand. Parameters .Add (New
I Data.SqlClient.SqlParameter("OUsname", System.Data.SqlDbType.NVarChar, ) )
DataCommand.Parameters("@Usname").Value =
TextBoxl.Text
DataCommand.Parameters.Add(New
fData.SqlClient.SqlParameter("@Sex", System.Data.SqlDbType.Int, 2))
DataCommand.Parameters("@Sex").
Value =
RadioButton-;'Listl.SelectedIndex
DataCommand.Parameters.Add(New
Data.SqlClient.SqlParameter("@Email", System.Data.SqlDbType.NChar, 50))
DataCommand.Parameters("@Email").Value =
TextBox2.Text
DataCommand.Parameters.Add(New
Data.SqlClient.SqlParameter("gAbout",
System.Data.SqlDbType.NVarChar, 1000»
DataCommand.Parameters("@About").Value =
TextBox4.Text
DataCommand.Parameters.Add(New
Data.SqlClient.SqlParameter("@Age", System.Data.SqlDbType.Int, 2))
DataCommand.Parameters("@Age").Value =
Val(TextBox3.Text)
DataCommand.Connection.Open()
Try
DataCommand.ExecuteNonQuery()
Response.Redirect("Success.aspx")
Catch Exp As Data.SqlClient.SqlException
Response.Redirect("failed.aspx")
End Try DataCommand.Connection.Closed
End Sub
End Class
Теперь рассмотрим созданный
обработчик нажатия пользователем кнопки. Для работы нам потребуется экземпляр
класса Data.sqiciient.sqiconnection, который позволяет устанавливать соединение
с SQL-сервером, и экземпляр Класса Data.SqlClient.SqlCommand, позволяющий
выполнять SQL-запросы.
После того, как мы объявили
экземпляр класса Data.sqiciient.
Sqiconnection с наименованием
DataConnection, следует его создать. Для этого мы используем конструктор
Data.SqlClient.SqlConnection, котоpому в качестве параметров передается строка,
содержащая параметры для установки соединения с базой данных. Из листинга видно,
что данная строка состоит из пар "имя=значение", отделенных друг от друга
символами точки с запятой. Параметр server позволяет указывать наименование
SQL-сервера, к которому производится присоединение. Так как в нашем примере мы
используем локальный сервер, который регистрируется в системе автоматически при
инсталляции Microsoft SQL Server 2000, то мы используем значение "(LOCAL)".
Затем при помощи параметра uid мы
указываем регистрационное имя, под которым происходит присоединение к серверу.
Для этого параметра мы используем значение за, которое указывает на встроенную
учетную запись администратора. Пароль для этого регистрационного имени
указывается при помощи параметра pwd, и в нашем случае этот пароль является
пустым. Следует отметить, что подобное подключение к SQL-серверу возможно только
в том случае, если тот поддерживает встроенную авторизацию, а не использует
авторизацию пользователей, основанную на механизмах идентификации Windows NT.
Для того чтобы узнать на какой именно механизм авторизации опирается SQL-сервер,
следует в конфигурационной утилите SQL Server Enterprise Manager выделить
элемент, соответствующий серверу, и в контекстном меню выполнить команду Edit
SQL Server Registration properties (Редактор свойств регистрации
SQL-сервера). При этом будет активировано диалоговое окно Registered SQL
Server Properties (Свойства регистрации SQL-сервера), показанное на рис.
4.7. В том случае, если действует собственная аутентификация SQL-сервера, должна
быть активирована кнопка-переключатель Use SQL Server authentication
(Использовать аутентификацию SQL-сервера). Естественно, в этом случае
необходимо указать регистрационное имя и пароль для учетной записи, проходящей
аутентификацию, в полях Login Name (Регистрационное имя) и Password
(Пароль), соответственно.
Примечание
Следует осознавать, что в реальных
условиях не следует использовать учетную запись с именем входа "
за", так как
она общеизвестна, и при определенных условиях злоумышленники могут получить
доступ к SQL-серверу, и, воспользовавшись этой учетной записью, полностью
изменить структуру баз данных. Поэтому, если нет возможности обойтись без этой
встроенной учетной записи, следует установить для нее максимально длинный и
сложный пароль. Однако стоит помнить, что любые пароли вскрываемы, поэтому при
первой же возможности стоит избавляться от всех учетных записей, устанавливаемых
по умолчанию, так как они общеизвестны. |
В строке установки соединения также
применяется параметр с наименованием Database, в качестве значения которого
используется наименование базы данных, к которой мы собираемся подключаться. В
нашем случае используется значение Dating.
После того, как было создано
соединение с SQL-сервером, следует подготовить для выполнения SQL-запрос. В
нашем случае SQL-запрос будет выполнять команду insert, следовательно, никаких
наборов данных от этого запроса мы не получим. Для выполнения запроса будет
использован экземпляр класса sqicommand. рднако, для него еще необходимо
подготовить саму строку, содержащую команду SQL. Для этого используется
переменная InsertCmd
тип3 String.
В этой строке записывается текст
выполняемого SQL-запроса. Так как следует явно указывать значения полей в этой
строке, у нас есть два варианта действий. Либо пользуясь данными, введенными
пользователем, генерировать эту строку, либо сразу задать текст запроса, но так
как нам заранее неизвестны подставляемые значения, воспользоваться параметрами.
В нашем примере мы воспользовались вторым способом. При этом строка SQL-запроса
приобрела следующий вид:
insert into Dating (USNAME, SEX,
EMAIL, ABOUT, AGE)
values (@Usname, @Sex, @Email,
@About, 8Age)
Видно, что вместо конкретных
значений, сохраняемых в таблице Dating, в строке запроса указаны наименования
параметров, начинающиеся с символа @. Для доступа к этим параметрам следует
использовать коллекцию Parameters, входящую в состав класса sqicommand. Для
каждого параметра мы используем метод Add, который добавляет его в коллекцию. В
качестве параметра этому
методу передается конструктор класса sqiParameter, который реализует сами
параметры SQL-запросов.
Однако перед тем как задать
значения этих параметров, следует создать экземпляр класса sgicommand. При этом
в качестве параметров передается строка, содержащая текст запроса, и переменная,
отвечающая за соединение с SQL-сервером.
В качестве параметров для
конструктора класса SqiParameter передаются наименование добавляемого параметра,
тип данных, которые будут соответствовать этому параметру, и длина поля, как это
показано в листинге.
После того, как все параметры
добавлены, следует выполнить подготовленный запрос. Для этого сначала следует
открыть подготовленное соединение с SQL-сервером. Поэтому используется метод
open, применяемый к свойству Connection, входящему в состав класса sqicoimand. А
затем, после того, как соединение открыто, следует выполнить сам SQL-запрос. Для
этого мы можем использовать метод ExecuteNonQuery. Однако в нашем примере мы не
просто вызываем этот метод, а при помощи конструкции Try ... catch ... End Try
подстраховываем себя на случай возникновения каких-либо нештатных ситуаций. В
том случае, когда не возникает никаких исключений, пользователь переадресуется
на страницу Success.aspx. А если системой было инициировано исключение,
пользователь оповещается об этом при помощи переадресации на страницу
failed.aspx.
После выполнения запроса следует
закрыть соединение при помощи метода close, применяемого к свойству connection,
входящему в состав класса sqicommand. На этом работа фрагмента Web-приложения,
отвечающего за добавление данных в таблицу, заканчивается. Прежде чем мы
перейдем к рассмотрению остальных частей Web-приложения, рассмотрим структуру
классов SqlConnection И SqlCommand.
Следующий
урок
|