Procedura dettagliata: recupero, aggiornamento, inserimento ed eliminazione di dati con i controlli LinqDataSource e DetailsView
Aggiornamento: novembre 2007
In questa procedura dettagliata si creeranno una semplice tabella di database e una pagina Web che utilizza il controllo LinqDataSource. La pagina Web consente agli utenti di recuperare, aggiornare, inserire ed eliminare dati dalla tabella di database. Per visualizzare i dati, verrà utilizzato un controllo DetailsView. Il controllo LinqDataSource consente di eseguire tutte queste operazioni senza scrivere un'istruzione Select, Update, Insert o Delete.
Per creare una classe che rappresenti la tabella di database contenente i valori, verrà utilizzato Object Relational Designer. Il controllo LinqDataSource interagirà con questa classe generata per recuperare, aggiornare, inserire ed eliminare i dati.
Prerequisiti
Per implementare le procedure nell'ambiente di sviluppo in uso è necessario:
Visual Studio 2008 oppure Visual Web Developer Express Edition
SQL Server Express Edition installato nel computer. Se è stato installato SQL Server, è possibile utilizzare questo programma, ma sarà necessario apportare piccole modifiche ad alcune procedure.
Un sito Web ASP.NET.
Creazione di una tabella di database
Per eseguire i passaggi di questa procedura dettagliata è necessario disporre di una tabella di database. Se non si dispone già di una tabella, è possibile crearne una seguendo la procedura riportata di seguito. Se si utilizza una tabella esistente, i passaggi di alcune procedure non corrisponderanno esattamente al database, ma i concetti illustrati nella procedura dettagliata saranno gli stessi.
Per creare una tabella di database
Se nel sito Web non è già presente una cartella App_Data, in Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto, scegliere Aggiungi cartella ASP.NET, quindi fare clic su App_Data.
Fare clic con il pulsante destro del mouse sulla cartella App_Data, quindi scegliere Aggiungi nuovo elemento.
In Modelli installati selezionare Database SQL, modificare il nome file in Reviews.mdf, quindi fare clic su Aggiungi.
In Esplora server aprire il nodo Reviews.mdf, quindi fare clic con il pulsante destro del mouse sulla cartella Tabelle.
Scegliere Aggiungi nuova tabella.
Creare le seguenti colonne nella tabella:
Nome colonna
Tipo di dati
Proprietà
MovieID
int
IsIdentity = Yes
Not null
Chiave primaria
Title
nvarchar(50)
Theater
nvarchar(50)
Review
nvarchar(1000)
Score
int
Not null
Salvare la tabella e denominarla MovieReviews.
Aggiungere alcuni record alla tabella MovieReviews con dati di esempio.
In Esplora server fare clic con il pulsante destro del mouse sulla tabella MovieReviews e scegliere Mostra dati tabella. Non è necessario specificare un valore per MovieID perché tale valore viene generato dal database.
Creazione di classi per rappresentare le entità di database
Per utilizzare il controllo LinqDataSource, è necessario disporre delle classi che rappresentano le entità di database. Per creare queste classi, è possibile utilizzare uno strumento disponibile in Visual Studio 2008 o Visual Web Developer Express Edition.
Per creare una classe per la tabella MovieReviews
Se nel sito Web non è già presente una cartella App_Code, in Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto, scegliere Aggiungi cartella ASP.NET, quindi fare clic su App_Code.
Fare clic con il pulsante destro del mouse sulla cartella App_Code, quindi scegliere Aggiungi nuovo elemento.
In Modelli installati selezionare il modello Classi LINQ to SQL, rinominare il file Reviews.dbml, quindi fare clic su Aggiungi.
Verrà visualizzata la finestra Progettazione relazionale oggetti.
In Esplora server trascinare la tabella MovieReviews nella finestra Progettazione relazionale oggetti.
La tabella MovieReviews e le relative colonne sono rappresentate come entità denominata MovieReviews nella finestra di progettazione.
Salvare il file Reviews.dbml.
In Esplora soluzioni aprire il file Reviews.designer.cs o Reviews.designer.vb.
Si noterà che ora sono presenti le classi per ReviewsDataContext e MovieReview. La classe ReviewsDataContext rappresenta il database, mentre la classe MovieReview rappresenta la tabella di database. Il costruttore senza parametri per la classe ReviewsDataContext legge la stringa di connessione dal file Web.config.
Aprire il file Web.config.
Osservare come la stringa di connessione sia stata aggiunta nell'elemento connectionStrings.
Chiudere il file della classe e il file Web.config.
Creazione e configurazione di un controllo LinqDataSource
Dopo avere creato una tabella di database e le classi che rappresentano le entità del database, è possibile utilizzare un controllo LinqDataSource in una pagina Web ASP.NET per gestire i dati.
Per creare e configurare un controllo LinqDataSource
In Visual Studio creare una nuova pagina Web ASP.NET e passare alla visualizzazione Progettazione.
Dalla scheda Dati della Casella degli strumenti trascinare un controllo LinqDataSource nell'elemento form della pagina Web.
È possibile lasciare LinqDataSource1 come valore per la proprietà ID.
Impostare la proprietà ContextTypeName su ReviewsDataContext.
Impostare la proprietà TableName su MovieReviews.
Impostare AutoPage su true e passare alla visualizzazione Origine.
Nell'esempio seguente viene illustrato il markup dichiarativo per il controllo LinqDataSource:
<asp:LinqDataSource ContextTypeName="ReviewsDataContext" TableName="MovieReviews" AutoPage="true" ID="LinqDataSource1" > </asp:LinqDataSource>
Per selezionare i dati non è stato necessario specificare comandi di database.
Aggiunta di un controllo per la visualizzazione dei dati
È possibile a questo punto aggiungere un controllo DetailsView e associarlo al controllo LinqDataSource. Il controllo DetailsView consente agli utenti di visualizzare dati gestiti dal controllo LinqDataSource.
Per connettere i dati da LinqDataSource a un controllo DetailsView
Nella scheda Dati della Casella degli strumenti fare doppio clic sul controllo DetailsView per aggiungerlo alla pagina.
È possibile lasciare DetailsView1 come valore per la proprietà ID.
Impostare la proprietà DataSourceID su LinqDataSource1.
Impostare la proprietà DataKeyNames su MovieID.
Impostare la proprietà AllowPaging su true.
Nell'esempio seguente viene illustrato il markup dichiarativo per il controllo DetailsView:
<asp:DetailsView DataSourceID="LinqDataSource1" DataKeyNames="MovieID" AllowPaging="true" ID="DetailsView1" > </asp:DetailsView>
Salvare le modifiche e premere CTRL+F5 per visualizzare la pagina in un browser.
Nel controllo DetailsView vengono visualizzati i valori per il record corrente dalla tabella MovieReviews. Il controllo DetailsView crea automaticamente i controlli Web per visualizzare ogni colonna dalla tabella di database.
Abilitazione di utenti alle operazioni di aggiornamento, inserimento ed eliminazione di dati
Il controllo LinqDataSource è in grado di creare i comandi per l'aggiornamento, l'inserimento e l'eliminazione dei dati.
Per consentire l'esecuzione di operazioni di inserimento, aggiornamento ed eliminazione
Nel controllo LinqDataSource impostare le proprietà EnableUpdate, EnableInsert e EnableDelete su true.
Nell'esempio seguente viene illustrato il markup dichiarativo per il controllo LinqDataSource:
<asp:LinqDataSource ContextTypeName="ReviewsDataContext" TableName="MovieReviews" AutoPage="true" EnableUpdate="true" EnableInsert="true" EnableDelete="true" ID="LinqDataSource1" > </asp:LinqDataSource>
Nel controllo DetailsView impostare le proprietà AutoGenerateEditButton, AutoGenerateInsertButton e AutoGenerateDeleteButton su true.
Per limitare i campi visualizzati nel controllo DetailsView e specificare l'ordine dei campi, impostare la proprietà AutoGenerateRows su false.
Aggiungere i campi per le colonne Title, Theater, Rating e Review e associarli ai campi dati corrispondenti.
Nell'esempio seguente viene illustrato il markup dichiarativo per il controllo DetailsView:
<asp:DetailsView DataSourceID="LinqDataSource1" DataKeyNames="MovieID" AutoGenerateRows="false" AutoGenerateEditButton="true" AutoGenerateInsertButton="true" AutoGenerateDeleteButton="true" AllowPaging="true" ID="DetailsView1" > <Fields> <asp:BoundField HeaderText="Title" DataField="Title" /> <asp:BoundField HeaderText="Theater" DataField="Theater" /> <asp:BoundField HeaderText="Number of Stars" DataField="Score" /> <asp:BoundField HeaderText="Review" DataField="Review" /> </Fields> </asp:DetailsView>
La colonna MovieID viene selezionata dall'origine dati con le altre colonne, tuttavia non viene visualizzata nel controllo DetailsView e l'utente non sarà in grado di modificarne il valore. È necessario selezionare la proprietà MovieID per consentire al controllo LinqDataSource di creare automaticamente i comandi per l'aggiornamento, l'inserimento e l'eliminazione dei dati.
Per queste operazioni sui dati non è stato necessario specificare i comandi.
Salvare le modifiche e premere CTRL+F5 per visualizzare la pagina in un browser.
Nel controllo DetailsView vengono visualizzati i campi per il record corrente dalla tabella MovieReviews. È possibile aggiornare, inserire ed eliminare record facendo clic sui pulsanti corrispondenti nel controllo DetailsView.
Passaggi successivi
In questa procedura dettagliata è stata illustrata la funzionalità di base per l'aggiornamento, l'inserimento e l'eliminazione di record utilizzando il controllo LinqDataSource. Per ulteriori informazioni sulle funzionalità aggiuntive del controllo LinqDataSource, è possibile procedere come segue:
È possibile filtrare i record di dati da restituire specificando un valore per la proprietà Where. È inoltre possibile selezionare solo un sottoinsieme di colonne specificando un valore per la proprietà Select. For more information, see Procedura dettagliata: selezione e applicazione di filtri a un sottoinsieme di dati con i controlli LinqDataSource e GridView.
Per assicurarsi che i dati nel database non siano stati modificati dalla lettura della pagina Web, il controllo LinqDataSource archivia i valori originali di tutti i dati selezionati. Quando l'aggiornamento viene inviato al server Web, l'oggetto LinqDataSource confronta ogni campo archiviato con il valore corrente nel database. Se i valori corrispondono, a indicare che il record non è stato modificato, l'oggetto LinqDataSource aggiorna o elimina il record. L'archiviazione di tutti i valori di colonna originali può risultare inefficiente. Per evitare questo problema, è possibile aggiungere una colonna timestamp alla tabella di database. For more information, see Procedura dettagliata: utilizzo di un timestamp con il controllo LinqDataSource per controllare l'integrità dei dati.