5 – Práce s daty

 
 

 

Tato kapitola popisuje, jak přistupovat k datům v databázi a zobrazovat je s použitím webových stránek ASP.NET.

Co se naučíte:

V této kapitole budou představeny následující funkce technologie ASP.NET:

 

 

úvod do práce s databázemi

Představte si typický adresář. Pro každý záznam v adresáři (tedy pro každou osobu) v něm máte několik informací, například jméno, příjmení, adresu, e-mailovou adresu nebo telefonní číslo.

Taková data si obvykle představíme jako tabulku s řádky a sloupci. V databázové terminologii bývá každý řádek často označován jako záznam. Každý sloupec (někdy označovaný jako pole) obsahuje hodnotu pro jednotlivé typy dat: jméno, příjmení atd.

ID Jméno Příjmení Adresa E-mail Telefon
1 Jim Abrus 210 100th St SE Orcas WA 98031 jim@contoso.com 555 0100
2 Terry Adams 1234 Main St. Seattle WA 99011 terry@cohowinery.com 555 0101

Většina databázových tabulek musí mít sloupec obsahující jedinečný identifikátor, např. číslo zákazníka, číslo účtu apod. Tento sloupec se nazývá primární klíč a slouží k identifikaci jednotlivých řádků v databázi. V tomto příkladu je sloupec ID primárním klíčem adresáře.

S těmito základními znalostmi databází můžete nyní přikročit k vytvoření jednoduché databáze a provádění operací jako například přidání, úprava nebo odstranění dat.

Vytvoření databáze

Tento postup ukazuje, jak vytvořit databázi s názvem SmallBakery (Malé pekařství) s použitím nástroje pro návrh databáze SQL Server Compact Database, který je součástí sady WebMatrix. Přestože databázi lze vytvořit i s použitím kódu, častější je vytváření databází a tabulek databází pomocí nástroje pro návrh, jako je například WebMatrix.

  1. Spusťte prostředí WebMatrix a na stránce Quick Start (Rychlý začátek) klikněte na položku Site From Template (Web ze šablony).
  2. Vyberte možnost Empty Site (Prázdný web), do pole Site Name (Název webu) zadejte text „SmallBakery“ (Malé pekařství) a poté klikněte na tlačítko OK. Web bude vytvořen a zobrazen v prostředí WebMatrix.
  3. V levém podokně klikněte na pracovní prostředí Databases (Databáze).
  4. Na pásu karet klikněte na položku New Database (Nová databáze). Bude vytvořena prázdná databáze, jejíž název se bude shodovat s názvem webu.
  5. V levém podokně rozbalte uzel SmallBakery.sdf a klikněte na položku Tables (Tabulky).
  6. Na pásu karet klikněte na položku New Table (Nová tabulka). WebMatrix otevře návrháře tabulek.

    ch05_data-1

  7. V rámci podokna Column Properties (Vlastnosti sloupce) pro položku (Name) (Název) zadejte text „Id“.
  8. Pro nový sloupec Id nastavte vlastnosti Is Identity (Je identita) a Is Primary Key (Je primární klíč) na hodnotu true.

    Jak už samotný název napovídá, vlastnost Is Primary Key databázi sděluje, že se jedná o primární klíč tabulky. Vlastnost Is Identity databázi říká, že má automaticky vytvářet čísla ID pro všechny nové záznamy a přiřadit jim další číslo v pořadí (počínaje hodnotou 1).

  9. Na pásu karet klikněte na položku New Column (Nový sloupec).
  10. V rámci podokna Column Properties (Vlastnosti sloupce) pro položku (Name) (Název) zadejte jako hodnotu text „Name“.
  11. Vlastnost Allow Nulls (Povolit hodnoty null) nastavte na hodnotu false. Tím zajistíme, že sloupec Name (Název) nebude možné ponechat prázdný.
  12. Vlastnost Data Type (Datový typ) nastavte na hodnotu nvarchar. Část var v názvu typu nvarchar databázi sděluje, že data v tomto sloupci budou řetězce s variabilní délkou, která se může mezi jednotlivými záznamy lišit. (Předpona n zastupuje slovo national (národní), což určuje, že toto pole může uchovávat data představující libovolnou abecedu nebo systém písma, neboli že toto pole bude uchovávat data v kódování Unicode.)
  13. S použitím stejného postupu vytvořte sloupec s názvem Description (Popis). Vlastnost Allow Nulls nastavte na hodnotu false a vlastnost Data Type na hodnotu nvarchar.
  14. Vytvořte sloupec s názvem Price (Cena). Vlastnost Allow Nulls nastavte na hodnotu false a vlastnost Data Type na hodnotu money (peněžní hodnota).
  15. Stisknutím kombinace kláves CTRL+S tabulku uložte a přidělte jí název Product (Produkt).

    Až budete hotovi, bude definice vypadat takto:

    ch05_data-2

