Uso di colonne calcolate (VB)

di Scott Mitchell

Scarica il PDF

Quando si crea una tabella di database, Microsoft SQL Server consente di definire una colonna calcolata il cui valore viene calcolato da un'espressione che in genere fa riferimento ad altri valori nello stesso record di database. Tali valori sono di sola lettura nel database, che richiede considerazioni speciali quando si lavora con TableAdapter. In questa esercitazione si apprenderà come soddisfare le sfide poste dalle colonne calcolate.

Introduzione

Microsoft SQL Server consente colonne calcolate, ovvero colonne i cui valori vengono calcolati da un'espressione che in genere fa riferimento ai valori di altre colonne nella stessa tabella. Ad esempio, un modello di dati di rilevamento dell'ora potrebbe avere una tabella denominata ServiceLog con colonne tra cui ServicePerformed, EmployeeIDRate, e Duration, tra le altre. Anche se l'importo dovuto per ogni elemento di servizio (moltiplicato per la durata) può essere calcolato tramite una pagina Web o un'altra interfaccia programmatica, potrebbe essere utile includere una colonna nella ServiceLog tabella denominata AmountDue che ha segnalato queste informazioni. Questa colonna può essere creata come colonna normale, ma deve essere aggiornata ogni volta che i valori delle Rate colonne o Duration vengono modificati. Un approccio migliore consiste nel rendere la AmountDue colonna una colonna calcolata usando l'espressione Rate * Duration. In questo modo SQL Server calcolare automaticamente il valore della AmountDue colonna ogni volta che viene fatto riferimento in una query.

Poiché un valore della colonna calcolata è determinato da un'espressione, tali colonne sono di sola lettura e pertanto non possono avere valori assegnati in INSERT istruzioni o UPDATE . Tuttavia, quando le colonne calcolate fanno parte della query principale per un TableAdapter che usa istruzioni SQL ad hoc, vengono incluse automaticamente nelle istruzioni e UPDATE generate INSERT automaticamente. Di conseguenza, le query e UPDATE le proprietà TableAdapter INSERT devono UpdateCommandInsertCommand essere aggiornate per rimuovere i riferimenti a qualsiasi colonna calcolata.

Un problema relativo all'uso di colonne calcolate con un TableAdapter che usa istruzioni SQL ad hoc consiste nel fatto che le query e UPDATE gli oggetti INSERT TableAdapter vengono rigenerati automaticamente ogni volta che viene completata la Configurazione guidata TableAdapter. Pertanto, le colonne calcolate rimosse manualmente dalle INSERT query e UPDATE verranno nuovamente visualizzate se la procedura guidata viene rieseguita. Anche se gli oggetti TableAdapter che usano stored procedure non soffrono di questa fragilità, hanno i propri quirk che verranno affrontati nel passaggio 3.

In questa esercitazione si aggiungerà una colonna calcolata alla Suppliers tabella nel database Northwind e quindi si creerà un TableAdapter corrispondente per usare questa tabella e la relativa colonna calcolata. L'oggetto TableAdapter userà stored procedure anziché istruzioni SQL ad hoc in modo che le personalizzazioni non vengano perse quando viene usata la Configurazione guidata TableAdapter.

Iniziamo!

Passaggio 1: Aggiunta di una colonna calcolata allaSupplierstabella

Il database Northwind non dispone di colonne calcolate, quindi sarà necessario aggiungerne uno. Per questa esercitazione è possibile aggiungere una colonna calcolata alla Suppliers tabella denominata FullContactName che restituisce il nome, il titolo e la società per cui lavorano nel formato seguente: ContactName (ContactTitle, CompanyName). Questa colonna calcolata può essere utilizzata nei report quando vengono visualizzate informazioni sui fornitori.

Per iniziare, aprire la definizione di Suppliers tabella facendo clic con il pulsante destro del Suppliers mouse sulla tabella in Esplora server e scegliendo Apri definizione tabella dal menu di scelta rapida. Verranno visualizzate le colonne della tabella e le relative proprietà, ad esempio il tipo di dati, se consentite NULL e così via. Per aggiungere una colonna calcolata, iniziare digitando il nome della colonna nella definizione della tabella. Immettere quindi l'espressione nella casella di testo (Formula) nella sezione Specifica colonna calcolata nella Finestra Proprietà colonna (vedere la figura 1). Denominare la colonna FullContactName calcolata e usare l'espressione seguente:

