Bress's BLog Il blog di Cristian Bressan http://blogs.ugidotnet.org/bressan/Default.aspx Cristian Bressan http://blogs.ugidotnet.org/bressan/Default.aspx Subtext 2020-05-16T13:43:02Z Type Inference http://blogs.ugidotnet.org/bressan/archive/2006/11/27/57409.aspx 2006-11-27T12:19:00Z 2006-11-27T12:19:00Z <p>Una caratteristica molto interessante del framework è l'inferenza dei tipi, cioè la capacità del compilatore di capire quali sono i tipi da usare senza che il programmatore li dichiari esplicitamente. Questa caratteristica è stata notevolmente utilizzata nel framework 3.0, ma è presente anche nel 2.0. </p><p>Ad esempio: </p><p><span style="font-family:Courier New; font-size:10pt"><span style="color:blue">class</span> <span style="color:#2b91af">FooClass</span></span> </p><p><span style="font-family:Courier New; font-size:10pt">{ </span></p><p><span style="font-family:Courier New; font-size:10pt"> <span style="color:blue">public</span> <span style="color:blue">void</span> Test() {     </span></p><p><span style="font-family:Courier New; font-size:10pt"> Foo&lt;<span style="color:blue">int</span>, <span style="color:blue">string</span>&gt;(10, <span style="color:#a31515">"aaa"</span>); </span></p><p><span style="font-family:Courier New; font-size:10pt"> Foo(10, <span style="color:#a31515">"aaa"</span>); </span></p><p style="margin-left: 36pt"><span style="font-family:Courier New; font-size:10pt">Foo(<span style="color:#a31515">"bbb"</span>, 10); </span></p><p><span style="font-family:Courier New; font-size:10pt"> } </span></p><p>  </p><p><span style="font-family:Courier New; font-size:10pt"> <span style="color:blue">void</span> Foo&lt;I, J&gt;(I parA, J parB) { </span></p><p><span style="font-family:Courier New; font-size:10pt"> <span style="color:#2b91af">Console</span>.WriteLine(<span style="color:#a31515">"First method"</span>); </span></p><p><span style="font-family:Courier New; font-size:10pt"> } </span></p><p><span style="font-family:Courier New; font-size:10pt"> } </span></p><p>Nel metodo Test, le chiamate al metodo Foo sono tutte lecite. Nel primo caso vengono esplicitati i parametri di tipo, nel secondo il compilatore "conclude" che i tipi I e J sono rispettivamente int e string, mentre nel terzo caso I e J sono rispettivamente string e int. L'inferenza dei tipi rende meno prolisso il codice ma nasconde delle insidie. </p><p>Come più volte ha dimostrato <a href="http://blogs.ugidotnet.org/adrian">Adrian</a> nei suoi post, quando si lascia al compilatore l'interpretazione del nostro codice, non sempre le scelte intraprese sono quelle che noi ci aspetteremo. Ad esempio: </p><p><span style="font-family:Courier New; font-size:10pt"><span style="color:blue">class</span> <span style="color:#2b91af">FooClass </span></span></p><p><span style="font-family:Courier New; font-size:10pt">{ </span></p><p><span style="font-family:Courier New; font-size:10pt"> <span style="color:blue">public</span> <span style="color:blue">void</span> Test() { </span></p><p><span style="font-family:Courier New; font-size:10pt"> Foo&lt;<span style="color:blue">int</span>, <span style="color:blue">string</span>&gt;(10, <span style="color:#a31515">"aaa"</span>); </span></p><p><span style="font-family:Courier New; font-size:10pt"> Foo(10, <span style="color:#a31515">"aaa"</span>); </span></p><p><span style="font-family:Courier New; font-size:10pt"> } </span></p><p>  </p><p><span style="font-family:Courier New; font-size:10pt"> <span style="color:blue">void</span> Foo&lt;I, J&gt;(I parA, J parB) { </span></p><p><span style="font-family:Courier New; font-size:10pt"> <span style="color:#2b91af">Console</span>.WriteLine(<span style="color:#a31515">"First method"</span>); </span></p><p><span style="font-family:Courier New; font-size:10pt"> } </span></p><p>  </p><p><span style="font-family:Courier New; font-size:10pt"> <span style="color:blue">void</span> Foo&lt;I, J&gt;(<span style="color:blue">int</span> parA, <span style="color:blue">string</span> parB){ </span></p><p><span style="font-family:Courier New; font-size:10pt"> <span style="color:#2b91af">Console</span>.WriteLine(<span style="color:#a31515">"Second method"</span>); </span></p><p><span style="font-family:Courier New; font-size:10pt"> } </span></p><p><span style="font-family:Courier New; font-size:10pt">} </span></p><p>In questo caso l'output generato chiamando il metodo Test sarà: </p><p><span style="font-family:Courier New; font-size:9pt">First method </span></p><p><span style="font-family:Courier New; font-size:9pt">Second method </span></p><p>Quindi quando specifichiamo i parametri di tipo int e string il compilatore sceglie il primo dei due metodi, anche se a qualcuno sembrerebbe più logico il secondo. Se non specifichiamo i parametri di tipo, il compilatore sceglie il secondo dei metodi. </p><img src="/bressan/aggbug/57409.aspx" width="1" height="1" /> Cose da non fare mai http://blogs.ugidotnet.org/bressan/archive/2006/11/24/57138.aspx 2006-11-24T15:39:00Z 2006-11-24T15:39:00Z <p>L'articolo è un pò vecchiotto, ma fa riflettere visto che siamo all'alba di così tante nuove tecnologie:</p> <p><a href="http://italian.joelonsoftware.com/Articles/ThingsYouShouldNeverDoPar.html">http://italian.joelonsoftware.com/Articles/ThingsYouShouldNeverDoPar.html</a></p><img src="/bressan/aggbug/57138.aspx" width="1" height="1" /> Ancora su WPF http://blogs.ugidotnet.org/bressan/archive/2006/11/22/56086.aspx 2006-11-22T11:35:00Z 2006-11-22T11:35:00Z <p>Prendo spunto dai post di <a href="http://blogs.ugidotnet.org/gabrielc/archive/2006/11/20/55655.aspx">Gabriele</a> e <a href="http://blogs.ugidotnet.org/raffaele/archive/2006/11/21/55706.aspx">Raffaele</a>. Secondo me&nbsp;non dobbiamo pensare che WPF&nbsp;debba stravolgere quanto fatto da&nbsp;WinForms.&nbsp;Non dovremo per forza riprogettare tutta l'interfaccia dei nostri applicativi. La maggior parte delle applicazioni va bene così. In effetti anche Vista ha applicazioni alla Xp con i controlli standard con grafica migliorata. Quindi già il porting delle applicazioni "ASIS" miglioreranno la User Experience sotto Vista. Il vero vantaggio di WPF sta invece nel fatto che da oggi si possono scrivere applicazioni che prima era molto complicato ottenere su WinForms. Ad esempio nel campo gestionale, si potranno rappresentare i magazzini attraverso mappe 2D o meshes 3D con colorazioni diverse in base al tempo di giacenza o altri parametri. Il magazzino potrà essere navigato virtualmente e gli operatori avranno un'interfaccia più semplice ed intuitiva rispetto ad un insieme di codici e convenzioni. Anche nell'ambito produttivo le interfaccie potranno mostrare linee di produzione, macchinari, ecc.. dando informazioni sull'andamento dell'attività, delle manutenzioni e anomalie. L'inserimento di una fattura o di una anagrafica,&nbsp; pur migliorabili,&nbsp;potranno rimanere inalterate. WPF deve essere visto come un valore aggiunto a quanto&nbsp;fino ad ora abbiamo prodotto. In questo senso penso che la spinta verso la realizzazione di applicazioni basate su WPF averrà nel breve periodo e sarà forte al punto da giustificare lo sforzo&nbsp;di apprendimento della tecnologia. Chi comunque ha esperienza con ASP.NET anche se in ambito WinForm usa ancora VB6, sarà agevolato.&nbsp;Quello che invece richiederà maggiori sforzi e sarà più invasivo sugli applicativi esistenti sarà la conformità a UAC, ma questo è un altro discorso... </p><img src="/bressan/aggbug/56086.aspx" width="1" height="1" /> RE: TechEd Developer - Non siamo gli unici... :-D http://blogs.ugidotnet.org/bressan/archive/2006/11/10/54359.aspx 2006-11-10T13:49:00Z 2006-11-10T13:52:00Z <p>In riferimento ai&nbsp;post precedenti <a href="http://blogs.ugidotnet.org/raffaele/archive/2006/11/10/54331.aspx">#1</a> e <a href="http://blogs.ugidotnet.org/topics/archive/2006/11/10/54333.aspx">#2</a>.</p> <p>Non voglio innescare una polemica, ma ritengo che BISOGNA usare le stored procedures, sia per ragioni di sicurezza ma anche per ragioni prestazionali. E' vero però che in alcuni casi le SPs sono molto controproducenti, ad esempio quando si vuole fare una form di ricerca che includa o escluda criteri di filtro. In questo caso infatti la struttura della query non è rigida ma dinamica e allora tanto vale usare statement sql specifici. </p> <p>Ho scritto una piccola store in SQL 2005 nel database Northwind:</p> <p> <div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:f7ae893d-62ed-4376-a91b-df71911d4afc" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #0000FF; ">CREATE</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">PROCEDURE</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">dbo</span><span style="color: #FF0000; ">]</span><span style="color: #000000; ">.</span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">GetOrdersByDate</span><span style="color: #FF0000; ">]</span><span style="color: #000000; ">( </span><span style="color: #008000; ">@StartDate</span><span style="color: #000000; "> </span><span style="color: #000000; font-weight: bold; ">datetime</span><span style="color: #000000; ">, </span><span style="color: #008000; ">@EndDate</span><span style="color: #000000; "> </span><span style="color: #000000; font-weight: bold; ">datetime</span><span style="color: #000000; ">) </span><span style="color: #0000FF; ">AS</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">DECLARE</span><span style="color: #000000; "> </span><span style="color: #008000; ">@Number</span><span style="color: #000000; "> </span><span style="color: #000000; font-weight: bold; ">int</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">SELECT</span><span style="color: #000000; "> </span><span style="color: #008000; ">@Number</span><span style="color: #808080; ">=</span><span style="color: #FF00FF; ">COUNT</span><span style="color: #000000; ">(</span><span style="color: #808080; ">*</span><span style="color: #000000; ">) </span><span style="color: #0000FF; ">FROM</span><span style="color: #000000; "> Orders </span><span style="color: #0000FF; ">WHERE</span><span style="color: #000000; "> OrderDate</span><span style="color: #808080; ">&gt;=</span><span style="color: #008000; ">@StartDate</span><span style="color: #000000; "> </span><span style="color: #808080; ">AND</span><span style="color: #000000; "> OrderDate</span><span style="color: #808080; ">&lt;=</span><span style="color: #008000; ">@EndDate</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">GO</span></div></pre></div></p> <p>e questo statement di prova, nel quale eseguo 10000 volte la chiamata alla SP e 10000 volte la chiamata ad un analogo statement sql. Ogni chiamata ha parametri diversi.</p> <p> <div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:ee5e3bac-6601-49b7-90c8-51287be8fc6e" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #0000FF; ">DECLARE</span><span style="color: #000000; "> </span><span style="color: #008000; ">@StartDate</span><span style="color: #000000; "> </span><span style="color: #000000; font-weight: bold; ">datetime</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">DECLARE</span><span style="color: #000000; "> </span><span style="color: #008000; ">@EndDate</span><span style="color: #000000; "> </span><span style="color: #000000; font-weight: bold; ">datetime</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">DECLARE</span><span style="color: #000000; "> </span><span style="color: #008000; ">@Time</span><span style="color: #000000; "> </span><span style="color: #000000; font-weight: bold; ">datetime</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">DECLARE</span><span style="color: #000000; "> </span><span style="color: #008000; ">@i</span><span style="color: #000000; "> </span><span style="color: #000000; font-weight: bold; ">int</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">DECLARE</span><span style="color: #000000; "> </span><span style="color: #008000; ">@Query</span><span style="color: #000000; "> </span><span style="color: #000000; font-weight: bold; ">VARCHAR</span><span style="color: #000000; ">(</span><span style="color: #800000; font-weight: bold; ">1000</span><span style="color: #000000; ">) </span><span style="color: #0000FF; ">SET</span><span style="color: #000000; "> </span><span style="color: #008000; ">@Time</span><span style="color: #000000; "> </span><span style="color: #808080; ">=</span><span style="color: #000000; "> </span><span style="color: #FF00FF; ">GETDATE</span><span style="color: #000000; ">() </span><span style="color: #0000FF; ">SET</span><span style="color: #000000; "> </span><span style="color: #008000; ">@i</span><span style="color: #000000; "> </span><span style="color: #808080; ">=</span><span style="color: #000000; "> </span><span style="color: #800000; font-weight: bold; ">0</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">SELECT</span><span style="color: #000000; "> </span><span style="color: #008000; ">@StartDate</span><span style="color: #000000; "> </span><span style="color: #808080; ">=</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">2000-01-01</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">SELECT</span><span style="color: #000000; "> </span><span style="color: #008000; ">@EndDate</span><span style="color: #000000; "> </span><span style="color: #808080; ">=</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">2010-01-01</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">WHILE</span><span style="color: #000000; "> (</span><span style="color: #008000; ">@i</span><span style="color: #808080; ">&lt;</span><span style="color: #800000; font-weight: bold; ">10000</span><span style="color: #000000; ">) </span><span style="color: #0000FF; ">BEGIN</span><span style="color: #000000; "> </span><span style="color: #008080; ">--</span><span style="color: #008080; "> Questo calcolo &#232; inutile qui: serve per avere lo stesso contesto della</span><span style="color: #008080; "> </span><span style="color: #000000; "> </span><span style="color: #008080; ">--</span><span style="color: #008080; "> chiamata via sql statement</span><span style="color: #008080; "> </span><span style="color: #000000; "> </span><span style="color: #0000FF; ">SET</span><span style="color: #000000; "> </span><span style="color: #008000; ">@Query</span><span style="color: #000000; "> </span><span style="color: #808080; ">=</span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">DECLARE @Number int SELECT @Number=COUNT(*) FROM Orders WHERE OrderDate&gt;=</span><span style="color: #FF0000; ">'''</span><span style="color: #000000; "> </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF00FF; ">CONVERT</span><span style="color: #000000; ">(</span><span style="color: #000000; font-weight: bold; ">VARCHAR</span><span style="color: #000000; ">(</span><span style="color: #800000; font-weight: bold; ">4</span><span style="color: #000000; ">), </span><span style="color: #FF00FF; ">YEAR</span><span style="color: #000000; ">(</span><span style="color: #008000; ">@StartDate</span><span style="color: #000000; ">)) </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">-</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF00FF; ">CONVERT</span><span style="color: #000000; ">(</span><span style="color: #000000; font-weight: bold; ">VARCHAR</span><span style="color: #000000; ">(</span><span style="color: #800000; font-weight: bold; ">2</span><span style="color: #000000; ">), </span><span style="color: #FF00FF; ">MONTH</span><span style="color: #000000; ">(</span><span style="color: #008000; ">@StartDate</span><span style="color: #000000; ">)) </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">-</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF00FF; ">CONVERT</span><span style="color: #000000; ">(</span><span style="color: #000000; font-weight: bold; ">VARCHAR</span><span style="color: #000000; ">(</span><span style="color: #800000; font-weight: bold; ">2</span><span style="color: #000000; ">), </span><span style="color: #FF00FF; ">DAY</span><span style="color: #000000; ">(</span><span style="color: #008000; ">@StartDate</span><span style="color: #000000; ">)) </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">'''</span><span style="color: #FF0000; "> AND OrderDate&lt;=</span><span style="color: #FF0000; ">'''</span><span style="color: #000000; "> </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF00FF; ">CONVERT</span><span style="color: #000000; ">(</span><span style="color: #000000; font-weight: bold; ">VARCHAR</span><span style="color: #000000; ">(</span><span style="color: #800000; font-weight: bold; ">4</span><span style="color: #000000; ">), </span><span style="color: #FF00FF; ">YEAR</span><span style="color: #000000; ">(</span><span style="color: #008000; ">@EndDate</span><span style="color: #000000; ">)) </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">-</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF00FF; ">CONVERT</span><span style="color: #000000; ">(</span><span style="color: #000000; font-weight: bold; ">VARCHAR</span><span style="color: #000000; ">(</span><span style="color: #800000; font-weight: bold; ">2</span><span style="color: #000000; ">), </span><span style="color: #FF00FF; ">MONTH</span><span style="color: #000000; ">(</span><span style="color: #008000; ">@EndDate</span><span style="color: #000000; ">)) </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">-</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF00FF; ">CONVERT</span><span style="color: #000000; ">(</span><span style="color: #000000; font-weight: bold; ">VARCHAR</span><span style="color: #000000; ">(</span><span style="color: #800000; font-weight: bold; ">2</span><span style="color: #000000; ">), </span><span style="color: #FF00FF; ">DAY</span><span style="color: #000000; ">(</span><span style="color: #008000; ">@EndDate</span><span style="color: #000000; ">)) </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">''''</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">EXECUTE</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">Northwind</span><span style="color: #FF0000; ">]</span><span style="color: #000000; ">.</span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">dbo</span><span style="color: #FF0000; ">]</span><span style="color: #000000; ">.</span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">GetOrdersByDate</span><span style="color: #FF0000; ">]</span><span style="color: #000000; "> </span><span style="color: #008000; ">@StartDate</span><span style="color: #000000; "> ,</span><span style="color: #008000; ">@EndDate</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">SET</span><span style="color: #000000; "> </span><span style="color: #008000; ">@StartDate</span><span style="color: #000000; "> </span><span style="color: #808080; ">=</span><span style="color: #000000; "> </span><span style="color: #FF00FF; ">DATEADD</span><span style="color: #000000; ">(</span><span style="color: #FF00FF; ">day</span><span style="color: #000000; ">, </span><span style="color: #800000; font-weight: bold; ">1</span><span style="color: #000000; ">, </span><span style="color: #008000; ">@StartDate</span><span style="color: #000000; ">) </span><span style="color: #0000FF; ">SET</span><span style="color: #000000; "> </span><span style="color: #008000; ">@i</span><span style="color: #000000; "> </span><span style="color: #808080; ">=</span><span style="color: #000000; "> </span><span style="color: #008000; ">@i</span><span style="color: #000000; "> </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #800000; font-weight: bold; ">1</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">END</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">SELECT</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">Store procedure:</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF00FF; ">CAST</span><span style="color: #000000; ">(</span><span style="color: #FF00FF; ">DATEDIFF</span><span style="color: #000000; ">(ms,</span><span style="color: #008000; ">@Time</span><span style="color: #000000; ">,</span><span style="color: #FF00FF; ">GETDATE</span><span style="color: #000000; ">()) </span><span style="color: #0000FF; ">AS</span><span style="color: #000000; "> </span><span style="color: #000000; font-weight: bold; ">VARCHAR</span><span style="color: #000000; ">(</span><span style="color: #800000; font-weight: bold; ">50</span><span style="color: #000000; ">)) </span><span style="color: #0000FF; ">SET</span><span style="color: #000000; "> </span><span style="color: #008000; ">@Time</span><span style="color: #000000; "> </span><span style="color: #808080; ">=</span><span style="color: #000000; "> </span><span style="color: #FF00FF; ">GETDATE</span><span style="color: #000000; ">() </span><span style="color: #0000FF; ">SET</span><span style="color: #000000; "> </span><span style="color: #008000; ">@i</span><span style="color: #000000; "> </span><span style="color: #808080; ">=</span><span style="color: #000000; "> </span><span style="color: #800000; font-weight: bold; ">0</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">SELECT</span><span style="color: #000000; "> </span><span style="color: #008000; ">@StartDate</span><span style="color: #000000; "> </span><span style="color: #808080; ">=</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">2000-01-01</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">SELECT</span><span style="color: #000000; "> </span><span style="color: #008000; ">@EndDate</span><span style="color: #000000; "> </span><span style="color: #808080; ">=</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">2010-01-01</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">WHILE</span><span style="color: #000000; "> (</span><span style="color: #008000; ">@i</span><span style="color: #808080; ">&lt;</span><span style="color: #800000; font-weight: bold; ">10000</span><span style="color: #000000; ">) </span><span style="color: #0000FF; ">BEGIN</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">SET</span><span style="color: #000000; "> </span><span style="color: #008000; ">@Query</span><span style="color: #000000; "> </span><span style="color: #808080; ">=</span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">DECLARE @Number int SELECT @Number=COUNT(*) FROM Orders WHERE OrderDate&gt;=</span><span style="color: #FF0000; ">'''</span><span style="color: #000000; "> </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF00FF; ">CONVERT</span><span style="color: #000000; ">(</span><span style="color: #000000; font-weight: bold; ">VARCHAR</span><span style="color: #000000; ">(</span><span style="color: #800000; font-weight: bold; ">4</span><span style="color: #000000; ">), </span><span style="color: #FF00FF; ">YEAR</span><span style="color: #000000; ">(</span><span style="color: #008000; ">@StartDate</span><span style="color: #000000; ">)) </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">-</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF00FF; ">CONVERT</span><span style="color: #000000; ">(</span><span style="color: #000000; font-weight: bold; ">VARCHAR</span><span style="color: #000000; ">(</span><span style="color: #800000; font-weight: bold; ">2</span><span style="color: #000000; ">), </span><span style="color: #FF00FF; ">MONTH</span><span style="color: #000000; ">(</span><span style="color: #008000; ">@StartDate</span><span style="color: #000000; ">)) </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">-</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF00FF; ">CONVERT</span><span style="color: #000000; ">(</span><span style="color: #000000; font-weight: bold; ">VARCHAR</span><span style="color: #000000; ">(</span><span style="color: #800000; font-weight: bold; ">2</span><span style="color: #000000; ">), </span><span style="color: #FF00FF; ">DAY</span><span style="color: #000000; ">(</span><span style="color: #008000; ">@StartDate</span><span style="color: #000000; ">)) </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">'''</span><span style="color: #FF0000; "> AND OrderDate&lt;=</span><span style="color: #FF0000; ">'''</span><span style="color: #000000; "> </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF00FF; ">CONVERT</span><span style="color: #000000; ">(</span><span style="color: #000000; font-weight: bold; ">VARCHAR</span><span style="color: #000000; ">(</span><span style="color: #800000; font-weight: bold; ">4</span><span style="color: #000000; ">), </span><span style="color: #FF00FF; ">YEAR</span><span style="color: #000000; ">(</span><span style="color: #008000; ">@EndDate</span><span style="color: #000000; ">)) </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">-</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF00FF; ">CONVERT</span><span style="color: #000000; ">(</span><span style="color: #000000; font-weight: bold; ">VARCHAR</span><span style="color: #000000; ">(</span><span style="color: #800000; font-weight: bold; ">2</span><span style="color: #000000; ">), </span><span style="color: #FF00FF; ">MONTH</span><span style="color: #000000; ">(</span><span style="color: #008000; ">@EndDate</span><span style="color: #000000; ">)) </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">-</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF00FF; ">CONVERT</span><span style="color: #000000; ">(</span><span style="color: #000000; font-weight: bold; ">VARCHAR</span><span style="color: #000000; ">(</span><span style="color: #800000; font-weight: bold; ">2</span><span style="color: #000000; ">), </span><span style="color: #FF00FF; ">DAY</span><span style="color: #000000; ">(</span><span style="color: #008000; ">@EndDate</span><span style="color: #000000; ">)) </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">''''</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">EXECUTE</span><span style="color: #000000; "> (</span><span style="color: #008000; ">@Query</span><span style="color: #000000; ">) </span><span style="color: #0000FF; ">SET</span><span style="color: #000000; "> </span><span style="color: #008000; ">@StartDate</span><span style="color: #000000; "> </span><span style="color: #808080; ">=</span><span style="color: #000000; "> </span><span style="color: #FF00FF; ">DATEADD</span><span style="color: #000000; ">(</span><span style="color: #FF00FF; ">day</span><span style="color: #000000; ">, </span><span style="color: #800000; font-weight: bold; ">1</span><span style="color: #000000; ">, </span><span style="color: #008000; ">@StartDate</span><span style="color: #000000; ">) </span><span style="color: #0000FF; ">SET</span><span style="color: #000000; "> </span><span style="color: #008000; ">@i</span><span style="color: #000000; "> </span><span style="color: #808080; ">=</span><span style="color: #000000; "> </span><span style="color: #008000; ">@i</span><span style="color: #000000; "> </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #800000; font-weight: bold; ">1</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">END</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">SELECT</span><span style="color: #000000; "> </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">Query:</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #808080; ">+</span><span style="color: #000000; "> </span><span style="color: #FF00FF; ">CAST</span><span style="color: #000000; ">(</span><span style="color: #FF00FF; ">DATEDIFF</span><span style="color: #000000; ">(ms,</span><span style="color: #008000; ">@Time</span><span style="color: #000000; ">,</span><span style="color: #FF00FF; ">GETDATE</span><span style="color: #000000; ">()) </span><span style="color: #0000FF; ">AS</span><span style="color: #000000; "> </span><span style="color: #000000; font-weight: bold; ">VARCHAR</span><span style="color: #000000; ">(</span><span style="color: #800000; font-weight: bold; ">50</span><span style="color: #000000; ">))</span></div></pre></div></p> <p>Risultato: 10000 chiamate a SP in ~560 ms, 10000 chiamate a sql statement in ~16300 ms. Quindi in questo semplice esempio le SP sono ~29 volte più veloci degli statement sql. Quindi, la scelta di cosa usare dipende ancora una volta dal particolare contesto.</p><img src="/bressan/aggbug/54359.aspx" width="1" height="1" /> Multi-Language Addin for VS http://blogs.ugidotnet.org/bressan/archive/2006/11/07/54083.aspx 2006-11-07T14:00:00Z 2006-11-07T14:00:00Z <p>Per quanti hanno patito le pene dell'inferno nel cercare di gestire la localizzazione di grossi progetti winform, consiglio questo addin che per me è diventato oramai indispensabile. Lo trovate <a href="http://www.jollans.com/">qui</a>.</p> <p>&nbsp;</p> <p>L'addin analizza un progetto alla volta della vostra soluzione. Estrae tutte le proprietà localizzabili dei controlli/componenti delle form in una lista, tutte le stringhe presenti nel codice in un'altra lista. In modo molto intuitivo è possibile aggiungere lingue e gestire i contenuti localizzati. Si basa su un proprio database locale, ma esporta in file di risorsa.</p> <p>&nbsp;</p> <p>P.S.: Non lasciatevi spaventare dal sito, il prodotto è fatto molto bene.</p><img src="/bressan/aggbug/54083.aspx" width="1" height="1" /> Snippet per la lettura di un attributo XML http://blogs.ugidotnet.org/bressan/archive/2006/11/06/53987.aspx 2006-11-06T17:19:00Z 2006-11-06T18:05:00Z <p></p> <p>Molte volte è necessario leggere un file XML in modo programmatico, mappando ad esempio attributi di un nodo xml in campi del proprio object model. Questo snippet di codice permette di leggere un attributo di un nodo, convertirlo nel tipo desiderato e nel caso in cui l'attributo non esista o il relativo valore sia non convertibile nel tipo di destinazione, utilizzare un valore di default.</p> <p></p> <div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:0458819e-3ba2-4819-a01c-b492c3ee2082" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:#EBEBEB;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> XmlHelpers{ </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> T GetAttribute</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(XmlNode node ,</span><span style="color: #0000FF; ">string</span><span style="color: #000000; "> attributeName ,T defaultValue ){ T rtn </span><span style="color: #000000; ">=</span><span style="color: #000000; "> defaultValue; XmlAttribute attr </span><span style="color: #000000; ">=</span><span style="color: #000000; "> node.Attributes[attributeName]; </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (attr </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) { Type type </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">typeof</span><span style="color: #000000; ">(T); </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (type </span><span style="color: #000000; ">==</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">typeof</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">)) </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> (T)((</span><span style="color: #0000FF; ">object</span><span style="color: #000000; ">)attr.InnerText); TypeConverter converter </span><span style="color: #000000; ">=</span><span style="color: #000000; "> TypeDescriptor.GetConverter(type); </span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">{ </span><span style="color: #0000FF; ">object</span><span style="color: #000000; "> result </span><span style="color: #000000; ">=</span><span style="color: #000000; "> converter.ConvertFromString(attr.InnerText); </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (result </span><span style="color: #0000FF; ">is</span><span style="color: #000000; "> T) rtn </span><span style="color: #000000; ">=</span><span style="color: #000000; "> (T)result; }</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (System.FormatException){} } </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> rtn; } }</span></div></pre></div> <p></p> <p>Per richiamarlo posso scrivere ad esempio:</p> <div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:2ccc11bb-3907-4831-948c-34250979ba8c" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:#E5E5E5;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #000000; ">Foo f </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Foo(); f.PropA </span><span style="color: #000000; ">=</span><span style="color: #000000; "> XmlHelpers.GetAttribute</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(fooNode, </span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">A</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">, </span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">); </span></div></pre></div><img src="/bressan/aggbug/53987.aspx" width="1" height="1" /> Salve a tutti! http://blogs.ugidotnet.org/bressan/archive/2006/05/05/40113.aspx 2006-05-05T17:52:00Z 2006-05-05T17:52:00Z Dopo un pò di anni di presenza in ugidotnet ho finalmente deciso di pubblicare il mio blog. Utilizzerò questo spazio per condividere informazioni tecniche e per portare il mio contributo alla comunità di ugi.<img src="/bressan/aggbug/40113.aspx" width="1" height="1" /> System.Web.HttpWriter