<?xml version="1.0" encoding="iso-8859-15"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><channel><title>blogs.ASPItalia.com</title><link>http://blogs.aspitalia.com//az//</link><description>blogs.ASPItalia.com</description><language>it-it</language><copyright>1998-2012 ASPItalia.com/blogs.ASPItalia.com</copyright><generator>Generated by feed.ASPItalia.com 'Cortana' 2012.5.12</generator><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><sy:updateBase>1998-01-01T12:00+00:00</sy:updateBase><lastBuildDate>Sat, 24 Oct 2009 19:23:34 GMT</lastBuildDate><image><title>blogs.ASPItalia.com</title><url>http://gui.aspitalia.com/images/aspitalia/syndication.gif</url><link>http://blogs.aspitalia.com//az//</link></image><item><title>SqLite vs Access vs Sql Ce 3.5</title><link>http://blogs.aspitalia.com/az/post2555/SqLite-Access-Sql-3.5.aspx</link><pubDate>Sat, 24 Oct 2009 19:23:34 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2555" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Per riprendere confidenza alla programmazione dopo un periodo di riposo forzato, ho messo mano in questi giorni al mio &lt;a title="link esterno" href="http://ciclismo.sitiasp.it/"&gt;sito&lt;/a&gt; per ottimizzare il codice e per nuove implementazioni che da troppo tempo erano in cantiere. A parte la primissima versione del sito che era fatta completamente in &lt;em&gt;html&lt;/em&gt; senza nessun supporto &lt;em&gt;server side&lt;/em&gt;, nella sua implementazione prima con il &lt;em&gt;classic asp&lt;/em&gt; e poi con &lt;em&gt;asp.net&lt;/em&gt;, si è sempre basato sul database &lt;em&gt;Access&lt;/em&gt;. Tuttora sono due i database che tengono in piedi il tutto senza grosse fatiche e il minimo uso di cache presente ha permesso che non ci fossero rallentamenti e problemi dovuto ad un uso massiccio di questo tipo di database.&lt;/p&gt; &lt;p&gt;Proprio durante la fase di sviluppo di questi giorni è nata l'idea di prendere in considerazione anche altri database. Innanzitutto, essendo il sito su un &lt;em&gt;hosting povero&lt;/em&gt;, non ho a disposizione database degni di questo nome come &lt;em&gt;Sql Server&lt;/em&gt; o &lt;em&gt;MySql&lt;/em&gt;, e arrangiarsi alla bell'e meglio è ciò che mi ha obbligato a guardarmi attorno alla ricerca di alternative e, perché no, mi ha permesso di prendere confidenza con qualcosa di nuovo. Pensandoci bene, a parte la mia esigenza personale dettata dal mio sito e viste le alternative possibili, è proprio obbligatorio passare ad &lt;em&gt;hosting&lt;/em&gt; più costosi per siti con basso traffico solo per avere un database serio quando il numero di richieste pagine/query è talmente basso da far apparire addirittura sprecato un &lt;em&gt;hosting&lt;/em&gt; con &lt;em&gt;Sql Server&lt;/em&gt; o &lt;em&gt;MySql&lt;/em&gt;? In fondo, se uno prende uno spazio di &lt;em&gt;hosting&lt;/em&gt; per inserire un proprio blog o come contenitore di informazioni personali, dunque con una previsione almeno iniziale di carico molto basso, anche &lt;em&gt;Access&lt;/em&gt; può far degnamente il suo lavoro. Ma perché non prendere in considerazione anche altre alternative?&lt;/p&gt; &lt;p&gt;In questo blog voglio solo trascrivere le mie sensazione nell'uso e di test personali nell'uso di tre database utilizzabili nelle proprie medio piccole web application:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Access &lt;li&gt;SqLite &lt;li&gt;Sql CE&lt;/li&gt;&lt;/ul&gt; &lt;h1&gt;&lt;/h1&gt; &lt;p&gt;&lt;em&gt;Access&lt;/em&gt; per i più non ha bisogno di presentazione. Prima o poi lo incontrano tutti nel loro percorso informatico. Probabilmente il più facile database disponibile ed è facilmente utilizzare fin dai tempi del &lt;em&gt;classic asp&lt;/em&gt;: è sufficiente prendere il file del database (.&lt;em&gt;mdb&lt;/em&gt;) e copiarlo in una directory sul server, e senza alcun'altra installazione sul server, si può interrogare da codice con poche righe di codice. I suoi difetti maggiori sono le prestazioni e l'impossibilità di usarlo in multiutenza. Per le web application il problema maggiore rimane solo il primo visto che se in lettura molte pagine possono accedere contemporaneamente, in scrittura solo un'operazione alla volta è possibile.&lt;/p&gt; &lt;p&gt;La connessione, avviene grazie ai driver &lt;em&gt;ole-db&lt;/em&gt;, e il Framework mette a disosizione un namespace apposito: &lt;em&gt;System.Data.OleDb&lt;/em&gt;, con tutta la sua sequenza di classi:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;OleDbConnection &lt;li&gt;OleDbCommand &lt;li&gt;OleDbDataAdapter &lt;li&gt;OleDbDataReader &lt;li&gt;...&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;E utilizzare questa stringa di connessione: "&lt;em&gt;Provider=Microsoft.Jet.OLEDB.4.0;Data source=database.mdb&lt;/em&gt;":&lt;/p&gt; &lt;p&gt;&lt;em&gt;OleDbConnection conn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=database.mdb");&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;SqLite&lt;/em&gt; è un progetto completamente free e può essere utilizzato per qualsiasi tipo di applicazione. Per utilizzarlo nelle proprio web application in asp.net, è sufficiente copiare il file &lt;em&gt;System.Data.SQLite.dll&lt;/em&gt; nella directory &lt;em&gt;bin&lt;/em&gt; (o creando una &lt;em&gt;refernce&lt;/em&gt; da Visual Studio). Come &lt;em&gt;Access&lt;/em&gt;, anche questo database di basa su un file che ha come suffisso ".s3db". Per creare questo database sono presenti numerosi progetti free, io ho utilizzato il famoso &lt;a title="link esterno" href="http://sqliteadmin.orbmu2k.de/"&gt;SqLite Administrator&lt;/a&gt;:&lt;/p&gt; &lt;p&gt;&lt;img border="0" alt="image" src="http://blogs.aspitalia.com/img/andrewz/3d8548fc430d_f448/image_7.png" width="524" height="383"&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;SqLite&lt;/em&gt; per il framework è possibile scaricarlo da questo &lt;a title="link esterno" href="http://sourceforge.net/projects/sqlite-dotnet2/"&gt;link&lt;/a&gt;. Una volta installato è possibile trovare i file di nostro interesse nella directory:&lt;/p&gt; &lt;p&gt;&lt;em&gt;C:\Programmi\SQLite.NET\bin&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Oltre alle dll possiamo trovare anche un test di esempio per l'utilizzo di questo database e la documentazione. Inoltre possiamo integrare il &lt;em&gt;designer&lt;/em&gt; di &lt;em&gt;SqLite&lt;/em&gt; direttamente in Visual Studio e con &lt;em&gt;Linq&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;SqLite è utilizzabile dai progetti scritti con il Framework dal namespace &lt;em&gt;System.Data.SQLite&lt;/em&gt; che mette a dispozione le classi apposite:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;SqLiteConnection &lt;li&gt;SqLiteCommand &lt;li&gt;SqLiteDataAdapter &lt;li&gt;SqLiteDataReader &lt;li&gt;...&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;La stringa di connessione è "&lt;em&gt;Data Source=database.s3db&lt;/em&gt;". Per esempio:&lt;/p&gt; &lt;p&gt;&lt;em&gt;SqLiteConnection conn=new SqLiteConnection("Data Source="+Request.MapPath("database.s3db"));&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Anche se non rientra nei canoni dell'obbiettivo di questo blog ho preso in considerazione anche &lt;em&gt;Sql CE&lt;/em&gt; di Microsoft. Se si utilizza per lo sviluppo Visual Studio, probabilmente lo si ritroverà all'interno della propria macchina. Altrimenti è possibile scaricarlo gratuitamente da questo &lt;a title="link esterno" href="http://www.microsoft.com/sqlserver/2005/en/us/compact-downloads.aspx"&gt;link&lt;/a&gt;. La creazione e la gestione delle tabelle è molto semplice visto che è possibile manipolare i file di database di Sql CE (con suffisso ".&lt;em&gt;sdf&lt;/em&gt;") con gli editor di &lt;em&gt;Sql Server&lt;/em&gt;, o con il gratuito Microsoft &lt;a title="link esterno" href="http://www.microsoft.com/downloads/details.aspx?familyid=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796&amp;amp;displaylang=en"&gt;SQL Server Management Studio Express&lt;/a&gt;. Qui sotto la banale operazione di creazione di un database di questo tipo con il &lt;em&gt;Sql Server Managment Studio&lt;/em&gt; della versione 2008:&lt;/p&gt; &lt;p&gt;&lt;img border="0" alt="creazione sqlce" src="http://blogs.aspitalia.com/img/andrewz/3d8548fc430d_f448/image_8.png" width="420" height="312"&gt;&lt;/p&gt;  &lt;p&gt;&lt;img border="0" alt="creazione" src="http://blogs.aspitalia.com/img/andrewz/3d8548fc430d_f448/image_9.png" width="443" height="308"&gt;&lt;/p&gt; &lt;p&gt;Come scritto sopra, non rientra nei canoni della mia valutazione perché per inserire questo tipo di database su un server in &lt;em&gt;hosting&lt;/em&gt; per la propria web application, non è sufficiente copiare le &lt;em&gt;dll&lt;/em&gt; ma deve essere installato direttamente sulla macchina. A queste conclusioni sono giunto dopo numerosi tentativi andati a vuoto e dopo una veloce ricerca in rete di una soluzione. Se qualcuno sa una strada che può portare alla soluzione è benvenuta qualsiasi informazioni in merito.&lt;/p&gt; &lt;p&gt;Inserita la &lt;em&gt;reference&lt;/em&gt; a "&lt;em&gt;System.Data.SqlServerCe&lt;/em&gt;" nella web application abbiamo il namespace apposito e le classi per la manipolazione di questo database:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;SqlCeConnection &lt;li&gt;SqlCeCommand &lt;li&gt;SqlCeDataAdapter &lt;li&gt;SqlCeDataReader &lt;li&gt;...&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;La stringa di connessione è uguale a quella che per &lt;em&gt;SqLite&lt;/em&gt;: "&lt;em&gt;Data Source=database.sdf&lt;/em&gt;". Per esempio:&lt;/p&gt; &lt;p&gt;&lt;em&gt;SqlCeConnection conn=new SqlCeConnection("Data Source="+Request.MapPath("database.sdf"));&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Se si prova ad utilizzare &lt;em&gt;Sql CE&lt;/em&gt; in una web application si ha inizialmente una sorpresa trovandosi di fronte all'errore:&lt;/p&gt; &lt;p&gt;&lt;em&gt;"SQL Server Compact Edition is not intended for ASP.NET development"&lt;/em&gt;&lt;/p&gt; &lt;p&gt;La &lt;a title="link esterno" href="http://vidmar.net/weblog/archive/2007/04/19/sql-server-2005-compact-edition-and-asp.net.aspx"&gt;soluzione&lt;/a&gt; si basa nell'aggiunta di questo riga di codice:&lt;/p&gt; &lt;p&gt;&lt;em&gt;AppDomain.CurrentDomain.SetData("SQLServerCompactEditionUnderWebHosting", true);&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Per i miei test ho utilizzato due semplici tabelle con una &lt;em&gt;relation&lt;/em&gt;, aventi questa struttura:&lt;/p&gt; &lt;p&gt;&lt;img border="0" alt="access struttura" src="http://blogs.aspitalia.com/img/andrewz/3d8548fc430d_f448/image_10.png" width="524" height="338"&gt; &lt;/p&gt; &lt;p&gt;&lt;em&gt;FirstName&lt;/em&gt; e &lt;em&gt;Information&lt;/em&gt; sono campi &lt;em&gt;varchar&lt;/em&gt;, &lt;em&gt;Age&lt;/em&gt; è un campo numerico così come &lt;em&gt;ParentId&lt;/em&gt; che lega i record della tabella "&lt;em&gt;Table2&lt;/em&gt;" ai record presenti in "&lt;em&gt;Table1&lt;/em&gt;". Il test si basa sulla scrittura di centiana di record alla volta e a delle query di lettura su questi record in modo ripetuto.&lt;/p&gt; &lt;p&gt;Il primo test si basa sulla scrittura di dieci record nella prima tabella e di trenta nella seconda. Oltre la scrittura, dopo l'inserimento della prima tabella, viene letto l'Id generato dalla tabella per creare il giusto riferimento nella tabella figlia. Qui sotto riporto i tre database:&lt;/p&gt; &lt;table border="1" cellspacing="0" cellpadding="2" width="399"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td  width="76"&gt;&lt;strong&gt;N. tentativi&lt;/strong&gt;&lt;/td&gt; &lt;td  width="86"&gt;&lt;strong&gt;Access&lt;/strong&gt;&lt;/td&gt; &lt;td  width="72"&gt;&lt;strong&gt;SqLite&lt;/strong&gt;&lt;/td&gt; &lt;td  width="85"&gt;&lt;strong&gt;SqLite - T&lt;/strong&gt;&lt;/td&gt; &lt;td  width="78"&gt;&lt;strong&gt;Sql CE 3.5&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="76"&gt;&lt;strong&gt;1°&lt;/strong&gt;&lt;/td&gt; &lt;td  width="86"&gt;&lt;em&gt;0s 93&lt;/em&gt;&lt;/td&gt; &lt;td  width="72"&gt;&lt;em&gt;8s 53&lt;/em&gt;&lt;/td&gt; &lt;td  width="85"&gt;&lt;em&gt;0s 40&lt;/em&gt;&lt;/td&gt; &lt;td  width="78"&gt;&lt;em&gt;0s 73&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="76"&gt;&lt;strong&gt;2°&lt;/strong&gt;&lt;/td&gt; &lt;td  width="86"&gt;&lt;em&gt;0s 98&lt;/em&gt;&lt;/td&gt; &lt;td  width="72"&gt;&lt;em&gt;8s 25&lt;/em&gt;&lt;/td&gt; &lt;td  width="85"&gt;&lt;em&gt;0s 47&lt;/em&gt;&lt;/td&gt; &lt;td  width="78"&gt;&lt;em&gt;0s 74&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="76"&gt;&lt;strong&gt;3°&lt;/strong&gt;&lt;/td&gt; &lt;td  width="89"&gt;&lt;em&gt;0s 93&lt;/em&gt;&lt;/td&gt; &lt;td  width="78"&gt;&lt;em&gt;8s 70&lt;/em&gt;&lt;/td&gt; &lt;td  width="92"&gt;&lt;em&gt;0s 46&lt;/em&gt;&lt;/td&gt; &lt;td  width="89"&gt;&lt;em&gt;0s 71&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Ho dovuto inserire in due colonne i tempi di &lt;em&gt;SqLite&lt;/em&gt; a causa delle prestazioni scadenti di questo database se non utilizziamo procedure apposite per questo tipo di operazione. Il codice di test per l'inserimento di tutti i database si basa su un banale ciclo &lt;em&gt;for&lt;/em&gt;. All'interno di esso eseguo l'apertura della connessione del database, quindi una a una le singole operazioni di scrittura. Pressappoco questo schema:&lt;/p&gt; &lt;p&gt;&lt;em&gt;for (int i=0;i&amp;lt;10;i++)&lt;br&gt;{&lt;br&gt;  // Apri connessione&lt;br&gt;  // Esegue inserimento in tabella 1&lt;br&gt;  // Legge l'ID inserito dal database per l'inserimento&lt;br&gt;  for (int x=0;x&amp;lt;30;x++)&lt;br&gt;  {&lt;br&gt;    // Inserisce record nella tabella 2&lt;br&gt;  }&lt;br&gt;  // Chiude connessione&lt;br&gt;}&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Grazie a questo codice ci si scontra ad un grosso limite di &lt;em&gt;SqLite&lt;/em&gt; che, nelle operazioni di grande inserimento, si scontra con un crollo di prestazioni notevole. Per evitare questo &lt;a title="link esterno" href="http://www.sqlite.org/cvstrac/wiki?p=performanceconsiderations"&gt;problema&lt;/a&gt;, è sufficiente mettere le varie fasi di inserimento in &lt;em&gt;transaction&lt;/em&gt; per avere quel balzo di prestazioni che lo porta al primo posto nella tabella precedente (colonna "&lt;em&gt;SqLite - T&lt;/em&gt;"). Il codice qui sopra va riscritto in questo modo:&lt;/p&gt;&lt;em&gt;for (int i=0;i&amp;lt;10;i++)&lt;br&gt;{&lt;br&gt;  // Apri connessione&lt;br&gt;  // Apri transaction (invio comando "begin")&lt;br&gt;  // Esegue inserimento in tabella 1&lt;br&gt;  // Legge l'ID inserito dal database per l'inserimento&lt;br&gt;  for (int x=0;x&amp;lt;30;x++)&lt;br&gt;  {&lt;br&gt;    // Inserisce record nella tabella 2&lt;br&gt;  }&lt;br&gt;  // Chiususa transaction (invio comando "commit")&lt;br&gt;  // Chiude connessione&lt;br&gt;}&lt;/em&gt; &lt;p&gt;Anche se i distacchi sono limitati, &lt;em&gt;Access&lt;/em&gt; risulta il più lento e &lt;em&gt;SqLite&lt;/em&gt; il più veloce anche se, abbiamo dovuto ottimizzare il codice appositamente per lui. Di seguito ho eseguito delle operazioni ripetute in lettura. Le tabelle, composte da trenta record la prima e novecento la seconda, vengono lette la prima per &lt;em&gt;n&lt;/em&gt; volte, e la seconda viene conteggiata in una query il numero di record. I risultati sono i seguenti:&lt;/p&gt; &lt;table border="1" cellspacing="0" cellpadding="2" width="400"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td  width="100"&gt;&lt;strong&gt;N. tentativi&lt;/strong&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;strong&gt;Access&lt;/strong&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;strong&gt;SqLite&lt;/strong&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;strong&gt;Sql CE 3.5&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="100"&gt;&lt;strong&gt;1°&lt;/strong&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;em&gt;2s 49&lt;/em&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;em&gt;0s 31&lt;/em&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;em&gt;1s 33&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="100"&gt;&lt;strong&gt;2°&lt;/strong&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;em&gt;2s 34&lt;/em&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;em&gt;0s 23&lt;/em&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;em&gt;1s 25&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="100"&gt;&lt;strong&gt;3°&lt;/strong&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;em&gt;2s 35&lt;/em&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;em&gt;0s 23&lt;/em&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;em&gt;1s 26&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Qui non c'è storia: &lt;em&gt;SqLite&lt;/em&gt; fa la differenza. &lt;em&gt;Access&lt;/em&gt; è l'ultimo con distacchi abissali. L'ultimo test di lettura esegue ripetute &lt;em&gt;query&lt;/em&gt; con &lt;em&gt;join&lt;/em&gt; tra le due tabelle.&lt;/p&gt; &lt;table border="1" cellspacing="0" cellpadding="2" width="402"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td  width="100"&gt;&lt;strong&gt;N. tentativi&lt;/strong&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;strong&gt;Access&lt;/strong&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;strong&gt;SqLite&lt;/strong&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;strong&gt;Sql CE 3.5&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="100"&gt;&lt;strong&gt;1°&lt;/strong&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;em&gt;3s 88&lt;/em&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;em&gt;0s 96&lt;/em&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;em&gt;2s 55&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="100"&gt;&lt;strong&gt;2°&lt;/strong&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;em&gt;3s 99&lt;/em&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;em&gt;0s 97&lt;/em&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;em&gt;2s 55&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="100"&gt;&lt;strong&gt;3°&lt;/strong&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;em&gt;3s 91&lt;/em&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;em&gt;0s 96&lt;/em&gt;&lt;/td&gt; &lt;td  width="100"&gt;&lt;em&gt;2s 67&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Si possono tirare delle conclusioni? No. Anche se l'informatica si avvicina moltissimo alla matematica è soggetta alla regola che vige in politica e sport dove chiunque può dire il contrario di tutto solo per partito preso. E siccome a me non me ne frega nulla e so che là fuori c'è sempre qualcuno che si sente il diritto di criticare, ognuno tiri le conclusioni per sé. Anzi, consiglio di fare delle prove e valutare. Le banderuole si muovono a seconda di dove tira il vento, e non hanno cervello. Altri lo hanno, &lt;em&gt;deturpato&lt;/em&gt; o meno, ma è più comodo sventolare per simpatie personali.&lt;/p&gt; &lt;p&gt;E siccome non me ne frega nulla - questa frase non varrebbe nulla se non dessi un mio parere personale, perché se non lo facessi vorrebbe dire che mi importerebbe - ecco un mio giudizio: &lt;em&gt;SqLite&lt;/em&gt; è leggero ed ha ottime prestazioni, lo prenderei in considerazione per piccole web application tenendo sempre d'occhio le varie ottimizzazioni per evitare inconvenienti come quello della scrittura che ho citato. &lt;em&gt;Access&lt;/em&gt; si può definire finito nelle web application? Nì: le alternative ci sono e se si vuole dirla tutta, se proprio si vuole un database degno di tal nome perché si prevedono necessità &lt;em&gt;pesanti&lt;/em&gt;, senza dover andare su &lt;em&gt;Sql Server&lt;/em&gt;, ormai tutti i servizi di &lt;em&gt;hosting&lt;/em&gt; anche economico danno &lt;em&gt;MySql&lt;/em&gt; con un piccolo sovrapprezzo. L'&lt;strong&gt;importante&lt;/strong&gt; è sapere che sino alternative. In ogni caso rimando per approfondimenti sui vari database che ho trattato alla numerosa documentazione che è reperibile in Internet - se con questo mio blog ho acceso un po' la curiosità.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ADO.NET/" rel="tag"&gt;ADO.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Database/" rel="tag"&gt;Database&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/SQL_Server/" rel="tag"&gt;SQL Server&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2555/SqLite-Access-Sql-3.5.aspx"&gt;&lt;em&gt;SqLite vs Access vs Sql Ce 3.5&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Sql, .NET Framework, ADO.NET, ASP.NET, Database, SQL Server</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2555/SqLite-Access-Sql-3.5.aspx</guid><slash:comments>3</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2555/SqLite-Access-Sql-3.5.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2555.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2555</trackback:ping></item><item><title>Query ricorsive con sql server 2005</title><link>http://blogs.aspitalia.com/az/post2035/Query-Ricorsive-Sql-Server-2005.aspx</link><pubDate>Sat, 05 May 2007 15:36:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2035" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Me lo segno.&lt;/p&gt;&lt;p&gt;Stare troppo su Sql server nella versione 2000 ti fa perdere di vista le novità del più potente 2005. Eccomi dunque a segnarmi una memo sul modo più veloce e prestazionale per eseguire una query ricorsiva sul mio blog.&lt;/p&gt;&lt;p&gt;A che serve una query ricorsiva? La risposta più semplice è nel caso della struttura &lt;em&gt;ad albero&lt;/em&gt; memorizzato in una tabella il poter avere tutti i figli di un determinato &lt;em&gt;ramo&lt;/em&gt;. Ecco il caso di una tabella:&lt;/p&gt;&lt;p&gt;&lt;table scellspacing="1" cellpadding="1" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;id&lt;/td&gt;&lt;td&gt;id_padre&lt;/td&gt;&lt;td&gt;nome&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;aa&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;ab&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;aaa&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;aab&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;aaaa&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;aba&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;abb&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;abaa&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;L'albero è semplice, il padre è &amp;quot;a&amp;quot;, e i figli seguono l'ordine alfabetico. Ora, se volessi sapere tutti i figli e &lt;em&gt;nipoti&lt;/em&gt; di &lt;em&gt;aa&lt;/em&gt;, con sql server 2005, posso scrivere:&lt;/p&gt;&lt;code&gt;with tree(id,id_padre,nome) as&lt;br /&gt;(&lt;br /&gt;select id,id_padre,nome from albero where id=2 -- id del padre&lt;br /&gt;union all&lt;br /&gt;select a.id,a.id_padre,a.nome from albero a&lt;br /&gt;inner join tree t on t.id=a.id_padre&lt;br /&gt;)&lt;br /&gt;select id,id_padre,nome from tree&lt;/code&gt;&lt;p&gt;Molto più semplice e veloce che la costruzione di una funzione apposita...&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Database/" rel="tag"&gt;Database&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/SQL_Server/" rel="tag"&gt;SQL Server&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2035/Query-Ricorsive-Sql-Server-2005.aspx"&gt;&lt;em&gt;Query ricorsive con sql server 2005&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Sql, Database, SQL Server</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2035/Query-Ricorsive-Sql-Server-2005.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2035/Query-Ricorsive-Sql-Server-2005.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2035.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2035</trackback:ping></item></channel></rss>