Poznámka   Při úpravách definice sloupce v tabulce není možné přejít z názvu vlastnosti na její hodnotu pomocí klávesy TABULáTOR. Místo toho vyberte vlastnost, kterou chcete upravit, a poté její hodnotu budete moci změnit tak, že začnete na klávesnici zadávat text, pokud se jedná o textové pole, nebo stisknete klávesu F4, pokud chcete vybrat hodnotu, která je uvedena v rozevírací nabídce.

Přidání dat do databáze

Nyní do databáze můžete přidat ukázková data, se kterými budete pracovat v další části této kapitoly.

  1. V levém podokně rozbalte uzel SmallBakery.sdf a poté klikněte na položku Tables (Tabulky).
  2. Pravým tlačítkem myši klikněte na tabulku Product (Produkt) a poté klikněte na položku Data.
  3. V podokně pro úpravy zadejte následující záznamy:
    Name (Název) Description (Popis) Price (Cena)
    Bread (Chléb) Baked fresh every day. (Čerstvě upečený každý den) 2.99
    Strawberry Shortcake (Jahodový koláč) Made with organic strawberries from our garden. (Používáme bio jahody z naší vlastní zahrady.) 9.99
    Apple Pie (Jablečný koláč) Second only to your mom's pie. (Skoro jako od maminky) 12.99
    Pecan Pie (Pekanový koláč) If you like pecans, this is for you. (Nejlepší volba pro milovníky pekanových ořechů) 10.99
    Lemon Pie (Citronový koláč) Made with the best lemons in the world. (Používáme ty nejlepší citróny na světě.) 11.99
    Cupcakes (Košíčky) Your kids and the kid in you will love these. (Mladí i staří se po nich budou moci utlouct.) 7.99

    Pamatujte, že pro sloupec Id nemusíte nic zadávat. Při vytvoření sloupce Id jste jeho vlastnost Is Identity (Je identita) nastavili na hodnotu true, a proto je tento sloupec vyplněn automaticky.

    Až budou všechna data zadána, bude návrhář tabulek vypadat takto:

    ch05_data-3

  4. Zavřete kartu obsahující data uložená v databázi.

Zobrazení dat z databáze

