Around and About .NET World

Il blog di Marco Minerva
posts - 1671, comments - 2232, trackbacks - 2135

My Links

News

Contattami su Live Messenger:


MCTS: Windows, Web, Distributed Applications & SQL Server

MCPD: Enterprise Applications

Tag Cloud

Archives

Post Categories

Links

LINQ & SQL: SQLMetal

Uno dei motivi per cui è nato LINQ è quello di fornire un modello unificato di accesso alle fonti dati, siano esse oggetti, file XML oppure database relazionali. Proprio da questi ultimi ho cominciato i miei "esprimenti". Vediamo prima la strada più lunga... Il .NET Framework 3.5 mette a disposizione un tool a riga di comando, SQLMetal.exe, che consente di creare un file di mapping, in C# oppure VB .NET, con cui accedere ad un database SQL senza doversi preoccupare di stringhe di connessione, oggetti Command e Parameter... In una parola sola: DAL smile_regular. In Orcas Beta 1 questo programma è contenuto nella cartella C:\Program Files\Microsoft Visual Studio 9.0\SDK\v3.5\Bin.

Supponiamo di avere su SQL Server 2005 un database di nome SitesDB con al suo interno una tabella Sites così definita:

 

CREATE TABLE Sites ( ID int IDENTITY(1,1) NOT NULL, Url nvarchar(255) NOT NULL, LastCheck datetime NULL, Enabled bit NOT NULL)

 

Eseguendo il tool SQLMetal.exe su tale database si ottiene un file di mapping che deve essere aggiunto al proprio progetto .NET. Fatto questo, bastano pochissime righe di codice per accedere al database con LINQ, leggere i valori in esso contenuti e fare delle modifiche. Ad esempio:

 

1 using (SitesDB db = new SitesDB(Settings.Default.SQLConnectionString)) 2 { 3 using(WebClient wc = new WebClient()) 4 { 5 var query = from site in db.Sites where site.Enabled select site; 6 foreach (var record in query) 7 { 8 try 9 { 10 wc.DownloadString(record.Url); 11 //Il sito è accessibile. Aggiorna la data di validità. 12 record.LastCheck = DateTime.Now; 13 } 14 catch (Exception) 15 { } 16 } 17 } 18 //Invia le modifiche al database. 19 db.SubmitChanges(); 20 }

 

La riga 5 recupera tutti i record della tabella Sites il cui attributo Enabled vale true. Dopo aver modificato il valore di LastCheck, se necessario (riga 12) l'istruzione db.SubmitChanges() alla riga 19 riporta tutte le modifiche nella base di dati.

E' interessante notare una cosa. L'istruzione alla riga 5 non lancia effettivamente la query sul database: la sua esecuzione avviene solo nel momento in cui si effettua il primo accesso ai dati (in questo caso, il ciclo foreach alla riga 6).

Questo è solo un primo assaggio delle potenzialità che LINQ offre per l'accesso ai database relazionali. Nei prossimi giorni mostrerò altre caratteristiche, a cominciare dal LINQ to SQL Designer, lo strumento che consente di creare il mapping tra database e LINQ in maniera completamente visuale. Di esso mi occuperò nel prossimo post, quindi... Stay tuned smile_wink.

Print | posted on sabato 28 aprile 2007 22:13 | Filed Under [ ADO .NET & SQL Orcas & .NET 3.5 LINQ ]

Feedback

Gravatar

# re: LINQ & SQL: SQLMetal

Nota:
Spero che SQL Metal e tool simili scompaiano dalla faccia della terra il più presto possibile....
28/04/2007 22:57 | Giancarlo Sudano
Gravatar

# re: LINQ & SQL: SQLMetal

Linq2SQL non è un ORM... è un DAL.
Tu così crei entity specchio del DB e così tradisci drammaticamente il motivo per cui esiste OOP, cioè creare un *Modello* che astrae la realtà che devi riprodurre in modo informatico.
Il DB è bidimensionale e non rappresenta grafi o relazioni complesse.
Il DB è ottimo per la persistenza e la ricerca ma il mapping automatico è un errore architetturale che si paga caro.
Se poi ci sono casi semplici in cui il mapping 1:1 è anche il modello ideale, questo è solo un caso particolare, ma niente di più.
28/04/2007 23:42 | Raffaele Rialdi
Gravatar

# re: LINQ & SQL: SQLMetal

Ciao Raffaele! Grazie per i preziosi chiarimenti!
28/04/2007 23:45 | Marco Minerva
Gravatar

# re: LINQ & SQL: SQLMetal

Tutti temi che saranno "obbligatoriamente" trattati nella mia sessione ai prossimi community days. :-)

Concordo con Raf.
Partire dal db per generare un Object Model è il primo fallimento concettuale. Nessun tool riesce in automatico a percepire una eventuale generalizzazione/specializzazione da trasformare in una ereditarietà OOP. Nessun tool riesce a determinare composizioni di value object all'interno delle tabelle.
Linq 2 SQL (senza scomodare Linq 2 Entities) ha le potenzialità per esprimere un Domain Model più complesso dello specchio del db. Ma con i generatori automatici uccidiamo tutto già in partenza.
28/04/2007 23:51 | Giancarlo Sudano
Gravatar

# Re: LINQ & SQL: SQLMetal

<quot>Partire dal db per generare un Object Model è il primo fallimento concettuale</quot>
perfettamente d'accordo.
29/04/2007 15:29 | Igor Damiani
Gravatar

# LINQ

29/04/2007 21:39 | Around and About .NET World
Gravatar

# re: LINQ & SQL: SQLMetal

Vi prego,non parlate di Linq toSql mi credete ho fatto un programma per la MIcrosoft e ho usato Linq ToSql e funziona perfettamente , il tutto sta nell'arte non nei mezzi....
Buona serata
03/03/2009 20:23 | Antonio Mazzariello
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET