Introduzione all'uso di un database nei siti di Pagine Web ASP.NET (Razor)
Questo articolo descrive come usare gli strumenti Microsoft WebMatrix per creare un database in un sito Web di Pagine Web ASP.NET (Razor) e come creare pagine che consentono di visualizzare, aggiungere, modificare ed eliminare dati.
Cosa si apprenderà:
- Come creare un database.
- Come connettersi a un database.
- Come visualizzare i dati in una pagina Web.
- Come inserire, aggiornare ed eliminare record di database.
Queste sono le funzionalità introdotte nell'articolo:
- Utilizzo di un database Microsoft SQL Server Compact Edition.
- Uso delle query SQL.
- Classe
Database
.Versioni software usate nell'esercitazione
- Pagine Web ASP.NET (Razor) 2
- WebMatrix 2
Questa esercitazione funziona anche con WebMatrix 3. È possibile usare Pagine Web ASP.NET 3 e Visual Studio 2013 (o Visual Studio Express 2013 per Il Web). L'interfaccia utente sarà tuttavia diversa.
Introduzione ai database
Si immagini una rubrica tipica. Per ogni voce della rubrica (vale a dire per ogni persona) si dispone di diverse informazioni, ad esempio nome, cognome, indirizzo, indirizzo di posta elettronica e numero di telefono.
Un modo tipico per creare un'immagine dei dati come questa è una tabella con righe e colonne. In termini di database, ogni riga viene spesso definita record. Ogni colonna (talvolta definita campi) contiene un valore per ogni tipo di dati: nome, cognome e così via.
ID | FirstName | LastName | Indirizzo | Posta elettronica | Telefono |
---|---|---|---|---|---|
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 |
Per la maggior parte delle tabelle di database, la tabella deve avere una colonna contenente un identificatore univoco, ad esempio un numero cliente, un numero di account e così via. Questa operazione è nota come chiave primaria della tabella e viene usata per identificare ogni riga della tabella. Nell'esempio la colonna ID è la chiave primaria per la rubrica.
Con questa conoscenza di base dei database, è possibile imparare a creare un database semplice ed eseguire operazioni come l'aggiunta, la modifica e l'eliminazione dei dati.
Suggerimento
Database relazionali
È possibile archiviare i dati in molti modi, inclusi file di testo e fogli di calcolo. Per la maggior parte degli usi aziendali, tuttavia, i dati vengono archiviati in un database relazionale.
Questo articolo non illustra in modo approfondito i database. Tuttavia, potrebbe risultare utile comprendere un po' di loro. In un database relazionale le informazioni sono suddivise logicamente in tabelle separate. Ad esempio, un database per un istituto di istruzione può contenere tabelle separate per gli studenti e per le offerte di classe. Il software di database (ad esempio SQL Server) supporta comandi potenti che consentono di stabilire dinamicamente relazioni tra le tabelle. Ad esempio, è possibile usare il database relazionale per stabilire una relazione logica tra studenti e classi per creare una pianificazione. L'archiviazione dei dati in tabelle separate riduce la complessità della struttura della tabella e riduce la necessità di mantenere i dati ridondanti nelle tabelle.
Creazione di un database
Questa procedura illustra come creare un database denominato SmallBakery usando lo strumento di progettazione di database SQL Server Compact incluso in WebMatrix. Sebbene sia possibile creare un database usando codice, è più tipico creare il database e le tabelle di database usando uno strumento di progettazione come WebMatrix.
Avviare WebMatrix e nella pagina Avvio rapido fare clic su Sito da modello.
Selezionare Sito vuoto e nella casella Nome sito immettere "SmallBakery" e quindi fare clic su OK. Il sito viene creato e visualizzato in WebMatrix.
Nel riquadro sinistro fare clic sull'area di lavoro Database .
Nella barra multifunzione fare clic su Nuovo database. Viene creato un database vuoto con lo stesso nome del sito.
Nel riquadro sinistro espandere il nodo SmallBakery.sdf e quindi fare clic su Tabelle.
Nella barra multifunzione fare clic su Nuova tabella. WebMatrix apre la finestra di progettazione tabelle.
Fare clic nella colonna Nome e immettere "Id".
Nella colonna Tipo di dati selezionare int.
Impostare le opzioni Is Primary Key? e Is Identify? (Chiave primaria) e Is Identify? (Identità?) su Sì.
Come suggerisce il nome, Is Primary Key indica al database che si tratta della chiave primaria della tabella. Identity indica al database di creare automaticamente un numero ID per ogni nuovo record e di assegnarlo al numero sequenziale successivo (a partire da 1).
Fare clic nella riga successiva. L'editor avvia una nuova definizione di colonna.
In Nome immettere "Name".
Per Tipo di dati scegliere "nvarchar" e impostare la lunghezza su 50. La parte var di
nvarchar
indica al database che i dati per questa colonna saranno una stringa la cui dimensione può variare da record a record. Il prefisso n rappresenta nazionale, a indicare che il campo può contenere dati di tipo carattere che rappresentano qualsiasi alfabeto o sistema di scrittura, ovvero che il campo contiene dati Unicode.Impostare l'opzione Consenti valori Null su No. In questo modo verrà applicato che la colonna Name non viene lasciata vuota.
Usando questo stesso processo, creare una colonna denominata Description. Impostare Tipo di dati su "nvarchar" e 50 per la lunghezza e impostare Consenti valori Null su false.
Creare una colonna denominata Price. Impostare Tipo di dati su "money" e impostare Consenti valori Null su false.
Nella casella in alto assegnare alla tabella il nome "Product".
Al termine, la definizione sarà simile alla seguente:
Premere CTRL+S per salvare la tabella.
Aggiunta di dati al database
È ora possibile aggiungere alcuni dati di esempio al database che verranno usati più avanti nell'articolo.
Nel riquadro sinistro espandere il nodo SmallBakery.sdf e quindi fare clic su Tabelle.
Fare clic con il pulsante destro del mouse sulla tabella Product e quindi scegliere Dati.
Nel riquadro di modifica immettere i record seguenti:
Nome Descrizione Prezzo Pane Al forno fresco ogni giorno. 2,99 Shortcake di fragole Fatta con fragole biologiche dal nostro giardino. 9.99 Torta apple Secondo solo alla torta di tua madre. 12,99 Torta pecan Se ti piace il pecans, questo è per te. 10.99 Torta di limone Fatto con i migliori limoni al mondo. 11.99 Tortine I tuoi bambini e il bambino in te piaceranno questi. 7,99 Tenere presente che non è necessario immettere nulla per la colonna ID . Quando è stata creata la colonna Id , è stata impostata la relativa proprietà Is Identity su true, che causa l'riempimento automatico.
Al termine dell'immissione dei dati, la finestra di progettazione tabelle avrà un aspetto simile al seguente:
Chiudere la scheda contenente i dati del database.
Visualizzazione dei dati da un database
Dopo aver ottenuto un database con dati, è possibile visualizzare i dati in una pagina Web ASP.NET. Per selezionare le righe della tabella da visualizzare, usare un'istruzione SQL, ovvero un comando passato al database.
Nel riquadro sinistro fare clic sull'area di lavoro File .
Nella radice del sito Web creare una nuova pagina CSHTML denominata ListProducts.cshtml.
Sostituire il markup esistente con quanto segue:
@{ 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>
Nel primo blocco di codice aprire il file SmallBakery.sdf (database) creato in precedenza. Il
Database.Open
metodo presuppone che il file sdf si trova nella cartella App_Data del sito Web. Si noti che non è necessario specificare l'estensione sdf , in effetti, se si esegue, ilOpen
metodo non funzionerà.Nota
La cartella App_Data è una cartella speciale in ASP.NET usata per archiviare i file di dati. Per altre informazioni, vedere Connessione a un database più avanti in questo articolo.
Si effettua quindi una richiesta per eseguire query sul database usando l'istruzione SQL
Select
seguente:SELECT * FROM Product ORDER BY Name
Nell'istruzione
Product
identifica la tabella da eseguire in query. Il*
carattere specifica che la query deve restituire tutte le colonne della tabella. È anche possibile elencare le colonne singolarmente, separate da virgole, se si desidera visualizzare solo alcune colonne. LaOrder By
clausola indica come è necessario ordinare i dati, in questo caso in base alla colonna Name . Ciò significa che i dati vengono ordinati in ordine alfabetico in base al valore della colonna Name per ogni riga.Nel corpo della pagina il markup crea una tabella HTML che verrà usata per visualizzare i dati. All'interno dell'elemento
<tbody>
viene usato unforeach
ciclo per ottenere singolarmente ogni riga di dati restituita dalla query. Per ogni riga di dati si crea una riga di tabella HTML (<tr>
elemento). Si creano quindi celle di tabella HTML (<td>
elementi) per ogni colonna. Ogni volta che si passa il ciclo, la riga disponibile successiva dal database si trova nellarow
variabile (questa operazione viene configurata nell'istruzioneforeach
). Per ottenere una singola colonna dalla riga, è possibile usarerow.Name
orow.Description
qualsiasi altro nome sia della colonna desiderata.Eseguire la pagina in un browser. Assicurarsi che la pagina sia selezionata nell'area di lavoro File prima di eseguirla. La pagina visualizza un elenco simile al seguente:
Suggerimento
Structured Query Language (SQL)
SQL è un linguaggio usato nella maggior parte dei database relazionali per la gestione dei dati in un database. Include comandi che consentono di recuperare i dati e aggiornarli e che consentono di creare, modificare e gestire tabelle di database. SQL è diverso da un linguaggio di programmazione ,ad esempio quello che si usa in WebMatrix, perché con SQL, l'idea è che si indica al database cosa si vuole e si tratta del processo del database per capire come ottenere i dati o eseguire l'attività. Ecco alcuni esempi di comandi SQL e di ciò che fanno:
SELECT Id, Name, Price FROM Product WHERE Price > 10.00 ORDER BY Name
In questo modo le colonneId, Name e Price vengono recuperate dai record nella tabella Product se il valore di Price è superiore a 10 e restituisce i risultati in ordine alfabetico in base ai valori della colonna Name. Questo comando restituirà un set di risultati contenente i record che soddisfano i criteri o un set vuoto se non corrisponde alcun record.
INSERT INTO Product (Name, Description, Price) VALUES ("Croissant", "A flaky delight", 1.99)
In questo modo viene inserito un nuovo record nella tabella Product , impostando la colonna Name su "Croissant", la colonna Description su "A flaky delight" e il prezzo su 1,99.
DELETE FROM Product WHERE ExpirationDate < "01/01/2008"
Questo comando elimina i record nella tabella Product la cui colonna di data di scadenza è precedente al 1° gennaio 2008. Si presuppone che la tabella Product abbia una colonna di questo tipo, naturalmente. La data viene immessa qui in formato MM/DD/AAAA, ma deve essere immessa nel formato usato per le impostazioni locali.
I Insert Into
comandi e Delete
non restituiscono set di risultati. Restituiscono invece un numero che indica il numero di record interessati dal comando.
Per alcune di queste operazioni , ad esempio l'inserimento e l'eliminazione di record, il processo che richiede l'operazione deve disporre delle autorizzazioni appropriate nel database. Questo è il motivo per cui i database di produzione spesso devono fornire un nome utente e una password quando ci si connette al database.
Ci sono decine di comandi SQL, ma tutti seguono un modello come questo. È possibile usare i comandi SQL per creare tabelle di database, contare il numero di record in una tabella, calcolare i prezzi ed eseguire molte altre operazioni.
Inserimento di dati in un database
In questa sezione viene illustrato come creare una pagina che consente agli utenti di aggiungere un nuovo prodotto alla tabella del database Product . Dopo l'inserimento di un nuovo record prodotto, la pagina visualizza la tabella aggiornata usando la pagina ListProducts.cshtml creata nella sezione precedente.
La pagina include la convalida per assicurarsi che i dati immessi dall'utente siano validi per il database. Ad esempio, il codice nella pagina assicura che sia stato immesso un valore per tutte le colonne necessarie.
Nel sito Web creare un nuovo file CSHTML denominato InsertProducts.cshtml.
Sostituire il markup esistente con quanto segue:
@{ Validation.RequireField("Name", "Product name is required."); Validation.RequireField("Description", "Product description is required."); Validation.RequireField("Price", "Product price is required."); var db = Database.Open("SmallBakery"); var Name = Request.Form["Name"]; var Description = Request.Form["Description"]; var Price = Request.Form["Price"]; if (IsPost && Validation.IsValid()) { // Define the insert query. The values to assign to the // columns in the Product table are defined as parameters // with the VALUES keyword. if(ModelState.IsValid) { var insertQuery = "INSERT INTO Product (Name, Description, Price) " + "VALUES (@0, @1, @2)"; db.Execute(insertQuery, Name, Description, Price); // Display the page that lists products. Response.Redirect("~/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: 50em;} 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>
Il corpo della pagina contiene un modulo HTML con tre caselle di testo che consentono agli utenti di immettere un nome, una descrizione e un prezzo. Quando gli utenti fai clic sul pulsante Inserisci , il codice nella parte superiore della pagina apre una connessione al database SmallBakery.sdf . Si ottengono quindi i valori inviati dall'utente usando l'oggetto
Request
e si assegnano tali valori alle variabili locali.Per verificare che l'utente ha immesso un valore per ogni colonna richiesta, registrare ogni
<input>
elemento che si vuole convalidare:Validation.RequireField("Name", "Product name is required."); Validation.RequireField("Description", "Product description is required."); Validation.RequireField("Price", "Product price is required.");
Il
Validation
helper controlla che sia presente un valore in ognuno dei campi registrati. È possibile verificare se tutti i campi passati alla convalida controllandoValidation.IsValid()
, che in genere si esegue prima di elaborare le informazioni ottenute dall'utente:if (IsPost && Validation.IsValid()) { // Process information here }
L'operatore
&&
indica AND: questo test è Se si tratta di un invio di moduli E tutti i campi hanno superato la convalida.Se tutte le colonne convalidate (nessuna era vuota), procedere e creare un'istruzione SQL per inserire i dati e quindi eseguirla come illustrato di seguito:
var insertQuery = "INSERT INTO Product (Name, Description, Price) VALUES (@0, @1, @2)";
Per inserire i valori, è necessario includere segnaposto dei parametri (
@0
,@1
,@2
).Nota
Come precauzione per la sicurezza, passare sempre i valori a un'istruzione SQL usando parametri, come illustrato nell'esempio precedente. In questo modo è possibile convalidare i dati dell'utente, oltre a proteggere dai tentativi di inviare comandi dannosi al database (talvolta definiti attacchi di inserimento SQL).
Per eseguire la query, usare questa istruzione, passandola alle variabili che contengono i valori da sostituire per i segnaposto:
db.Execute(insertQuery, Name, Description, Price);
Dopo l'esecuzione dell'istruzione
Insert Into
, inviare l'utente alla pagina che elenca i prodotti usando questa riga:Response.Redirect("~/ListProducts");
Se la convalida non è riuscita, ignorare l'inserimento. È invece disponibile un helper nella pagina che può visualizzare i messaggi di errore accumulati (se presenti):
@Html.ValidationSummary("Errors with your submission:")
Si noti che il blocco di stile nel markup include una definizione di classe CSS denominata
.validation-summary-errors
. Si tratta del nome della classe CSS usata per impostazione predefinita per l'elemento<div>
che contiene eventuali errori di convalida. In questo caso, la classe CSS specifica che gli errori di riepilogo della convalida vengono visualizzati in rosso e in grassetto, ma è possibile definire la.validation-summary-errors
classe per visualizzare qualsiasi formattazione desiderata.
Test della pagina Inserisci
Visualizzare la pagina in un browser. La pagina visualizza un modulo simile a quello visualizzato nella figura seguente.
Immettere i valori per tutte le colonne, ma assicurarsi di lasciare vuota la colonna Price .
Fare clic su Inserisci. Nella pagina viene visualizzato un messaggio di errore, come illustrato nella figura seguente. Non viene creato alcun nuovo record.
Compilare completamente il modulo e quindi fare clic su Inserisci. Questa volta viene visualizzata la pagina ListProducts.cshtml e viene visualizzato il nuovo record.
Aggiornamento dei dati in un database
Dopo aver immesso i dati in una tabella, potrebbe essere necessario aggiornarlo. Questa procedura illustra come creare due pagine simili a quelle create per l'inserimento dei dati in precedenza. La prima pagina visualizza i prodotti e consente agli utenti di selezionarne uno da modificare. La seconda pagina consente agli utenti di apportare effettivamente le modifiche e salvarle.
Nota
Importante In un sito Web di produzione, in genere si limitano gli utenti autorizzati a apportare modifiche ai dati. Per informazioni su come configurare l'appartenenza e sui modi per autorizzare gli utenti a eseguire attività nel sito, vedere Aggiunta di sicurezza e appartenenza a un sito Pagine Web ASP.NET.
Nel sito Web creare un nuovo file CSHTML denominato EditProducts.cshtml.
Sostituire il markup esistente nel file con quanto segue:
@{ 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>
L'unica differenza tra questa pagina e la pagina ListProducts.cshtml precedente è che la tabella HTML in questa pagina include una colonna aggiuntiva che visualizza un collegamento Modifica . Quando si fa clic su questo collegamento, si passa alla pagina UpdateProducts.cshtml (che verrà creata successivamente) in cui è possibile modificare il record selezionato.
Esaminare il codice che crea il collegamento Modifica :
<a href="@Href("~/UpdateProducts", row.Id)">Edit</a></td>
In questo modo viene creato un elemento HTML
<a>
il cuihref
attributo è impostato in modo dinamico. L'attributohref
specifica la pagina da visualizzare quando l'utente fa clic sul collegamento. Passa anche ilId
valore della riga corrente al collegamento. Quando la pagina viene eseguita, l'origine della pagina potrebbe contenere collegamenti come indicato di seguito:<a href="UpdateProducts/1">Edit</a></td> <a href="UpdateProducts/2">Edit</a></td> <a href="UpdateProducts/3">Edit</a></td>
Si noti che l'attributo
href
è impostato suUpdateProducts/n
, dove n è un numero di prodotto. Quando un utente fa clic su uno di questi collegamenti, l'URL risultante avrà un aspetto simile al seguente:http://localhost:18816/UpdateProducts/6
In altre parole, il numero di prodotto da modificare verrà passato nell'URL.
Visualizzare la pagina in un browser. La pagina visualizza i dati in un formato simile al seguente:
Verrà quindi creata la pagina che consente agli utenti di aggiornare effettivamente i dati. La pagina di aggiornamento include la convalida per convalidare i dati immessi dall'utente. Ad esempio, il codice nella pagina assicura che sia stato immesso un valore per tutte le colonne necessarie.
Nel sito Web creare un nuovo file CSHTML denominato UpdateProducts.cshtml.
Sostituire il markup esistente nel file con il codice seguente.
@{ Validation.RequireField("Name", "Product name is required."); Validation.RequireField("Description", "Product description is required."); Validation.RequireField("Price", "Product price is required."); var Name = ""; var Description = ""; var Price = Decimal.Zero; var ProductId = UrlData[0]; if (ProductId.IsEmpty()) { Response.Redirect("~/EditProducts"); } var db = Database.Open("SmallBakery"); if (IsPost && Validation.IsValid()) { var updateQueryString = "UPDATE Product SET Name=@0, Description=@1, Price=@2 WHERE Id=@3" ; Name = Request["Name"]; Description = Request["Description"]; Price = Request["Price"].AsDecimal(); db.Execute(updateQueryString, Name, Description, Price, ProductId); Response.Redirect(@Href("~/EditProducts")); } else { var selectQueryString = "SELECT * FROM Product WHERE Id=@0"; var row = db.QuerySingle(selectQueryString, ProductId); Name = row.Name; Description = row.Description; Price = row.Price; } } <!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>
Il corpo della pagina contiene un modulo HTML in cui viene visualizzato un prodotto e dove gli utenti possono modificarli. Per visualizzare il prodotto, usare questa istruzione SQL:
SELECT * FROM Product WHERE Id=@0
Verrà selezionato il prodotto il cui ID corrisponde al valore passato nel
@0
parametro. Poiché ID è la chiave primaria e pertanto deve essere univoco, è possibile selezionare un solo record del prodotto in questo modo. Per ottenere il valore ID da passare a questaSelect
istruzione, è possibile leggere il valore passato alla pagina come parte dell'URL usando la sintassi seguente:var ProductId = UrlData[0];
Per recuperare effettivamente il record del prodotto, si usa il
QuerySingle
metodo, che restituirà solo un record:var row = db.QuerySingle(selectQueryString, ProductId);
La singola riga viene restituita nella
row
variabile. È possibile ottenere dati da ogni colonna e assegnarlo alle variabili locali come segue:var Name = row.Name; var Description = row.Description; var Price = row.Price;
Nel markup per il modulo, questi valori vengono visualizzati automaticamente nelle singole caselle di testo usando codice incorporato come segue:
<input name="Name" type="text" size="50" value="@Name" />
Tale parte del codice visualizza il record del prodotto da aggiornare. Dopo aver visualizzato il record, l'utente può modificare singole colonne.
Quando l'utente invia il modulo facendo clic sul pulsante Aggiorna , il codice nel
if(IsPost)
blocco viene eseguito. Ottiene i valori dell'utente dall'oggettoRequest
, archivia i valori nelle variabili e verifica che ogni colonna sia stata compilata. Se la convalida passa, il codice crea l'istruzione sql Update seguente:UPDATE Product SET Name=@0, Description=@1, Price=@2, WHERE ID=@3
In un'istruzione SQL
Update
specificare ogni colonna per aggiornare e il valore su cui impostarlo. In questo codice i valori vengono specificati usando i segnaposto@0
dei parametri , ,@1
@2
, e così via. Come indicato in precedenza, per la sicurezza, è consigliabile passare sempre i valori a un'istruzione SQL usando parametri.Quando si chiama il
db.Execute
metodo, si passano le variabili che contengono i valori nell'ordine che corrisponde ai parametri nell'istruzione SQL:db.Execute(updateQueryString, Name, Description, Price, ProductId);
Dopo l'esecuzione dell'istruzione
Update
, chiamare il metodo seguente per reindirizzare l'utente alla pagina di modifica:Response.Redirect(@Href("~/EditProducts"));
L'effetto è che l'utente vede un elenco aggiornato dei dati nel database e può modificare un altro prodotto.
Salvare la pagina.
Eseguire la pagina EditProducts.cshtml (non la pagina di aggiornamento) e quindi fare clic su Modifica per selezionare un prodotto da modificare. Viene visualizzata la pagina UpdateProducts.cshtml che mostra il record selezionato.
Apportare una modifica e fare clic su Aggiorna. L'elenco dei prodotti viene visualizzato di nuovo con i dati aggiornati.
Eliminazione di dati in un database
In questa sezione viene illustrato come consentire agli utenti di eliminare un prodotto dalla tabella Database product . L'esempio è costituito da due pagine. Nella prima pagina gli utenti selezionano un record da eliminare. Il record da eliminare viene quindi visualizzato in una seconda pagina che consente loro di confermare che vogliono eliminare il record.
Nota
Importante In un sito Web di produzione, in genere si limitano gli utenti autorizzati a apportare modifiche ai dati. Per informazioni su come configurare l'appartenenza e sui modi per autorizzare l'utente a eseguire attività nel sito, vedere Aggiunta di sicurezza e appartenenza a un sito di Pagine Web ASP.NET.
Nel sito Web creare un nuovo file CSHTML denominato ListProductsForDelete.cshtml.
Sostituire il markup esistente con quanto segue:
@{ 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> </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>
Questa pagina è simile alla pagina EditProducts.cshtml precedente. Tuttavia, invece di visualizzare un collegamento Modifica per ogni prodotto, viene visualizzato un collegamento Elimina . Il collegamento Delete viene creato usando il codice incorporato seguente nel markup:
<a href="@Href("~/DeleteProduct", row.Id)">Delete</a>
In questo modo viene creato un URL simile al seguente quando gli utenti fanno clic sul collegamento:
http://<server>/DeleteProduct/4
L'URL chiama una pagina denominata DeleteProduct.cshtml (che verrà creata successivamente) e lo passa l'ID del prodotto da eliminare (qui, 4).
Salvare il file, ma lasciarlo aperto.
Creare un altro file CHTML denominato DeleteProduct.cshtml. Sostituire il contenuto esistente con quanto segue:
@{ var db = Database.Open("SmallBakery"); var ProductId = UrlData[0]; if (ProductId.IsEmpty()) { Response.Redirect("~/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>
Questa pagina viene chiamata da ListProductsForDelete.cshtml e consente agli utenti di confermare che vogliono eliminare un prodotto. Per elencare il prodotto da eliminare, si ottiene l'ID del prodotto da eliminare dall'URL usando il codice seguente:
var ProductId = UrlData[0];
La pagina chiede quindi all'utente di fare clic su un pulsante per eliminare effettivamente il record. Questa è una misura di sicurezza importante: quando si eseguono operazioni sensibili nel sito Web, ad esempio l'aggiornamento o l'eliminazione dei dati, queste operazioni devono sempre essere eseguite usando un'operazione POST, non un'operazione GET. Se il sito è configurato in modo che un'operazione di eliminazione possa essere eseguita usando un'operazione GET, chiunque può passare un URL come
http://<server>/DeleteProduct/4
ed eliminare qualsiasi elemento desiderato dal database. Aggiungendo la conferma e la codifica della pagina in modo che l'eliminazione possa essere eseguita solo usando un POST, si aggiunge una misura di sicurezza al sito.L'operazione di eliminazione effettiva viene eseguita usando il codice seguente, che conferma prima di tutto che si tratta di un'operazione di post-operazione e che l'ID non sia vuoto:
if( IsPost && !ProductId.IsEmpty()) { var deleteQueryString = "DELETE FROM Product WHERE Id=@0"; db.Execute(deleteQueryString, ProductId); Response.Redirect("~/ListProductsForDelete"); }
Il codice esegue un'istruzione SQL che elimina il record specificato e quindi reindirizza l'utente alla pagina di presentazione.
Eseguire ListProductsForDelete.cshtml in un browser.
Fare clic sul collegamento Elimina per uno dei prodotti. La pagina DeleteProduct.cshtml viene visualizzata per confermare che si vuole eliminare tale record.
Fare clic sul pulsante Elimina. Il record del prodotto viene eliminato e la pagina viene aggiornata con un elenco di prodotti aggiornato.
Suggerimento
Connessione a un database
È possibile connettersi a un database in due modi. Il primo consiste nell'usare il Database.Open
metodo e per specificare il nome del file di database (meno l'estensione sdf ):
var db = Database.Open("SmallBakery");
Il Open
metodo presuppone che l'oggetto .il file sdf si trova nella cartella App_Data del sito Web. Questa cartella è progettata in modo specifico per contenere i dati. Ad esempio, dispone di autorizzazioni appropriate per consentire al sito Web di leggere e scrivere dati e come misura di sicurezza, WebMatrix non consente l'accesso ai file da questa cartella.
Il secondo modo consiste nell'usare una stringa di connessione. Una stringa di connessione contiene informazioni sulla connessione a un database. Ciò può includere un percorso di file oppure può includere il nome di un database SQL Server in un server locale o remoto, insieme a un nome utente e una password per connettersi a tale server. Se si mantengono i dati in una versione gestita centralmente di SQL Server, ad esempio nel sito di un provider di hosting, si usa sempre una stringa di connessione per specificare le informazioni di connessione del database.
In WebMatrix le stringhe di connessione vengono in genere archiviate in un file XML denominato Web.config. Poiché il nome implica, è possibile usare un file Web.config nella radice del sito Web per archiviare le informazioni di configurazione del sito, incluse le stringhe di connessione che il sito potrebbe richiedere. Un esempio di stringa di connessione in un file diWeb.config potrebbe essere simile al seguente. Nota $CREDENTIAL_PLACEHOLDER$
è un segnaposto per la coppia chiave/valore della password:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add
name="SQLServerConnectionString"
connectionString= "server=myServer;database=myDatabase;uid=username;$CREDENTIAL_PLACEHOLDER$"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
Nell'esempio la stringa di connessione punta a un database in un'istanza di SQL Server in esecuzione in un server in un punto qualsiasi (anziché in un file sdf locale). È necessario sostituire i nomi appropriati per myServer
e myDatabase
e specificare SQL Server valori di accesso per username
e password
. I valori nome utente e password non sono necessariamente uguali alle credenziali di Windows o ai valori che il provider di hosting ha fornito per l'accesso ai server. Controllare con l'amministratore i valori esatti necessari.
Il Database.Open
metodo è flessibile, perché consente di passare il nome di un file sdf di database o il nome di una stringa di connessione archiviata nel file Web.config . Nell'esempio seguente viene illustrato come connettersi al database usando la stringa di connessione illustrata nell'esempio precedente:
@{
var db = Database.Open("SQLServerConnectionString");
}
Come indicato, il Database.Open
metodo consente di passare un nome di database o una stringa di connessione e si scoprirà quale usare. Questo è molto utile quando si distribuisce (pubblica) il sito Web. È possibile usare un file con estensione sdf nella cartella App_Data durante lo sviluppo e il test del sito. Quando si sposta il sito in un server di produzione, è possibile usare una stringa di connessione nel file Web.config con lo stesso nome del file con estensione sdf , ma che punta al database del provider di hosting, tutto senza dover modificare il codice.
Infine, se si vuole lavorare direttamente con una stringa di connessione, è possibile chiamare il Database.OpenConnectionString
metodo e passarlo la stringa di connessione effettiva anziché solo il nome di uno nel file Web.config . Questo potrebbe essere utile in situazioni in cui per qualche motivo non si ha accesso alla stringa di connessione (o i valori in esso contenuti, ad esempio il nome del file con estensione sdf ) fino a quando la pagina non è in esecuzione. Tuttavia, per la maggior parte degli scenari, è possibile usare Database.Open
come descritto in questo articolo.