Home Page Home Page Articoli Colonne calcolate e parola "Child" con ADO.NET

Colonne calcolate e parola "Child" con ADO.NET

Una cosa utile di ADO.NET e' la possibilita di aggiungere ad una colonna da codice il cui valore sia il risultato di operazioni sui dati dei record (o tra valori di altre colonne). Quando si utilizza un dataset con piu tabelle collegate mediante relazioni invece, usando la parola chiave "child" si possono avere delle informazioni riguardanti le tabelle figlio, direttamente nei record della tabella
Autore: Matteo Raumer Livello:
Quando si interroga la fonte dati per ottenere le tabelle, una necessità abbastanza frequente è quella di avere una colonna che sia il risultato di un calcolo di altre, calcolate pero' "al volo" senza dover memorizzare (e quindi mantenere aggiornate) ulteriori colonne nei database.
Cio' si ottiene facilmente con query SQL tipo:

SELECT... , raggio * 3.14 AS circonferenza FROM cerchi

oppure

SELECT... , pagato-incassato AS differenza FROM pagamenti
SELECT... , "," + colonna + "," AS... (esempio nel caso di stringhe)


Inoltre nel caso tipico delle due tabelle clienti e ordini, posso avere la necessita di avere il conteggio degli ordini per quel determinato cliente direttamente come colonna aggiuntiva della tabella clienti, in modo da poterla visualizzare sullo stesso record per avere tutti i vantaggi (ordinamenti confronti etc..).
Anche in questo caso (un po' piu' complesso) si puo' sfruttare la potenza delle query SQL in questo modo:

SELECT nome,count(ordini.id) AS NumOrdini FROM clienti LEFT JOIN ordini ON clienti.nome = ordini.cliente GROUP BY nome

dove grazie alla clausola "GROUP BY" riusciamo a farci dare il numero di record della tabella in join (ordini).

Con ADO.NET riusciamo ad avere questi stessi risultati sfruttando un overload del metodo Add dell'insieme Columns (che ci permettere di aggiungere una colonna alla tabella) specificando che questa deve contere i valori risultanti da un'operazione.
Per i primi casi possiamo fare cosi:


miaTabella.Columns.Add("circonferenza", typeof(long), "raggio * 3.14");


Per il caso dei clienti-ordini, sfruttiamo il fatto di avere una relazione nel nostro DataSet tra le due tabelle e ricorriamo alla parola "Child":


mioDataset.Tables["clienti"].Columns.Add("NumOrdini", typeof(Int16), Count(Child.idOrdine)");


dove con "child" è la tabella ordini che appunto è "figlia" della clienti.
Cosi' troviamo l'informazione che cerchiamo direttamente nella tabella clienti ("padre") del dataset.
Nell'esempio serviva il conteggio (il campo scelto e' casuale dato che nel caso del conteggio ne va bene uno qualsiasi) e la relazione era unica tra le due tabelle, nel caso servisse, (ho piu di una relazione) si deve specificare anche la relazione da usare per effettuare i calcoli:

Count(Child(relazioneClientiOrdini).id)



Per questo tipo di colonne, come spiega la guida, le funzioni e le aggregazioni permesse sono:

Convert
Len
Isnull
Iif
Trim
Substring

Sum (somma)
Avg (media)
Min (minimo)
Max (massimo)
Count (conteggio)
StDev (deviazione standard statistica)
Var (varianza statistica)


Particolare comodità si trova con le funzioni come IIf (es: iif(NumOrdini>0,'ok','nessuno')) che permette di "mascherare" i dati (con valori piu utili per la visualizzazione) cosa che con SQL si puo' fare anche direttamente nella query. Ovviamente tutte le colonne calcolate non sono modificabili e quindi sono read-only.


Un paio di casi pratici...
Uno dei problemi che ho riscontrato è poter dare come sorgente di dati ad una DropDownList in ASP.NET con piu campi del database. Basta avere una colonna calcolata dove gli si dice che sia la somma (in forma stringa) delle colonne che vogliamo noi, e poi il tipo di separatore, per esempio:


miatabella.Columns.Add("miotesto",typeof(string),"campo1 + ' - ' + campo2 + ' - ' + campo3");


dove i campi possono essere di tipi diverso (data + stringhe + interi) e poi si arrangia ADO.NET a convertire in stringa.



Altro caso in cui ho visto l'ultilita' immediata rispetto alle query direttamente da stringa SQL, è quello nel fare operazioni (come left(..)) sui campi "ntext" in SQL Server (Access ce lo fa fare e ci semplifica un po').
L'esempio pratico in cui mi sono imbattuto era presentare i primi 20 caratteri di un campo descrizione, su pagina web per poter poi dare il link a tutto il dettaglio (tenendo conte del fatto che potrebbe essere anche nullo). Aggiungendo 1a colonna calcolata e bindando l'hyperlink a questo campo i problema e' presto che risolto:


miatabella.Columns.Add("smalldesc",typeof(string),"Iif(Len(testo)>20,SubString(testo,1,20) + '...',testo)");


Eh eh, grazie ADO.NET ;-)


Pro
Permette di fare operazioni uguali a SQL tra tabelle del DataSet, potenzialmente anche da fonti eterogenee. La parola "child" evita di dover raggruppare per un numero lungo di campi, percio' basta solamente una relazione.
Permette di fare operazioni con tipi di campo che non si possono fare da stringa SQL