Jakmile budete mít databázi s daty, můžete data zobrazit na webové stránce ASP.NET. Pro výběr řádků tabulky, které mají být zobrazeny, slouží příkaz jazyka SQL. Jedná se o příkaz, který je předán databázi.

  1. V levém podokně vyberte pracovní prostředí Files (Soubory).
  2. V kořenové složce webu vytvořte novou stránku CSHTML s názvem ListProducts.cshtml.
  3. Stávající kód značkovacího jazyka nahraďte následujícím kódem:
    @{ 
        var db = Database.Open("SmallBakery"); 
        var selectQueryString = "SELECT * FROM Product ORDER BY Name"; 
     } 
    <!DOCTYPE html> 
    <html> 
     <head> 
       <title>Small Bakery Products</title> 
       <style> 
           table, th, td { 
             border: solid 1px #bbbbbb; 
             border-collapse: collapse; 
             padding: 2px; 
           } 
        </style> 
     </head> 
     <body> 
       <h1>Small Bakery Products</h1> 
       <table> 
           <thead> 
               <tr> 
                   <th>Id</th> 
                   <th>Product</th> 
                   <th>Description</th> 
           <th>Price</th> 
               </tr> 
           </thead> 
           <tbody> 
               @foreach(var row in db.Query(selectQueryString)){ 
                <tr> 
                   <td>@row.Id</td> 
                       <td>@row.Name</td> 
                       <td>@row.Description</td> 
                       <td>@row.Price</td> 
                </tr> 
               } 
           </tbody> 
       </table> 
     </body> 
    </html>

    V prvním bloku kódu otevřeme dříve vytvořený soubor (databázi) SmallBakery.sdf. Metoda Database.Open (Databáze.Otevřít) předpokládá, že soubor SDF se na webu nachází ve složce App_Data. (Všimněte si, že není třeba uvádět příponu SDF. Naopak, pokud ji uvedete, metoda Open nebude fungovat.)

    Poznámka   Složka App_Data je speciální složka technologie ASP.NET, která slouží k ukládání datových souborů. Více informací získáte v další části této kapitoly Připojení k databázi.

    Poté vzneseme požadavek na provedení dotazu v databázi s použitím následujícího příkazu Select jazyka SQL:

    SELECT * FROM Product ORDER BY Name

    V tomto příkazu je Product název tabulky, nad kterou má být dotaz proveden. Znak * určuje, že dotaz má vrátit všechny sloupce tabulky. (Chcete-li vidět jen některé sloupce, můžete také uvést jednotlivé sloupce, oddělené čárkami.) Klauzule Order By určuje, jak mají být data seřazena, v tomto případě podle sloupce Name (Název). To znamená, že data jsou seřazena podle abecedy na základě hodnoty ve sloupci Name (Název) jednotlivých řádků.

    V těle stránky je pomocí kódu značkovacího jazyka HTML vytvořena tabulka, která slouží k zobrazení dat. Uvnitř elementu <tbody> s použitím smyčky foreach získáme jednotlivé řádky dat vrácené dotazem. Pro každý řádek dat vytvoříme řádek tabulky HTML (element <tr>). Poté pro každý sloupec vytvoříme buňku tabulky HTML (elementy <td>). Při každém průchodu smyčkou je v proměnné row (řádek) obsažen další z řádků z databáze, které jsou k dispozici (dosáhneme toho pomocí příkazu foreach). Jednotlivé sloupce řádku získáme pomocí výrazů row.Name nebo row.Description nebo výrazů obsahujících jiný požadovaný název sloupce.

  4. Spusťte stránku v prohlížeči. (Před jejím spuštěním ověřte, zda je stránka vybrána v pracovním prostředí Files – Soubory.) Stránka zobrazí seznam, který by měl vypadat následovně:

    ch05_data-4

Vložení dat do databáze

Tato část ukazuje, jak vytvořit stránku, která uživateli umožňuje přidat nový produkt do databázové tabulky Product (Produkt). Po vložení záznamu nového produktu stránka zobrazí aktualizovanou tabulku s použitím stránky ListProducts.cshtml vytvořené v předchozí části.

Stránka zahrnuje ověření, zda uživatel zadal platná data pro tuto databázi. Kód stránky například kontroluje, zda byly zadány hodnoty pro všechny vyžadované sloupce.