ContactName + ' (' + CASE WHEN ContactTitle IS NOT NULL THEN 
    ContactTitle + ', ' ELSE '' END + CompanyName + ')'

Si noti che le stringhe possono essere concatenate in SQL usando l'operatore + . L'istruzione CASE può essere usata come condizionale in un linguaggio di programmazione tradizionale. Nell'espressione precedente l'istruzione CASE può essere letta come: Se ContactTitle non NULL è, restituisce il ContactTitle valore concatenato con una virgola, altrimenti non genera nulla. Per altre informazioni sull'utilità dell'istruzioneCASE, vedere Istruzioni SQLCASE.

Nota

Invece di usare un'istruzione CASE in questo caso, è possibile usare ISNULL(ContactTitle, '')in alternativa . ISNULL(checkExpression, replacementValue) restituisce checkExpression se non è NULL, in caso contrario restituisce replacementValue. ISNULL Anche se o CASE funzionerà in questa istanza, esistono scenari più complessi in cui la flessibilità dell'istruzione CASE non può essere confrontata con ISNULL.

Dopo aver aggiunto questa colonna calcolata, la schermata dovrebbe essere simile alla schermata nella figura 1.

Aggiungere una colonna calcolata denominata FullContactName alla tabella Suppliers

Figura 1: Aggiungere una colonna calcolata denominata FullContactName alla tabella (fare clic per visualizzare l'immagineSuppliers a dimensione intera)

Dopo aver denominato la colonna calcolata e aver immesso l'espressione, salvare le modifiche apportate alla tabella facendo clic sull'icona Salva sulla barra degli strumenti, premendo CTRL+S oppure passando al menu File e scegliendo Salva Suppliers.

Il salvataggio della tabella deve aggiornare Esplora server, inclusa la colonna appena aggiunta nell'elenco Suppliers di colonne della tabella. Inoltre, l'espressione immessa nella casella di testo (Formula) verrà adattata automaticamente a un'espressione equivalente che rimuove spazi vuoti non necessari, racchiude i nomi di colonna tra parentesi ([]) e include parentesi per mostrare in modo più esplicito l'ordine delle operazioni:

(((([ContactName]+' (')+case when [ContactTitle] IS NOT NULL 
    then [ContactTitle]+', ' else '' end)+[CompanyName])+')')

Per altre informazioni sulle colonne calcolate in Microsoft SQL Server, vedere la documentazione tecnica. Vedere anche procedura: Specificare colonne calcolate per una procedura dettagliata per la creazione di colonne calcolate.

Nota

Per impostazione predefinita, le colonne calcolate non vengono archiviate fisicamente nella tabella, ma vengono invece ricalcolate ogni volta che viene fatto riferimento in una query. Selezionando la casella di controllo È persistente, è tuttavia possibile indicare SQL Server di archiviare fisicamente la colonna calcolata nella tabella. In questo modo è possibile creare un indice nella colonna calcolata, che può migliorare le prestazioni delle query che usano il valore della colonna calcolata nelle clausole WHERE . Per altre informazioni , vedere Creazione di indici in colonne calcolate .

Passaggio 2: Visualizzazione dei valori delle colonne calcolate

Prima di iniziare a lavorare sul livello di accesso ai dati, è necessario dedicare un minuto per visualizzare i FullContactName valori. In Esplora server fare clic con il pulsante destro del mouse sul nome della Suppliers tabella e scegliere Nuova query dal menu di scelta rapida. Verrà visualizzata una finestra Query che richiede di scegliere le tabelle da includere nella query. Aggiungere la Suppliers tabella e fare clic su Chiudi. Controllare quindi le CompanyNamecolonne , ContactName, ContactTitlee FullContactName della tabella Suppliers. Infine, fare clic sull'icona del punto esclamativo rosso nella barra degli strumenti per eseguire la query e visualizzare i risultati.

Come illustrato nella figura 2, i risultati includono FullContactName, che elenca le CompanyNamecolonne , ContactNamee ContactTitle usando il formato ContactName (ContactTitle, CompanyName) .

FullContactName usa format ContactName (ContactTitle, CompanyName)

Figura 2: FullContactName Usa il formato ContactName (, CompanyName) (ContactTitlefare clic per visualizzare l'immagine a dimensione intera)

Passaggio 3: Aggiunta diSuppliersTableAdapteral livello di accesso ai dati

Per lavorare con le informazioni sui fornitori nell'applicazione, è necessario prima creare un TableAdapter e DataTable in DAL. In teoria, questa operazione verrebbe eseguita usando gli stessi passaggi semplici esaminati nelle esercitazioni precedenti. Tuttavia, l'uso delle colonne calcolate introduce alcune rughe che meritano una discussione.

Se si usa un TableAdapter che usa istruzioni SQL ad hoc, è sufficiente includere la colonna calcolata nella query principale di TableAdapter tramite la Configurazione guidata TableAdapter. Verranno tuttavia generate INSERT automaticamente istruzioni e UPDATE che includono la colonna calcolata. Se si tenta di eseguire uno di questi metodi, un SqlException oggetto con il messaggio La colonna ColumnName non può essere modificata perché si tratta di una colonna calcolata o è il risultato di un operatore UNION verrà generata. Anche se l'istruzione INSERT e UPDATE può essere modificata manualmente tramite le proprietà e UpdateCommand di TableAdapterInsertCommand, queste personalizzazioni andranno perse ogni volta che viene rieseguita la configurazione guidata TableAdapter.

A causa della fragilità di TableAdapter che usano istruzioni SQL ad hoc, è consigliabile usare stored procedure quando si usano colonne calcolate. Se si usano stored procedure esistenti, è sufficiente configurare TableAdapter come descritto nell'esercitazione Uso di stored procedure esistenti per l'esercitazione TableAdapters di DataSet tipizzato . Se è disponibile la creazione guidata TableAdapter, tuttavia, è importante omettere inizialmente le colonne calcolate dalla query principale. Se si include una colonna calcolata nella query principale, la Configurazione guidata TableAdapter informerà, al termine, che non può creare le stored procedure corrispondenti. In breve, è necessario configurare inizialmente TableAdapter usando una query main senza colonne calcolata e quindi aggiornare manualmente la stored procedure corrispondente e tableAdapter per SelectCommand includere la colonna calcolata. Questo approccio è simile a quello usato nell'esercitazione Aggiornamento di TableAdapter per l'usoJOINdi .

Per questa esercitazione, aggiungere un nuovo TableAdapter e crearne automaticamente le stored procedure. Di conseguenza, sarà necessario omettere inizialmente la FullContactName colonna calcolata dalla query principale.

Per iniziare, aprire l'oggetto NorthwindWithSprocs DataSet nella ~/App_Code/DAL cartella . Fare clic con il pulsante destro del mouse sul Designer e scegliere di aggiungere un nuovo TableAdapter dal menu di scelta rapida. Verrà avviata la Configurazione guidata TableAdapter. Specificare il database per eseguire query sui dati da (NORTHWNDConnectionString da Web.config) e fare clic su Avanti. Poiché non sono ancora state create stored procedure per l'esecuzione di query o la modifica della Suppliers tabella, selezionare l'opzione Crea nuove stored procedure in modo che la procedura guidata li crei e fare clic su Avanti.

Scegliere l'opzione Crea nuove stored procedure

Figura 3: Scegliere l'opzione Crea nuove stored procedure (fare clic per visualizzare l'immagine a dimensione intera)

Il passaggio successivo richiede la query principale. Immettere la query seguente, che restituisce le SupplierIDcolonne , CompanyName, ContactNamee ContactTitle per ogni fornitore. Si noti che questa query omette intenzionalmente la colonna calcolata (FullContactName); la stored procedure corrispondente verrà aggiornata in modo da includere questa colonna nel passaggio 4.

SELECT SupplierID, CompanyName, ContactName, ContactTitle
FROM Suppliers

Dopo aver immesso la query principale e aver fatto clic su Avanti, la procedura guidata consente di denominare le quattro stored procedure generate. Denominare queste stored procedure Suppliers_Select, Suppliers_Insert, Suppliers_Updatee Suppliers_Delete, come illustrato nella figura 4.

Personalizzare i nomi delle stored procedure generate automaticamente

Figura 4: Personalizzare i nomi delle stored procedure generate automaticamente (fare clic per visualizzare l'immagine a dimensione intera)

Il passaggio successivo della procedura guidata consente di denominare i metodi di TableAdapter e di specificare i modelli usati per accedere ai dati e aggiornarli. Lasciare selezionate tutte e tre le caselle di controllo, ma rinominare il GetData metodo in GetSuppliers. Fare clic su Fine per completare la procedura guidata.

Rinominare il metodo GetData in GetSuppliers

Figura 5: Rinominare il metodo in GetSuppliers (fare clic per visualizzare l'immagineGetData a dimensione intera)

Dopo aver fatto clic su Fine, la procedura guidata creerà le quattro stored procedure e aggiungerà TableAdapter e dataTable corrispondente al DataSet tipizzato.

Passaggio 4: Inclusione della colonna calcolata nella query principale di TableAdapter

A questo punto è necessario aggiornare TableAdapter e DataTable creato nel passaggio 3 per includere la FullContactName colonna calcolata. Questa operazione comporta due passaggi:

  1. Aggiornamento della Suppliers_Select stored procedure per restituire la FullContactName colonna calcolata e
  2. Aggiornamento di DataTable per includere una colonna corrispondente FullContactName .

Per iniziare, passare a Esplora server ed eseguire il drill-down nella cartella Stored procedure. Aprire la Suppliers_Select stored procedure e aggiornare la SELECT query in modo da includere la FullContactName colonna calcolata:

SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers

Salvare le modifiche apportate alla stored procedure facendo clic sull'icona Salva sulla barra degli strumenti, premendo CTRL+S oppure scegliendo l'opzione Salva Suppliers_Select dal menu File.

Tornare quindi al Designer DataSet, fare clic con il pulsante destro del SuppliersTableAdaptermouse su e scegliere Configura dal menu di scelta rapida. Si noti che la Suppliers_Select colonna include ora la colonna nell'insieme FullContactName Data Columns.

Eseguire la Configurazione guidata TableAdapter per aggiornare le colonne di DataTable

Figura 6: Eseguire la Configurazione guidata TableAdapter per aggiornare le colonne di DataTable (fare clic per visualizzare l'immagine a dimensione intera)

Fare clic su Fine per completare la procedura guidata. Verrà aggiunta automaticamente una colonna corrispondente all'oggetto SuppliersDataTable. La procedura guidata TableAdapter è sufficientemente intelligente da rilevare che la FullContactName colonna è una colonna calcolata e pertanto di sola lettura. Di conseguenza, imposta la proprietà della colonna su ReadOnlytrue. Per verificarlo, selezionare la colonna da SuppliersDataTable e quindi passare alla Finestra Proprietà (vedere la figura 7). Si noti che anche le FullContactName proprietà e MaxLength della DataType colonna vengono impostate di conseguenza.

La colonna FullContactName è contrassegnata come di sola lettura

Figura 7: La FullContactName colonna è contrassegnata come Read-Only (fare clic per visualizzare l'immagine a dimensione intera)

Passaggio 5: Aggiunta di unGetSupplierBySupplierIDmetodo a TableAdapter

Per questa esercitazione verrà creata una pagina ASP.NET che visualizza i fornitori in una griglia aggiornabile. Nelle esercitazioni precedenti è stato aggiornato un singolo record dal livello della logica di business recuperando tale record specifico da DAL come DataTable fortemente tipizzato, aggiornandone le proprietà e quindi inviando di nuovo DataTable aggiornato a DAL per propagare le modifiche al database. Per eseguire questo primo passaggio, ovvero il recupero del record da aggiornare da DAL, è prima necessario aggiungere un GetSupplierBySupplierID(supplierID) metodo a DAL.

Fare clic con il SuppliersTableAdapter pulsante destro del mouse su in Progettazione set di dati e scegliere l'opzione Aggiungi query dal menu di scelta rapida. Come illustrato nel passaggio 3, consentire alla procedura guidata di generare una nuova stored procedure selezionando l'opzione Crea nuova stored procedure (fare riferimento alla figura 3 per uno screenshot di questo passaggio della procedura guidata). Poiché questo metodo restituirà un record con più colonne, indicare che si vuole usare una query SQL che rappresenta un oggetto SELECT che restituisce righe e fare clic su Avanti.

Scegliere l'opzione SELECT che restituisce righe

Figura 8: Scegliere l'opzione SELECT che restituisce righe (fare clic per visualizzare l'immagine a dimensione intera)

Il passaggio successivo richiede che la query venga usata per questo metodo. Immettere quanto segue, che restituisce gli stessi campi dati della query principale, ma per un determinato fornitore.

SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
WHERE SupplierID = @SupplierID

Nella schermata successiva viene chiesto di denominare la stored procedure che verrà generata automaticamente. Denominare questa stored procedure Suppliers_SelectBySupplierID e fare clic su Avanti.

Assegnare alla stored procedure il nome Suppliers_SelectBySupplierID

Figura 9: Assegnare un nome alla stored procedure Suppliers_SelectBySupplierID (fare clic per visualizzare l'immagine a dimensione intera)

Infine, la procedura guidata richiede i modelli di accesso ai dati e i nomi dei metodi da usare per TableAdapter. Lasciare entrambe le caselle di controllo selezionate, ma rinominare rispettivamente i FillBy metodi FillBySupplierID e GetDataBy in e GetSupplierBySupplierID.

Denominare i metodi TableAdapter FillBySupplierID e GetSupplierBySupplierID

Figura 10: Assegnare un nome ai metodi FillBySupplierID TableAdapter e GetSupplierBySupplierIDfare clic per visualizzare l'immagine a dimensione intera

Fare clic su Fine per completare la procedura guidata.

Passaggio 6: Creazione del livello della logica di business

Prima di creare una pagina di ASP.NET che usa la colonna calcolata creata nel passaggio 1, è prima necessario aggiungere i metodi corrispondenti nel BLL. La pagina ASP.NET, che verrà creata nel passaggio 7, consentirà agli utenti di visualizzare e modificare i fornitori. Pertanto, abbiamo bisogno del nostro BLL per fornire, almeno, un metodo per ottenere tutti i fornitori e un altro per aggiornare un determinato fornitore.

Creare un nuovo file di classe denominato SuppliersBLLWithSprocs nella ~/App_Code/BLL cartella e aggiungere il codice seguente:

Imports NorthwindWithSprocsTableAdapters
<System.ComponentModel.DataObject()> _
Public Class SuppliersBLLWithSprocs
    Private _suppliersAdapter As SuppliersTableAdapter = Nothing
    Protected ReadOnly Property Adapter() As SuppliersTableAdapter
        Get
            If _suppliersAdapter Is Nothing Then
                _suppliersAdapter = New SuppliersTableAdapter()
            End If
            Return _suppliersAdapter
        End Get
    End Property
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Select, True)> _
    Public Function GetSuppliers() As NorthwindWithSprocs.SuppliersDataTable
        Return Adapter.GetSuppliers()
    End Function
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Update, True)> _
    Public Function UpdateSupplier(companyName As String, contactName As String, _
        contactTitle As String, supplierID As Integer) As Boolean
        Dim suppliers As NorthwindWithSprocs.SuppliersDataTable = _
            Adapter.GetSupplierBySupplierID(supplierID)
        If suppliers.Count = 0 Then
            ' no matching record found, return false
            Return False
        End If
        Dim supplier As NorthwindWithSprocs.SuppliersRow = suppliers(0)
        supplier.CompanyName = companyName
        If contactName Is Nothing Then 
            supplier.SetContactNameNull() 
        Else 
            supplier.ContactName = contactName
        End If
        If contactTitle Is Nothing Then 
            supplier.SetContactTitleNull() 
        Else 
            supplier.ContactTitle = contactTitle
        End If
        ' Update the product record
        Dim rowsAffected As Integer = Adapter.Update(supplier)
        ' Return true if precisely one row was updated, otherwise false
        Return rowsAffected = 1
    End Function
End Class

Analogamente alle altre classi BLL, SuppliersBLLWithSprocs ha una ProtectedAdapter proprietà che restituisce un'istanza della SuppliersTableAdapter classe insieme a due Public metodi: GetSuppliers e UpdateSupplier. Il GetSuppliers metodo chiama e restituisce l'oggetto SuppliersDataTable restituito dal metodo corrispondente GetSupplier nel livello di accesso ai dati. Il UpdateSupplier metodo recupera informazioni sul fornitore specifico da aggiornare tramite una chiamata al metodo dal GetSupplierBySupplierID(supplierID) . Aggiorna quindi le CategoryNameproprietà , ContactNamee ContactTitle ed esegue il commit di queste modifiche nel database chiamando il metodo del Update livello di accesso ai dati, passando l'oggetto modificato SuppliersRow .

Nota

Ad eccezione di SupplierID e CompanyName, tutte le colonne della tabella Suppliers consentono NULL valori. Pertanto, se i contactName parametri passati o contactTitle sono Nothing necessari per impostare le proprietà e ContactTitle corrispondenti ContactName su un NULL valore di database usando rispettivamente i SetContactNameNull metodi e SetContactTitleNull .

Passaggio 7: Utilizzo della colonna calcolata dal livello presentazione

Dopo aver aggiunto la colonna calcolata alla Suppliers tabella e il dal e BLL aggiornati di conseguenza, è possibile creare una pagina ASP.NET che funziona con la FullContactName colonna calcolata. Per iniziare, aprire la ComputedColumns.aspx pagina nella AdvancedDAL cartella e trascinare un controllo GridView dalla casella degli strumenti nella Designer. Impostare la proprietà gridView su ID e, dallo smart tag, associarla a un nuovo ObjectDataSource denominato SuppliersDataSource.Suppliers Configurare ObjectDataSource per l'uso della SuppliersBLLWithSprocs classe aggiunta al passaggio 6 e fare clic su Avanti.

Configurare ObjectDataSource per l'uso della classe SuppliersBLLWithSprocs

Figura 11: Configurare ObjectDataSource per l'uso della classe (fare clic per visualizzare l'immagineSuppliersBLLWithSprocs a dimensione intera)

Nella classe sono definiti SuppliersBLLWithSprocs solo due metodi: GetSuppliers e UpdateSupplier. Assicurarsi che questi due metodi siano specificati rispettivamente nelle schede SELECT e UPDATE e fare clic su Fine per completare la configurazione di ObjectDataSource.

Al termine della configurazione guidata origine dati, Visual Studio aggiungerà un BoundField per ognuno dei campi dati restituiti. Rimuovere BoundField SupplierID e modificare le HeaderText proprietà di CompanyName, ContactName, ContactTitlee FullContactName BoundFields rispettivamente in Company, Contact Name, Title e Full Contact Name. Dallo smart tag selezionare la casella di controllo Abilita modifica per attivare le funzionalità di modifica predefinite di GridView.

Oltre ad aggiungere BoundFields a GridView, il completamento della Creazione guidata origine dati comporta anche l'impostazione della proprietà ObjectDataSource su OldValuesParameterFormatString original_{0}. Ripristinare il valore predefinito di questa impostazione, {0} .

Dopo aver apportato queste modifiche a GridView e ObjectDataSource, il markup dichiarativo dovrebbe essere simile al seguente:

<asp:GridView ID="Suppliers" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="SupplierID" DataSourceID="SuppliersDataSource">
    <Columns>
        <asp:CommandField ShowEditButton="True" />
        <asp:BoundField DataField="CompanyName" 
            HeaderText="Company" 
            SortExpression="CompanyName" />
        <asp:BoundField DataField="ContactName" 
            HeaderText="Contact Name" 
            SortExpression="ContactName" />
        <asp:BoundField DataField="ContactTitle" 
            HeaderText="Title" 
            SortExpression="ContactTitle" />
        <asp:BoundField DataField="FullContactName" 
            HeaderText="Full Contact Name"
            SortExpression="FullContactName" 
            ReadOnly="True" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="SuppliersDataSource" runat="server"
    SelectMethod="GetSuppliers" TypeName="SuppliersBLLWithSprocs" 
        UpdateMethod="UpdateSupplier">
    <UpdateParameters>
        <asp:Parameter Name="companyName" Type="String" />
        <asp:Parameter Name="contactName" Type="String" />
        <asp:Parameter Name="contactTitle" Type="String" />
        <asp:Parameter Name="supplierID" Type="Int32" />
    </UpdateParameters>
</asp:ObjectDataSource>

Visitare quindi questa pagina tramite un browser. Come illustrato nella figura 12, ogni fornitore viene elencato in una griglia che include la FullContactName colonna, il cui valore è semplicemente la concatenazione delle altre tre colonne formattate come ContactName (ContactTitle, CompanyName).

Ogni fornitore è elencato nella griglia

Figura 12: Ogni fornitore è elencato nella griglia (fare clic per visualizzare l'immagine a dimensione intera)

Facendo clic sul pulsante Modifica per un determinato fornitore viene generato un postback e tale riga viene sottoposta a rendering nella relativa interfaccia di modifica (vedere la figura 13). Le prime tre colonne eseguono il rendering nell'interfaccia di modifica predefinita, ovvero un controllo TextBox la cui Text proprietà è impostata sul valore del campo dati. La FullContactName colonna rimane tuttavia come testo. Quando i BoundFields sono stati aggiunti a GridView al completamento della configurazione guidata origine dati, la FullContactName proprietà BoundField s ReadOnly è stata impostata su True perché la colonna corrispondente FullContactName in ha SuppliersDataTable la proprietà ReadOnly impostata su True. Come indicato nel passaggio 4, la FullContactName proprietà s ReadOnly è stata impostata su True perché TableAdapter ha rilevato che la colonna era una colonna calcolata.

La colonna FullContactName non è modificabile

Figura 13: La FullContactName colonna non è modificabile (fare clic per visualizzare l'immagine a dimensione intera)

Procedere e aggiornare il valore di una o più colonne modificabili e fare clic su Aggiorna. Si noti che il FullContactName valore di s viene aggiornato automaticamente per riflettere la modifica.

Nota

GridView attualmente usa BoundFields per i campi modificabili, con conseguente interfaccia di modifica predefinita. Poiché il CompanyName campo è obbligatorio, deve essere convertito in un campo Template che include requiredFieldValidator. Lascio questo come esercizio per il lettore interessato. Per istruzioni dettagliate sulla conversione di un oggetto BoundField in un campo Modello e sull'aggiunta di controlli di convalida, vedere l'esercitazione Aggiunta di controlli di convalida all'esercitazione Modifica e inserimento di interfacce.

Riepilogo

Quando si definisce lo schema per una tabella, Microsoft SQL Server consente l'inclusione di colonne calcolate. Si tratta di colonne i cui valori vengono calcolati da un'espressione che in genere fa riferimento ai valori di altre colonne nello stesso record. Poiché i valori per le colonne calcolate sono basati su un'espressione, sono di sola lettura e non possono essere assegnati a un valore in un'istruzione INSERT o UPDATE . Ciò comporta problemi quando si usa una colonna calcolata nella query principale di un TableAdapter che tenta di generare automaticamente istruzioni , UPDATEe DELETE corrispondentiINSERT.

In questa esercitazione sono illustrate le tecniche per aggirare le sfide poste dalle colonne calcolate. In particolare, sono stati usati stored procedure in TableAdapter per superare la fragilità intrinseca negli oggetti TableAdapter che usano istruzioni SQL ad hoc. Quando la creazione guidata TableAdapter crea nuove stored procedure, è importante che la query principale ometta inizialmente tutte le colonne calcolate perché la loro presenza impedisce la generazione delle stored procedure di modifica dei dati. Dopo la configurazione iniziale di TableAdapter, la SelectCommand relativa stored procedure può essere riconfigurata per includere qualsiasi colonna calcolata.

Buon programmatori!

Informazioni sull'autore

Scott Mitchell, autore di sette libri ASP/ASP.NET e fondatore di 4GuysFromRolla.com, lavora con le tecnologie Web Microsoft dal 1998. Scott lavora come consulente indipendente, formatore e scrittore. Il suo ultimo libro è Sams Teach Yourself ASP.NET 2.0 in 24 ore. Può essere raggiunto a mitchell@4GuysFromRolla.com. o tramite il suo blog, che può essere trovato in http://ScottOnWriting.NET.

Grazie speciali

Questa serie di esercitazioni è stata esaminata da molti revisori utili. I revisori principali per questa esercitazione sono stati Hilton Geisenow e Teresa Murphy. Interessati a esaminare i prossimi articoli MSDN? In tal caso, lasciami una riga in mitchell@4GuysFromRolla.com.