Contro
La velocita' della versione SQL è sicuramente maggiore perche viene caricato un set di dati gia' calcolati (nel caso di SQL Server poi viene fatto dal motore del server stesso), operazione che viene invece svolta in memoria dal client nel caso di ADO.NET.
Questa lentezza, specialmente con set di dati ridotti, e' mediamente e' quasi impercettibile.
Voto medio articolo: 2.5 Numero Voti: 2
Matteo Raumer

Matteo Raumer

Laurea breve in Ingegneria Elettronica presso l'Universita di Padova nel 2001, e nel febbraio 2009 un'altra triennale in Ingegneria Informatica. Da anni lavoro come programmatore .NET principalmente in C#, per migrare applicativi win32 in applicazioni ASP.NET. Ho sviluppato inoltre parecchia reportistica su Cr... Profilo completo

Articoli collegati

Utilizzare NUnit per testare codice .NET
Scopriamo in questo articolo come utilizzare il popolare framework Open Source NUnit per effettuare Unit Testing del codice .NET aumentandone la qualità e riducendo il numero di eventuali bugs.
Autore: Michela Zangarelli | Difficoltà:
SQL Injection, che cosa è e come difendersi
I malintenzionati sono sempre dietro l'angolo. Il SQL Injection è una delle pratiche più semplici da utilizzare per attaccare un'applicazione poco sicura e violarla o arrecare danni al database. Vediamo che cos'è e come garantire la sicurezza delle applicazioni in modo adeguato.
Autore: Alessandro Alpi | Difficoltà: | Commenti: 4
Visual Studio 2005 Team System
Scopriamo il nuovo IDE di sviluppo che copre interamente l'intero ciclo di vita del software integrando in un solo ambiente più prodotti e studiato apposta per i ruoli di Architect, Developer e Tester.
Autore: Marco Caruso | Difficoltà: | Voto:
Tutorial ADO.NET ed esempi pratici - Parte 2
Dopo aver fatto un po' di teoria su ADO.NET nella Parte 1 dell'articolo procediamo con un Tutorial pratico che ci condurrà alla creazione di un'applicazione basilare che consenta l'accesso e la modifica dei dati su un Database Access.
Autore: Stefano Passatordi | Difficoltà: | Commenti: 10
Introduzione ad ADO.NET - Parte 1
ADO.NET è uno dei componenti chiave del .NET Framework. Eredita il nome dal vecchio ADO ma è praticamente quasi tutto cambiato. Una nuova architettura, nuovi concetti, nuove funzionalità e nuovi oggetti. Vediamo quali sono e a cosa servono.
Autore: Stefano Passatordi | Difficoltà: | Commenti: 6
Usare degli indicatori di progresso con Query SQL
Nell'articolo vediamo come sia possibile con un l'aiuto delle classi DataReader e Command di ADO.NET, mostrare un indicatore di progresso che indichi lo stato di avanzamento di una query SQL durante il fetching dei dati.
Autore: Matteo Raumer | Difficoltà: | Voto:
La crittografia e la classe Rijndael
Vediamo come utilizzare una delle tante classi messe a disposizione dal .NET Framework per la crittografia dei dati. In particolare la classe Rijndael implementa un algoritmo di crittografia molto forte diventato famoso negli ultimi anni.
Autore: David De Giacomi | Difficoltà:
DES il famoso standard creato da IBM per la crittografia dei dati
In questo articolo dimostreremo come crittografare dei file usando il .NET Framework e in particolare la classe DESCryptoServiceProvider che implementa l'ormai noto algoritmo di cifratura inventato da IBM negli anni 70 chiamato DES (Data Encryption Standard)
Autore: David De Giacomi | Difficoltà: | Commenti: 2 | Voto:
Cosa sono e come funzionano le funzioni ricorsive?
Ecco tre esempi efficaci che vi spiegano come usare correttamente le funzioni ricorsive, per effettuare ricerche di file e cartelle all'interno del disco fisso, per ricostruire la struttura di un file XML oppure per svuotare determinati controlli in una Form.
Autore: Matteo Raumer | Difficoltà: | Commenti: 2
Costruire Console Applications con Visual Studio .NET
Spiegheremo in questo articolo i passi base fondamentali per costruire Console Applications utilizzando Visual Studio .NET.
Autore: David De Giacomi | Difficoltà: | Voto:
TextReader e TextWriter
Una panoramica su come utilizzare queste due classi che ci permettono di leggere e scrivere file di testo.
Autore: David De Giacomi | Difficoltà: | Commenti: 1 | Voto:
Giochiamo un po' con il registro di Windows!
Scopriamo uno degli elementi fondamentali del sistema operativo Windows e vediamo come è possibile accedervi tramite le classi offerte dal .NET Framework: Microsoft.Win32.Registry e Microsoft.Win32.RegistryKey
Autore: David De Giacomi | Difficoltà: | Commenti: 1 | Voto:
.NET Framework 1.1 Beta
Una prima panormaica sulle novità offerte dal Framework 1.1 che sarà integrato nella prossima versione di Visual Studio .NET 2003.
Autore: David De Giacomi | Difficoltà:
Cosa posso costruire con Visual Studio .NET ?
Un' introduzione sui vari tipi di progetto disponibili in Visual Studio dalle tipiche applicazioni Windows fino alle recenti applicazioni Web e agli innovativi Web Services.
Autore: David De Giacomi | Difficoltà: | Commenti: 1
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5