Poznámka   Proces, který požaduje provedení operace, musí mít v databázi pro některé z těchto operací (například vkládání nebo odstraňování záznamů) příslušná oprávnění. U databází používaných v provozním prostředí (na rozdíl od testovací databáze, se kterou pracujeme v prostředí WebMatrix) je často nutné poskytnout při připojení k databázi uživatelské jméno a heslo.
  1. Vytvořte na webu nový soubor CSHTML s názvem InsertProducts.cshtml.
  2. Stávající kód značkovacího jazyka nahraďte následujícím kódem:
    @{ 
        var db = Database.Open("SmallBakery"); 
        var Name = Request["Name"]; 
        var Description = Request["Description"]; 
        var Price = Request["Price"]; 
     
        if (IsPost) { 
     
            
    // Čtení názvu produktu
             Name = Request["Name"]; 
            if (Name.IsEmpty()) { 
               ModelState.AddError("Name", "Product name is required."); 
            } 
     
            
    // Čtení popisu produktu
             Description = Request["Description"]; 
            if (Description.IsEmpty()) { 
              ModelState.AddError("Description", 
                    "Product description is required."); 
             } 
     
            
    // Čtení ceny produktu
             Price = Request["Price"]; 
            if (Price.IsEmpty()) { 
              ModelState.AddError("Price", "Product price is required."); 
            } 
     
            // Definice dotazu insert. Hodnoty, které mají být přiřazeny 
            // sloupcům tabulky Product table, jsou definovány jako parametry 
            // s použitím klíčového slova VALUES. 
            if(ModelState.IsValid) { 
                var insertQuery = "INSERT INTO Product (Name, Description, Price) " + 
                    "VALUES (@0, @1, @2)"; 
                db.Execute(insertQuery, Name, Description, Price); 
                // Zobrazení stránky s výpisem produktů
                 Response.Redirect(@Href("/ListProducts"));         } 
        } 
    } 
     
    <!DOCTYPE html> 
    <html> 
    <head> 
       <title>Add Products</title> 
       <style type="text/css"> 
          label {float:left; width: 8em; text-align: right; 
                   margin-right: 0.5em;} 
          fieldset {padding: 1em; border: 1px solid; width: 35em;} 
          legend {padding: 2px 4px; border: 1px solid; font-weight:bold;} 
          .validation-summary-errors {font-weight:bold; color:red; font-size: 11pt;} 
       </style> 
    </head> 
    <body> 
       <h1>Add New Product</h1> 
     
       @Html.ValidationSummary("Errors with your submission:") 
     
       <form method="post" action=""> 
           <fieldset> 
               <legend>Add Product</legend> 
               <div> 
                   <label>Name:</label> 
                   <input name="Name" type="text" size="50" value="@Name" /> 
               </div> 
               <div> 
                   <label>Description:</label> 
                   <input name="Description" type="text" size="50" 
                       value="@Description" /> 
               </div> 
               <div> 
                   <label>Price:</label> 
                   <input name="Price" type="text" size="50" value="@Price" /> 
               </div> 
               <div> 
                   <label> </label> 
                   <input type="submit" value="Insert" class="submit" /> 
               </div> 
           </fieldset> 
     
       </form> 
    </body> 
    </html>

    Tělo stránky obsahuje formulář HTML se třemi textovými poli, které uživateli umožňují zadat název, popis a cenu. Když uživatel klikne na tlačítko Insert (Vložit), kód v horní části stránky otevře připojení k databázi SmallBakery.sdf. Poté s použitím objektu Request (Požadavek) získáme hodnoty zadané uživatelem a přiřadíme je místním proměnným.

    Pro ověření toho, zda uživatel zadal hodnoty pro všechny sloupce, provedeme následující příkazy:

    Name = Request["Name"]; 
    if (Name.IsEmpty()) { 
        ModelState.AddError("Name", 
            "Product name is required."); 
    }

    Pokud je hodnota ve sloupci Name (Název) prázdná, použijeme metodu ModelState.AddError (Stav modelu.Přidat chybu) a předáme jí chybovou zprávu. To zopakujeme pro všechny kontrolované sloupce. Po kontrole všech sloupců provedeme tento test:

    if(ModelState.IsValid) { // ...  }

    Pokud byly všechny sloupce ověřeny (žádný z nich není prázdný), můžeme pokračovat a vytvořit příkaz jazyka SQL pro vložení dat a poté jej vykonat, jak ukazuje následující kód:

    var insertQuery = 
        "INSERT INTO Product (Name, Description, Price) VALUES (@0, @1, @2)";

    Pro vkládané hodnoty jsou v příkazu použity zástupné parametry (@0,@1,@2).

    Poznámka   Jako preventivní bezpečnostní opatření hodnoty do příkazu jazyka SQL vždy předávejte s použitím parametrů, jak ukazuje předchozí příklad. Tento postup poskytuje možnost ověřit data od uživatele a ochranu před pokusy zaslat do databáze škodlivé příkazy (někdy označované jako útoky prostřednictvím injektáže SQL).

    Pro vykonání dotazu použijeme následující příkaz, kterému předáme proměnné s hodnotami pro nahrazení zástupných parametrů:

    db.Execute(insertQuery, Name, Description, Price);

    Po provedení příkazu Insert Into zašleme uživateli stránku s výpisem produktů pomocí následujícího řádku:

    Response.Redirect("/ListProducts");

    Pokud ověření nebylo úspěšné, vložení přeskočíme. Místo něj máme ve stránce pomocnou třídu (helper), která zobrazí nahromaděné chybové zprávy (pokud nějaké existují):

    @Html.ValidationSummary("Errors with your submission:")

    Všimněte si, že blok style (styl) v kódu značkovacího jazyka zahrnuje definici třídy šablon stylů CSS s názvem .validation-summary-errors (přehled chyb ověření). Jedná se o jméno třídy šablon stylů CSS, která je ve výchozím nastavení použita pro element <div> obsahující případné chyby ověření. V tomto případě třída šablon stylů CSS určuje, že přehled chyb ověření má být zobrazen červeným tučným písmem, ale pomocí definice třídy .validation-summary-errors si můžete zvolit formátování, jaké uznáte za vhodné.

  3. Zobrazte stránku v prohlížeči. Stránka zobrazí podobný formulář jako v následujícím obrázku.

    ch05_data-5

  4. Zadejte hodnoty pro všechny sloupce, pouze sloupec Price (Cena) ponechte prázdný.
  5. Klikněte na tlačítko Insert (Vložit). Stránka zobrazí chybovou zprávu, jak ukazuje následující obrázek. (Nebyl vytvořen žádný nový záznam.)

    ch05_data-6

  6. Vyplňte celý formulář a poté klikněte na tlačítko Insert (Vložit). Tentokrát je stránka ListProducts.cshtml zobrazena a je na ní nový záznam.

Aktualizace dat v databázi

Po zadání dat do tabulky může být někdy nutné tato data aktualizovat. Tento postup ukazuje, jak vytvořit dvě stránky podobné těm, které jsme v předchozí části vytvořili pro vložení dat. První stránka zobrazuje produkty a umožňuje uživatelům vybrat produkt, který má být změněn. Druhá stránka uživatelům umožňuje provést změny a uložit je.

Důležité   Na produkčním webu obvykle platí omezení, kdo smí provádět změny dat. Informace, jak zřídit členství a jak autorizovat uživatele pro provádění úloh na webu, získáte v kapitole 16 – Přidání zabezpečení a členství.
  1. Vytvořte na webu nový soubor CSHTML s názvem EditProducts.cshtml.
  2. Nahraďte stávající kód značkovacího jazyka v souboru následujícím kódem:
    @{ 
        var db = Database.Open("SmallBakery"); 
        var selectQueryString = "SELECT * FROM Product ORDER BY Name"; 
     
    } 
    <!DOCTYPE html> 
    <html> 
    <head> 
        <title>Edit Products</title> 
        <style type="text/css"> 
            table, th, td { 
              border: solid 1px #bbbbbb; 
              border-collapse: collapse; 
              padding: 2px; 
            } 
        </style> 
    </head> 
    <body> 
        <h1>Edit Small Bakery Products</h1> 
        <table> 
          <thead> 
            <tr> 
              <th> </th> 
              <th>Name</th> 
              <th>Description</th> 
              <th>Price</th> 
            </tr> 
          </thead> 
          <tbody> 
            @foreach (var row in db.Query(selectQueryString)) { 
              <tr> 
                <td><a href="@Href("/UpdateProducts", row.Id)">Edit</a></td> 
                <td>@row.Name</td> 
                <td>@row.Description</td> 
                <td>@row.Price</td> 
              </tr> 
            } 
          </tbody> 
        </table> 
    </body> 
    </html>

    Jediný rozdíl mezi touto stránkou a stránkou ListProducts.cshtml z předchozí části spočívá v tom, že tabulka HTML na této stránce obsahuje sloupec navíc, ve kterém je zobrazen odkaz Edit (Upravit). Kliknutím na tento odkaz se dostanete na stránku UpdateProducts.cshtml (kterou vytvoříme v dalším kroku), kde je možné vybraný záznam upravit.

    Prohlédněte si kód vytvářející odkaz Edit (Upravit):

    <a href="@Href("/UpdateProducts", row.Id)">Edit</a></td>

    Tento kód vytváří ukotvení jazyka HTML (element <a>), jehož atribut href je nastaven dynamicky. Atribut href určuje stránku, která má být zobrazena, když uživatel na odkaz klikne. Také odkazu předává hodnotu Id aktuálního řádku. Po spuštění stránky budou odkazy ve zdrojovém kódu stránky vypadat podobně jako následující odkazy:

    <a href="UpdateProducts/1">Edit</a></td> 
    <a href="UpdateProducts/2">Edit</a></td> 
    <a href="UpdateProducts/3">Edit</a></td>

    Všimněte si, že atribut href je nastaven na hodnotu UpdateProducts/n, kde n je číslo produktu. Když uživatel klikne na některý z těchto odkazů, bude výsledná adresa URL vypadat například takto:

    http://localhost:18816/UpdateProducts/6

    Jinými slovy, číslo produktu, který má být upraven, bude předáno v adrese URL.

  3. Zobrazte stránku v prohlížeči. Stránka zobrazí data zformátovaná podobně jako v následujícím obrázku:

    ch05_data-7

    V dalším kroku vytvoříme stránku, která uživateli umožní provést samotnou úpravu dat. Stránka provádějící aktualizaci dat zahrnuje ověření dat zadaných uživatelem. Kód stránky například kontroluje, zda byly zadány hodnoty pro všechny vyžadované sloupce.

  4. Vytvořte na webu nový soubor CSHTML s názvem UpdateProducts.cshtml.
  5. Nahraďte stávající kód značkovacího jazyka v souboru následujícím kódem:
    @{ 
        var db = Database.Open("SmallBakery"); 
        var selectQueryString = "SELECT * FROM Product WHERE Id=@0"; 
     
        var ProductId  = UrlData[0]; 
     
        if (ProductId.IsEmpty()) { 
             Response.Redirect(@Href("/EditProducts")); 
         } 
     
        var row = db.QuerySingle(selectQueryString, ProductId); 
     
        var Name = row.Name; 
        var Description = row.Description; 
        var Price = row.Price; 
     
        if (IsPost) { 
             Name = Request["Name"]; 
             if (String.IsNullOrEmpty(Name)) { 
               ModelState.AddError("Name", "Product name is required."); 
             } 
     
            Description = Request["Description"]; 
            if (String.IsNullOrEmpty(Description)) { 
              ModelState.AddError("Description", 
                  "Product description is required."); 
            } 
     
            Price = Request["Price"]; 
            if (String.IsNullOrEmpty(Price)) { 
              ModelState.AddError("Price", "Product price is required."); 
            } 
     
            if(ModelState.IsValid) { 
                var updateQueryString = 
                  "UPDATE Product SET Name=@0, Description=@1, Price=@2 WHERE Id=@3" ; 
                db.Execute(updateQueryString, Name, Description, Price, ProductId); 
                Response.Redirect(@Href("/EditProducts")); 
            } 
        } 
    } 
     
    <!DOCTYPE html> 
    <html> 
    <head> 
        <title>Add Products</title> 
        <style type="text/css"> 
           label { float: left; width: 8em; text-align: right; 
                    margin-right: 0.5em;} 
           fieldset { padding: 1em; border: 1px solid; width: 35em;} 
           legend { padding: 2px 4px;  border: 1px solid; font-weight: bold;} 
           .validation-summary-errors {font-weight:bold; color:red; font-size:11pt;} 
        </style> 
    </head> 
    <body> 
        <h1>Update Product</h1> 
     
        @Html.ValidationSummary("Errors with your submission:") 
     
        <form method="post" action=""> 
            <fieldset> 
                <legend>Update Product</legend> 
                <div> 
                    <label>Name:</label> 
                    <input name="Name" type="text" size="50" value="@Name" /> 
                </div> 
                <div> 
                    <label>Description:</label> 
                    <input name="Description" type="text" size="50" 
                       value="@Description" /> 
                </div> 
                <div> 
                    <label>Price:</label> 
                    <input name="Price" type="text" size="50" value="@Price" /> 
                </div> 
                <div> 
                    <label> </label> 
                    <input type="submit" value="Update" class="submit" /> 
                </div> 
            </fieldset> 
        </form> 
    </body> 
    </html>

    Tělo stránky obsahuje formulář HTML, ve kterém je produkt zobrazen a v němž ho uživatel může upravit. Pro získání produktu, který má být zobrazen, slouží tento příkaz jazyka SQL:

    SELECT * FROM Product WHERE Id=@0

    Tento příkaz vybere produkt, jehož ID se shoduje s hodnotou předanou v parametru @0. (Protože Id je primárním klíčem a musí proto být jedinečné, je tímto způsobem možné vybrat vždy jen jeden produkt.) Hodnotu sloupce ID, která má být předána tomuto příkazu Select, je možné získat přečtením hodnoty předané do stránky jako součást adresy URL, s použitím následující syntaxe:

    var ProductId  = UrlData[0];

    Pro vlastní načtení záznamu produktu použijeme metodu QuerySingle (Dotaz na jeden), která vrátí pouze jeden záznam:

    var row = db.QuerySingle(selectQueryString, ProductId);

    Jeden řádek je uložen do proměnné row (řádek). Získat data z jednotlivých sloupců a přiřadit je místním proměnným je možné následujícím způsobem:

    var Name = row.Name; 
    var Description = row.Description; 
    var Price = row.Price;

    V kódu značkovacího jazyka formuláře jsou tyto hodnoty automaticky zobrazeny jako jednotlivá textová pole pomocí následujícího vloženého kódu:

    <input name="Name" type="text" size="50" value="@Name" /> 

    Tato část kódu zobrazuje záznam produktu, který má být aktualizován. Po zobrazení záznamu může uživatel upravovat jednotlivé sloupce.

    Když uživatel formulář odešle kliknutím na tlačítko Update (Aktualizovat), je nejprve proveden kód v bloku if(IsPost). Tento kód z objektu Request (Požadavek) získá hodnoty zadané uživatelem, uloží tyto hodnoty v proměnných a ověří, zda byly vyplněny všechny sloupce. Je-li ověření úspěšné, kód vytvoří následující příkaz Update jazyka SQL:

    UPDATE Product SET Name=@0, Description=@1, Price=@2, WHERE ID=@3

    V příkazu Update jazyka SQL jsou uvedeny všechny sloupce, které mají být aktualizovány, a hodnoty, na které mají být nastaveny. V tomto kódu jsou hodnoty určeny zástupnými parametry @0, @1, @2 atd. (Jak již bylo zmíněno dříve, hodnoty by měly být do příkazu jazyka SQL vždy předávány s použitím parametrů.)

    Při volání metody db.Execute předáme proměnné s hodnotami v pořadí, které odpovídá parametrům příkazu jazyka SQL:

    db.Execute(updateQueryString, Name, Description, Price, ProductId);

    Po vykonání příkazu Update přesměrujeme uživatele zpět na stránku pro úpravy pomocí volání následující metody:

    Response.Redirect(@Href("/EditProducts"));

    Výsledkem je, že uživateli je zobrazen aktualizovaný výpis dat z databáze a může provést úpravy dalšího produktu.

  6. Stránku uložte.
  7. Spusťte stránku EditProducts.cshtml (ne stránku pro aktualizaci) a poté kliknutím na odkaz Edit (Upravit) vyberte produkt, který má být upraven. Bude otevřena stránka UpdateProducts.cshtml zobrazující vybraný záznam.

    ch05_data-8

  8. Proveďte libovolnou změnu a klikněte na tlačítko Aktualizovat. Bude opět zobrazen seznam produktů, obsahující aktualizovaná data.

Odstranění dat z databáze

V této části si ukážeme, jak uživateli poskytnout možnost odstranit produkt z databázové tabulky Product (Produkt). Tento příklad sestává ze dvou stránek. Na první stránce uživatel vybere záznam, který má být odstraněn. Tento záznam je poté zobrazen na druhé stránce, kde uživatel musí potvrdit, že záznam chce odstranit.

Důležité   Na produkčním webu obvykle platí omezení, kdo smí provádět změny dat. Informace, jak zřídit členství a jak autorizovat uživatele pro provádění úloh na webu, získáte v kapitole 16 – Přidání zabezpečení a členství.
  1. Vytvořte na webu nový soubor CSHTML s názvem ListProductsForDelete.cshtml.
  2. Stávající kód značkovacího jazyka nahraďte následujícím kódem:
    @{ 
      var db = Database.Open("SmallBakery"); 
      var selectQueryString = "SELECT * FROM Product ORDER BY Name"; 
    } 
    <!DOCTYPE html> 
    <html> 
    <head> 
        <title>Delete a Product</title> 
        <style> 
            table, th, td { 
              border: solid 1px #bbbbbb; 
              border-collapse: collapse; 
              padding: 2px; 
            } 
         </style> 
    </head> 
    <body> 
      <h1>Delete a Product</h1> 
      <form method="post" action="" name="form"> 
        <table border="1"> 
          <thead> 
            <tr> 
              <th>&nbsp;</th> 
              <th>Name</th> 
              <th>Description</th> 
              <th>Price</th> 
            </tr> 
          </thead> 
          <tbody> 
            @foreach (var row in db.Query(selectQueryString)) { 
              <tr> 
                <td><a href="@Href("/DeleteProduct", row.Id)">Delete</a></td> 
                <td>@row.Name</td> 
                <td>@row.Description</td> 
                <td>@row.Price</td> 
              </tr> 
            } 
          </tbody> 
        </table> 
      </form> 
    </body> 
    </html>

    Tato stránka se podobá stránce EditProducts.cshtml z předchozí části. Místo odkazu Edit (Upravit) ale pro jednotlivé produkty zobrazuje odkaz Delete (Odstranit). Odkaz Delete (Odstranit) je vytvořen pomocí následujícího kódu vloženého do kódu značkovacího jazyka:

    <a href="@Href("/DeleteProduct", row.Id)">Delete</a>

    Tento kód vytvoří adresu URL, která poté, co uživatel klikne na odkaz, bude vypadat následovně:

    http://<server>/DeleteProduct/4

    Adresa URL volá stránku s názvem DeleteProduct.cshtml (kterou vytvoříme v dalším kroku) a předává jí ID produktu, který má být odstraněn (v tomto případě 4).

  3. Soubor uložte, ale nezavírejte jej.
  4. Vytvořte další soubor CHTML s názvem DeleteProduct.cshtml a nahraďte stávající obsah následujícím kódem:
    @{ 
      var db = Database.Open("SmallBakery"); 
      var ProductId = UrlData[0]; 
      if (ProductId.IsEmpty()) { 
        Response.Redirect(@Href("/ListProductsForDelete")); 
      } 
      var prod = db.QuerySingle("SELECT * FROM PRODUCT WHERE ID = @0", ProductId); 
      if( IsPost && !ProductId.IsEmpty()) { 
        var deleteQueryString = "DELETE FROM Product WHERE Id=@0"; 
        db.Execute(deleteQueryString, ProductId); 
        Response.Redirect("/ListProductsForDelete"); 
      } 
    } 
     
    <!DOCTYPE html> 
    <html 
    <head> 
        <title>Delete Product</title> 
    </head> 
    <body> 
      <h1>Delete Product - Confirmation</h1> 
      <form method="post" action="" name="form"> 
        <p>Are you sure you want to delete the following product?</p> 
     
        <p>Name: @prod.Name <br /> 
           Description: @prod.Description <br /> 
           Price: @prod.Price</p> 
        <p><input type="submit" value="Delete" /></p> 
      </form> 
    </body> 
    </html>

    Tato stránka je volána ze stránky ListProductsForDelete.cshtml a umožňuje uživateli potvrdit, že skutečně chce produkt odstranit. Abychom mohli zobrazit výpis produktu, který má být odstraněn, získáme ID tohoto produktu z adresy URL s použitím následujícího kódu:

    var ProductId = UrlData[0];

    Stránka poté vyzve uživatele, aby klikl na tlačítko a tím záznam skutečně odstranil. Jedná se o důležité bezpečnostní opatření: při provádění citlivých operací na webu, například aktualizace nebo odstranění dat, by tyto operace měly být vždy prováděny s použitím operace POST, a nikoli operace GET. Pokud by váš web byl nastaven tak, že operace odstranění by bylo možné provést s použitím operace GET, kdokoli by mohl serveru předat adresu URL jako například http://<server>/DeleteProduct/4 a odstranit libovolný záznam z vaší databáze. Přidání potvrzení a vytvoření kódu stránky tak, aby odstranění bylo možné provést jen s použitím operace POST, zvyšuje úroveň zabezpečení webu.

    Vlastní operace odstranění je provedena s použitím následujícího kódu, který nejdřív ověří, že se jedná o operaci post a že hodnota ID není prázdná:

    if( IsPost && !ProductId.IsEmpty()) { 
        var deleteQueryString = "DELETE FROM Product WHERE Id=@0"; 
        db.Execute(deleteQueryString, ProductId); 
        Response.Redirect("/ListProductsForDelete"); 
    }

    Tento kód provede příkaz jazyka SQL, který odstraní uvedený záznam, a poté přesměruje uživatele zpět na stránku s výpisem produktů.

  5. Spusťte stránku ListProductsForDelete.cshtml v prohlížeči.

    ch05_data-9

  6. Klikněte na odkaz Delete (Odstranit) pro jeden z produktů. Bude zobrazena stránka DeleteProduct.cshtml se žádostí o potvrzení toho, že chcete záznam odstranit.
  7. Klikněte na tlačítko Delete (Odstranit). Bude odstraněn záznam produktu a zobrazen aktualizovaný seznam produktů.

Další materiály

SQL Server Compact

Připojení k databázi SQL Server nebo MySQL z prostředí WebMatrix