V minulém článku jsem popisoval postup vytvoření knihy návštěv bez použití databáze. Dnes si ukážeme, jak realizovat stejný úkol, přičemž vyměníme textový soubor za databázi.

Stránka je psána pomocí ASP.NET Web Matrix. Začneme tím, že si založíme nový soubor ASP.NET Page, zvolíme jako jazyk C# a jako jméno souboru zadáme guestADO.aspx. Po přepnutí na záložku HTML napíšeme tento kód:

<!DOCTYPE HTML PUBLIC „-//W3C//DTD HTML 4.0 Transitional//EN“ >
<html>
<head>
<title>Kniha návštev</title>
</head>
<body>
<form id=“Form1″ method=“post“ runat=“server“>
<blockquote dir=“ltr“ style=“MARGIN-RIGHT: 0px“> <blockquote dir=“ltr“ style=“MARGIN-RIGHT: 0px“> <blockquote dir=“ltr“ style=“MARGIN-RIGHT: 0px“> <blockquote dir=“ltr“ style=“MARGIN-RIGHT: 0px“> <blockquote dir=“ltr“ style=“MARGIN-RIGHT: 0px“>
<div align=“justify“><font size=“5″>Kniha návštev</font>
</div>
</blockquote></blockquote></blockquote></blockquote></blockquote>
<center><font size=“5″></font>
</center>
<div align=“left“>Jméno:
<asp:textbox id=“txtName“ runat=“server“ Width=“393px“></asp:textbox>
&nbsp;
<asp:requiredfieldvalidator id=“RequiredFieldValidator1″ runat=“server“ ErrorMessage=“Nutno zadat.“ ControlToValidate=“txtName“ Display=“Dynamic“></asp:requiredfieldvalidator>
</div>
<div align=“left“>Email:&nbsp;&nbsp;
<asp:textbox id=“txtEmail“ runat=“server“ Width=“390px“></asp:textbox>
&nbsp;
<asp:regularexpressionvalidator id=“RegularExpressionValidator2″ runat=“server“ ErrorMessage=“Zadáno v nesprávném formátu.“ ControlToValidate=“txtEmail“ Display=“Dynamic“ ValidationExpression=“\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*“></asp:regularexpressionvalidator>
</div>
<div align=“left“>Web:&nbsp;&nbsp;
<asp:textbox id=“txtWeb“ runat=“server“ Width=“393px“></asp:textbox>
&nbsp;
<asp:regularexpressionvalidator id=“RegularExpressionValidator1″ runat=“server“ ErrorMessage=“Zadáno v nesprávném formátu.“ ControlToValidate=“txtWeb“ ValidationExpression=“http://([\w-]+\.)+[\w-]+(/[\w- /?%&amp;=]*)?“></asp:regularexpressionvalidator>
</div>
<div align=“left“>Text:&nbsp;&nbsp;&nbsp;
<asp:textbox id=“txtText“ runat=“server“ Width=“395px“ TextMode=“MultiLine“ Height=“135px“></asp:textbox>
&nbsp;
<asp:requiredfieldvalidator id=“RequiredFieldValidator2″ runat=“server“ ErrorMessage=“Nutno zadat.“ ControlToValidate=“txtText“ Display=“Dynamic“></asp:requiredfieldvalidator>
</div>
<div align=“center“>
<asp:button id=“btnSubmit“ onclick=“btnSubmit_Click“ runat=“server“ Text=“Odeslat“></asp:button>
</div>
<div align=“left“>
<hr width=“100%“ size=“1″ />
</div>
<asp:Label id=“lblMessages“ runat=“server“>Label</asp:Label>
</form>
</body>
</html>

Rozvržení stránky je kompletní, takže můžeme postoupit k psaní zdrojového kódu a k záložce Code. Jako první nadeklarujeme proměnnou connectionString typu string, která bude obsahovat připojovací řetězec k SQL serveru:

string connectionString = „server=\’jmeno serveru\‘; trusted_connection=false; Database=\’guestbook\‘;user id=username;password=password“;

Nyní vytvoříme novou funkci MakeGBString, která se připojí k databázi, stáhne z ní data a naformátuje k zobrazení. K připojení k serveru potřebujeme vytvořit nový objekt typu SqlDataAdapter a v konstruktoru uvést SQL výraz a connectionString. Dále je nutné vytvořit objekt typu DataSet, který bude obsahovat data načtená ze serveru. Příkazem adapter.Fill se vykoná připojení k SQL serveru, provedení SQL dotazu a naplnění DataSetu. Následuje smyčka, která projde všechny řádky první tabulky z DataSetu a jednotlivé buňky přenese do proměnné strMessage. Funkce Trim slouží k odstranění přebytečných mezer na začátku a konci řetězce.

string MakeGBString()
{
     string strMessage = „“;
     DataSet ds = new DataSet();
     SqlDataAdapter adapter = new SqlDataAdapter(
         „SELECT * FROM “ +
         „naiman_guestbook ORDER BY Id DESC“,
         connectionString);
     adapter.Fill(ds);
     foreach(DataRow row in ds.Tables[0].Rows)
     {
         strMessage += „<b>“ +
             row[„Jmeno“].ToString().Trim() +
             „</b><br>“;
         if(row[„Email“].ToString().Trim() != „“)
             strMessage += „<a href=\“mailto:“ +
             row[„Email“].ToString().Trim() +
             „\“>“ + row[„Email“].ToString().Trim() +
             „</a><br>“;
         if(row[„Web“].ToString().Trim() != „“)
             strMessage += „<a href=\““ +
             row[„Web“].ToString().Trim() + „\“>“ +
             row[„Web“].ToString().Trim() + „</a><br>“;
         strMessage += „<br>“ +
             row[„Text“].ToString().Trim() + „<hr>“;
     }
     return strMessage;
}

Při načítání stránky se na serveru generuje událost Page_Load. Obsloužíme ji kódem, který, pokud se jedná o první načtení stránky, přiřadí do ovládacího prvku lblMessages zformátovaný text z databáze:

void Page_Load(Object sender, EventArgs e)
{
     if (!Page.IsPostBack)
         lblMessages.Text = MakeGBString();
}

Poslední fukcí je funkce reagující na stisk tlačítka btnSubmit. Vytvoří nový objekt typu SqlConnection pomocí řetězce connectionString. Následuje deklarace proměnných pro dva SQL dotazy. První slouží k vložení nového příspěvku do databáze a druhý k ověření, zda už stejný příspěvek nebyl jednou vložen (eliminace reloadů). Dále se vytvoří dva objekty typu SQLCommand na základě SqlConnection a SQL dotazu. Otevře se spojení na SQL server příkazem sqlConnection.Open(). Provede se vykonání prvního objektu SQLCommand a metoda ExecuteScalar zajistí, že návratová hodnota bude pouze počet řádků zasažených dotazem. Pokud je návratová hodnota rovna nule, víme, že tento příspěvek se k knize návštěv ještě nevyskytuje a můžeme ho tedy zapsat. K zapsání použijeme metodu ExecuteNonQuery druhého SQLCommand objektu. Důležité pro šetření zdrojů serveru je všechny nepotřebné spojení na SQL server uzavírat. K tomu slouží příkaz sqlConnection.Close(). Posledním příkazem vyvoláme funkci MakeGBString a její výsledek zapíšeme do ovládacího prvku lblMessages.

void btnSubmit_Click(Object sender, EventArgs e)
{
     SqlConnection sqlConnection = new SqlConnection(connectionString);
     string insertString = „INSERT INTO naiman_guestbook (Jmeno, Email, Web, “ +
         „Text) VALUES (\'“ + Server.HtmlEncode(txtName.Text) + „\‘, \'“ +
         Server.HtmlEncode(txtEmail.Text) + „\‘, \'“ +
         Server.HtmlEncode(txtWeb.Text) + „\‘, \'“ +
         Server.HtmlEncode(txtText.Text) + „\‘)“;
     string selectString = „SELECT count(*) FROM naiman_guestbook WHERE Jmeno = ‚“
         + Server.HtmlEncode(txtName.Text) + „‚ AND Email = ‚“
         + Server.HtmlEncode(txtEmail.Text) + „‚ AND Web = ‚“
         + Server.HtmlEncode(txtWeb.Text) + „‚ AND Text = ‚“
         + Server.HtmlEncode(txtText.Text) + „‚“;
     SqlCommand cmdInsert = new SqlCommand(insertString, sqlConnection);
     SqlCommand cmdSelect = new SqlCommand(selectString, sqlConnection);
     int rowsAffected;
     sqlConnection.Open();
     rowsAffected = Convert.ToInt32(cmdSelect.ExecuteScalar());
     
     if(rowsAffected == 0)
     {
         cmdInsert.ExecuteNonQuery();
         txtName.Text = txtEmail.Text = txtWeb.Text = txtText.Text = „“;
     }
    sqlConnection.Close();
     lblMessages.Text = MakeGBString();
}

Finálním krokem před spuštěním aplikace je vytvořit na serveru databázi. K tomuto kroku jsem vygeneroval jednoduchý SQL skript:

CREATE TABLE [dbo].[guestbook] (
     [Id] [int] IDENTITY (1, 1) NOT NULL ,
     [Jmeno] [nchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
     [Email] [char] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
     [Web] [char] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
     [Text] [char] (1000) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
) ON [PRIMARY]
GO

Tato kniha návštěv je, dle mého názoru, podstatně efektivnější než předešlá verze bez databáze, co do vývoje i nasazení. Mohou se však vyskytnout případy, kdy je její použití nemožné, třeba v důsledku absence SQL serveru.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

1 Příspěvěk v diskuzi

Odpovědět