Uso di colonne calcolate (C#)
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
, EmployeeID
Rate
, 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 UpdateCommand
InsertCommand
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 allaSuppliers
tabella
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.
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 CompanyName
colonne , ContactName
, ContactTitle
e 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 CompanyName
colonne , ContactName
e ContactTitle
usando il formato ldquo;ContactName
(ContactTitle
, CompanyName
).
Figura 2: FullContactName
Usa il formato ContactName
(, CompanyName
) (ContactTitle
fare clic per visualizzare l'immagine a dimensione intera)
Passaggio 3: Aggiunta diSuppliersTableAdapter
al 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'usoJOIN
di .
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.
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 SupplierID
colonne , CompanyName
, ContactName
e 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_Update
e Suppliers_Delete
, come illustrato nella figura 4.
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.
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:
- Aggiornamento della
Suppliers_Select
stored procedure per restituire laFullContactName
colonna calcolata e - 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 SuppliersTableAdapter
mouse 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.
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 ReadOnly
true
. 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.
Figura 7: La FullContactName
colonna è contrassegnata come Read-Only (fare clic per visualizzare l'immagine a dimensione intera)
Passaggio 5: Aggiunta di unGetSupplierBySupplierID
metodo 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.
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.
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
.
Figura 10: Assegnare un nome ai metodi FillBySupplierID
TableAdapter e GetSupplierBySupplierID
fare 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:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindWithSprocsTableAdapters;
[System.ComponentModel.DataObject]
public class SuppliersBLLWithSprocs
{
private SuppliersTableAdapter _suppliersAdapter = null;
protected SuppliersTableAdapter Adapter
{
get
{
if (_suppliersAdapter == null)
_suppliersAdapter = new SuppliersTableAdapter();
return _suppliersAdapter;
}
}
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, true)]
public NorthwindWithSprocs.SuppliersDataTable GetSuppliers()
{
return Adapter.GetSuppliers();
}
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Update, true)]
public bool UpdateSupplier(string companyName, string contactName,
string contactTitle, int supplierID)
{
NorthwindWithSprocs.SuppliersDataTable suppliers =
Adapter.GetSupplierBySupplierID(supplierID);
if (suppliers.Count == 0)
// no matching record found, return false
return false;
NorthwindWithSprocs.SuppliersRow supplier = suppliers[0];
supplier.CompanyName = companyName;
if (contactName == null)
supplier.SetContactNameNull();
else
supplier.ContactName = contactName;
if (contactTitle == null)
supplier.SetContactTitleNull();
else
supplier.ContactTitle = contactTitle;
// Update the product record
int rowsAffected = Adapter.Update(supplier);
// Return true if precisely one row was updated, otherwise false
return rowsAffected == 1;
}
}
Analogamente alle altre classi BLL, SuppliersBLLWithSprocs
ha una protected
Adapter
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 CategoryName
proprietà , ContactName
e 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 null
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.
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
, ContactTitle
e 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
).
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.
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 , UPDATE
e 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 all'indirizzo mitchell@4GuysFromRolla.com. o tramite il suo blog, disponibile all'indirizzo http://ScottOnWriting.NET.
Grazie speciale a
Questa serie di esercitazioni è stata esaminata da molti revisori utili. I revisori principali di questa esercitazione sono stati Hilton Geisenow e Teresa Murphy. Si è interessati a esaminare i prossimi articoli MSDN? In tal caso, rilasciami una riga in mitchell@4GuysFromRolla.com.
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per