<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://dotnetside.org/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>MADIL's Blog</title><link>http://dotnetside.org/blogs/madil/default.aspx</link><description>Un giorno anche la guerra si inchinerà davanti al suono di una chitarra (J.Morrison)</description><dc:language>it</dc:language><generator>CommunityServer 2008 SP1 (Build: 30619.63)</generator><item><title>Localizzazione con SQL Server parte II</title><link>http://dotnetside.org/blogs/madil/archive/2010/01/04/localizzazione-con-sql-server-parte-ii.aspx</link><pubDate>Mon, 04 Jan 2010 19:43:15 GMT</pubDate><guid isPermaLink="false">2d5e8256-a19a-4586-a65e-031f7ebe8345:22372</guid><dc:creator>MADIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetside.org/blogs/madil/rsscomments.aspx?PostID=22372</wfw:commentRss><comments>http://dotnetside.org/blogs/madil/archive/2010/01/04/localizzazione-con-sql-server-parte-ii.aspx#comments</comments><description>&lt;p&gt;Tornando al problema della localizzazione visto nel &lt;a href="http://dotnetside.org/blogs/madil/archive/2010/01/02/localizzazione-e-paginazione-con-sql-server.aspx"&gt;post precedente&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;In questo caso devo estrarre una singola notizia con tutte le sue localizzazioni; questa è una tipica situazione che si verifica a livello di &lt;em&gt;(back end)&lt;/em&gt;, dove l’utente vuole avere la possibilità di modificare le informazioni generali della notizia e le informazioni relative alle versioni localizzate, ottenendo la query &lt;em&gt;(vedi codice).&lt;/em&gt;&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @CultureIdDefault &lt;span class="kwrd"&gt;AS&lt;/span&gt; &lt;span class="kwrd"&gt;INT&lt;/span&gt; = 16;   &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @NewsId &lt;span class="kwrd"&gt;AS&lt;/span&gt; UNIQUEIDENTIFIER = &lt;span class="str"&gt;'51C0E6DF-58B7-4913-A156-9A6196C3FBC1'&lt;/span&gt;; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt;    NewsGenerale.&lt;span class="kwrd"&gt;Data&lt;/span&gt;, NewsGenerale.ImmagineUrl, NewsGenerale.Url,   &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;          NewsLocaleDefault.CultureId &lt;span class="kwrd"&gt;AS&lt;/span&gt; CultureIdLocaleDefault,    &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;          NewsLocaleDefault.ImmagineAltTesto &lt;span class="kwrd"&gt;AS&lt;/span&gt; ImmagineAltTestoLocaleDefault,    &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;          NewsLocaleDefault.Titolo &lt;span class="kwrd"&gt;AS&lt;/span&gt; TitoloLocaleDefault,   &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;          NewsLocaleDefault.Abstract &lt;span class="kwrd"&gt;AS&lt;/span&gt; AbstractLocaleDefault,    &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;          NewsLocaleDefault.Testo &lt;span class="kwrd"&gt;AS&lt;/span&gt; TestoLocaleDefault,   &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;          NewsLocale.CultureId &lt;span class="kwrd"&gt;AS&lt;/span&gt; CultureIdLocale,   &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;          NewsLocale.ImmagineAltTesto &lt;span class="kwrd"&gt;AS&lt;/span&gt; ImmagineAltTestoLocale,   &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;          NewsLocale.Titolo &lt;span class="kwrd"&gt;AS&lt;/span&gt; TitoloLocale,   &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;          NewsLocale.Abstract &lt;span class="kwrd"&gt;AS&lt;/span&gt; AbstractLocale, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;          NewsLocale.Testo &lt;span class="kwrd"&gt;AS&lt;/span&gt; TestoLocale  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&lt;span class="kwrd"&gt;FROM&lt;/span&gt;      (  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;   NewsId, Visibile, &lt;span class="kwrd"&gt;Data&lt;/span&gt;, ImmagineUrl, Url  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            &lt;span class="kwrd"&gt;FROM&lt;/span&gt;     News&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            &lt;span class="kwrd"&gt;WHERE&lt;/span&gt;     NewsId = @NewsId&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;          ) &lt;span class="kwrd"&gt;AS&lt;/span&gt; NewsGenerale &lt;span class="kwrd"&gt;INNER&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt;  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;          (  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;   NewsId, CultureId, ImmagineAltTesto, Titolo, Abstract, Testo  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            &lt;span class="kwrd"&gt;FROM&lt;/span&gt;     NewsLocale &lt;span class="kwrd"&gt;AS&lt;/span&gt; NewsLocale_2  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            &lt;span class="kwrd"&gt;WHERE&lt;/span&gt;    (NewsId = @NewsId) &lt;span class="kwrd"&gt;AND&lt;/span&gt; (CultureId = @CultureIdDefault)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;          ) &lt;span class="kwrd"&gt;AS&lt;/span&gt; NewsLocaleDefault &lt;span class="kwrd"&gt;ON&lt;/span&gt; NewsGenerale.NewsId = NewsLocaleDefault.NewsId &lt;span class="kwrd"&gt;LEFT&lt;/span&gt; &lt;span class="kwrd"&gt;OUTER&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt;  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;          (  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;   NewsId, CultureId, ImmagineAltTesto, Titolo, Abstract, Testo  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            &lt;span class="kwrd"&gt;FROM&lt;/span&gt;     NewsLocale &lt;span class="kwrd"&gt;AS&lt;/span&gt; NewsLocale_1 &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;            &lt;span class="kwrd"&gt;WHERE&lt;/span&gt;   (NewsId = @NewsId) &lt;span class="kwrd"&gt;AND&lt;/span&gt; (CultureId &amp;lt;&amp;gt; @CultureIdDefault)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;           ) &lt;span class="kwrd"&gt;AS&lt;/span&gt; NewsLocale &lt;span class="kwrd"&gt;ON&lt;/span&gt; NewsGenerale.NewsId = NewsLocale.NewsId&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;










.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Questa query permette di estrarre in un unico passaggio la notizia identificata dal NewsId con tutte le sue localizzazioni, per distinguere la lingua di default dalle altre localizzazioni vengono utilizzati due join; il primo un &lt;em&gt;INNER JOIN&lt;/em&gt; che permette di recuperare i dati localizzati nella lingua di default, il secondo un &lt;em&gt;LEFT OUTER JOIN&lt;/em&gt; che permette di recuperare i dati localizzati nelle altre lingue.&lt;/p&gt;

&lt;p&gt;Con questa query ottengo tante righe quante sono le localizzazioni presenti, quindi i dati generali della notizia e i dati localizzati nella lingua di default vengono ripetuti ottenendo una ridondanza di dati, nel caso in cui i dati relativi alla notizia siano presenti solo nella lingua di default otterremo una riga dove i dati relativi alla localizzazioni saranno &lt;em&gt;NULL&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;La notizia completa è un’entità composta da una classe contenente i dati generali della notizia, e da una lista di classi contenenti le localizzazioni della notizia.&lt;/p&gt;

&lt;p&gt;La notizia completa viene costruita utilizzando un ciclo. I dati generali della notizia ed i dati localizzati nella lingua di default vengono recuperati la prima volta che viene eseguito il ciclo mentre i dati localizzati vengono recuperati ogni volta che il ciclo viene eseguito &lt;em&gt;(“vedi codice”).&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;      boNewsCompleta nc = &lt;span class="kwrd"&gt;new&lt;/span&gt; boNewsCompleta();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;      nc.ParteDeLoc = &lt;span class="kwrd"&gt;new&lt;/span&gt; boNewsDeLoc();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;      nc.ParteLocale = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;boNewsLocale&amp;gt;();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;      boNewsLocale nl;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;      &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;      SqlDataReader r;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;      &lt;span class="kwrd"&gt;bool&lt;/span&gt; primaVolta = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;      &lt;span class="kwrd"&gt;string&lt;/span&gt; msg;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;      &lt;span class="kwrd"&gt;while&lt;/span&gt; (r.Read())&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;      {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="rem"&gt;//Verifica se è la prima volta che si entra nel ciclo&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (primaVolta)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;          &lt;span class="rem"&gt;//Notizia generale&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;          nc.ParteDeLoc.Data = (DateTime)r[&lt;span class="str"&gt;&amp;quot;Data&amp;quot;&lt;/span&gt;];&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;          nc.ParteDeLoc.ImmagineUrl = (String)r[&lt;span class="str"&gt;&amp;quot;ImmagineUrl&amp;quot;&lt;/span&gt;];&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;          nc.ParteDeLoc.Url = (String)r[&lt;span class="str"&gt;&amp;quot;Url&amp;quot;&lt;/span&gt;];&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;          &lt;span class="rem"&gt;//Notizia localizzata nella lingua di default&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;          nl = &lt;span class="kwrd"&gt;new&lt;/span&gt; boNewsLocale();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;          nl.CultureId = (&lt;span class="kwrd"&gt;int&lt;/span&gt;)r[&lt;span class="str"&gt;&amp;quot;CultureIdLocaleDefault&amp;quot;&lt;/span&gt;];&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;          nl.ImmagineAltTesto = (String)r[&lt;span class="str"&gt;&amp;quot;ImmagineAltTestoLocaleDefault&amp;quot;&lt;/span&gt;];&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;          nl.Titolo = (String)r[&lt;span class="str"&gt;&amp;quot;TitoloLocaleDefault&amp;quot;&lt;/span&gt;];&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;          nl.Abstract = (String)r[&lt;span class="str"&gt;&amp;quot;AbstractLocaleDefault&amp;quot;&lt;/span&gt;];&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;          nl.Testo = (String)r[&lt;span class="str"&gt;&amp;quot;TestoLocaleDefault&amp;quot;&lt;/span&gt;];&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;          nc.ParteLocale.Add(nl);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;          &lt;span class="rem"&gt;//Imposta il flag a false&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;          primaVolta = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;        &lt;span class="rem"&gt;//Notizia localizzata&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        nl = &lt;span class="kwrd"&gt;new&lt;/span&gt; boNewsLocale();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        nl.CultureId = (r[&lt;span class="str"&gt;&amp;quot;CultureIdLocale&amp;quot;&lt;/span&gt;] &lt;span class="kwrd"&gt;is&lt;/span&gt; DBNull) ? 0 : (&lt;span class="kwrd"&gt;int&lt;/span&gt;)r[&lt;span class="str"&gt;&amp;quot;CultureIdLocale&amp;quot;&lt;/span&gt;];&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        nl.ImmagineAltTesto = (r[&lt;span class="str"&gt;&amp;quot;ImmagineAltTestoLocale&amp;quot;&lt;/span&gt;] &lt;span class="kwrd"&gt;is&lt;/span&gt; DBNull) ? String.Empty : (String)r[&lt;span class="str"&gt;&amp;quot;ImmagineAltTestoLocale&amp;quot;&lt;/span&gt;];&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;        nl.Titolo = (r[&lt;span class="str"&gt;&amp;quot;TitoloLocale&amp;quot;&lt;/span&gt;] &lt;span class="kwrd"&gt;is&lt;/span&gt; DBNull) ? String.Empty : (String)r[&lt;span class="str"&gt;&amp;quot;TitoloLocale&amp;quot;&lt;/span&gt;];&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;        nl.Abstract = (r[&lt;span class="str"&gt;&amp;quot;AbstractLocale&amp;quot;&lt;/span&gt;] &lt;span class="kwrd"&gt;is&lt;/span&gt; DBNull) ? String.Empty : (String)r[&lt;span class="str"&gt;&amp;quot;AbstractLocale&amp;quot;&lt;/span&gt;];&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;        nl.Testo = (r[&lt;span class="str"&gt;&amp;quot;TestoLocale&amp;quot;&lt;/span&gt;] &lt;span class="kwrd"&gt;is&lt;/span&gt; DBNull) ? String.Empty : (String)r[&lt;span class="str"&gt;&amp;quot;TestoLocale&amp;quot;&lt;/span&gt;];&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;        &lt;span class="rem"&gt;//Verifica se la notizia localizzata è stata creata correttamente &lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (!nl.IsNull(&lt;span class="kwrd"&gt;out&lt;/span&gt; msg))&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;          nc.ParteLocale.Add(nl);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;      }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;









.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetside.org/aggbug.aspx?PostID=22372" width="1" height="1"&gt;</description><category domain="http://dotnetside.org/blogs/madil/archive/tags/Sql+Server/default.aspx">Sql Server</category><category domain="http://dotnetside.org/blogs/madil/archive/tags/SQL/default.aspx">SQL</category></item><item><title>.NET CAMPUS 2010</title><link>http://dotnetside.org/blogs/madil/archive/2010/01/04/net-campus-2010.aspx</link><pubDate>Mon, 04 Jan 2010 19:07:58 GMT</pubDate><guid isPermaLink="false">2d5e8256-a19a-4586-a65e-031f7ebe8345:22371</guid><dc:creator>MADIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetside.org/blogs/madil/rsscomments.aspx?PostID=22371</wfw:commentRss><comments>http://dotnetside.org/blogs/madil/archive/2010/01/04/net-campus-2010.aspx#comments</comments><description>&lt;p&gt;&lt;a title="Banner evento .NET CAMPUS 2010" href="http://www.dotnetcampus.it/" target="_blank"&gt;&lt;img style="margin: 0px 15px 0px 0px; display: inline" alt="banner-evento" align="left" src="http://static.flickr.com/4064/4245416580_1dbcbb8e88.jpg" width="240" height="137" /&gt;&lt;/a&gt;Il 10/03/2010 a Roma si svolgerà un evento su tecnologie .NET, al quale penso valga la pena partecipare.&lt;/p&gt;  &lt;p&gt;Si tratta di un evento gratuito che durerà tutta la giornata dove verranno illustrate le nuove caratteristiche presenti nel Framework 4.0. &lt;/p&gt;  &lt;p&gt;Inoltre ci saranno momenti d’incontro e contatto con diverse aziende, alle quali sarà possibile lasciare il proprio CV.&lt;/p&gt;  &lt;p&gt;Ecco alcuni link utili relativi all’evento.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.dotnetcampus.it/Evento.aspx" target="_blank"&gt;Evento .NET CAMPUS 2010&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032433548&amp;amp;Culture=it-IT" target="_blank"&gt;Iscrizioni a .NET CAMPUS 2010&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.dotnetcampus.it/Agenda.aspx" target="_blank"&gt;Agenda .NET CAMPUS 2010&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.dotnetcampus.it/Speaker.aspx" target="_blank"&gt;Speaker .NET CAMPUS 2010&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetside.org/aggbug.aspx?PostID=22371" width="1" height="1"&gt;</description><category domain="http://dotnetside.org/blogs/madil/archive/tags/Other/default.aspx">Other</category><category domain="http://dotnetside.org/blogs/madil/archive/tags/Eventi/default.aspx">Eventi</category></item><item><title>Localizzazione e paginazione con SQL Server</title><link>http://dotnetside.org/blogs/madil/archive/2010/01/02/localizzazione-e-paginazione-con-sql-server.aspx</link><pubDate>Sat, 02 Jan 2010 16:36:42 GMT</pubDate><guid isPermaLink="false">2d5e8256-a19a-4586-a65e-031f7ebe8345:22370</guid><dc:creator>MADIL</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetside.org/blogs/madil/rsscomments.aspx?PostID=22370</wfw:commentRss><comments>http://dotnetside.org/blogs/madil/archive/2010/01/02/localizzazione-e-paginazione-con-sql-server.aspx#comments</comments><description>&lt;p&gt;Un problema ricorrente molto spesso nei siti Web è legato alla localizzazione dei dati, se questi sono memorizzati in un database, quando si estraggono i dati bisogna tenere conto del fatto che alcune informazioni potrebbero non essere state localizzate, quindi è necessario estrarre le informazioni nella lingua di default.&lt;/p&gt;  &lt;p&gt;Il modo più semplice per risolvere questo problema consiste nell’effettuare due accessi al database, il primo nel quale prendo i dati localizzati, se questa operazione non va a buon fine effettuo il secondo accesso al database nel quale prendo i dati nella lingua di default.&lt;/p&gt;  &lt;p&gt;Il tipo di approccio descritto sopra richiede un numero elevato di accessi al database e per siti di medie/grandi dimensioni influisce negativamente sulle prestazioni, per questo motivo l’ideale sarebbe prendere tutti i dati necessari dal database con un unica query, provvedo a verificare l’esistenza dei dati localizzati o meno da codice.&lt;/p&gt;  &lt;p&gt;Per essere più chiaro abbiamo un database con delle news localizzate quindi avremo due tabelle una con i dati generali delle news e l’altra con i dati localizzati &lt;em&gt;(vedi codice)&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; [News](&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    [NewsId] [uniqueidentifier] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    [&lt;span class="kwrd"&gt;Data&lt;/span&gt;] [datetime] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    [ImmagineUrl] [&lt;span class="kwrd"&gt;varchar&lt;/span&gt;](255) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    [Url] [nvarchar](&lt;span class="kwrd"&gt;max&lt;/span&gt;) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;CONSTRAINT&lt;/span&gt; [PK_news] &lt;span class="kwrd"&gt;PRIMARY&lt;/span&gt; &lt;span class="kwrd"&gt;KEY&lt;/span&gt; &lt;span class="kwrd"&gt;CLUSTERED&lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    [NewsId] &lt;span class="kwrd"&gt;ASC&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; [NewsLocale](&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    [NewsId] [uniqueidentifier] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    [CultureId] [&lt;span class="kwrd"&gt;int&lt;/span&gt;] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    [ImmagineAltTesto] [nvarchar](255) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    [Titolo] [nvarchar](255) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    [Abstract] [nvarchar](&lt;span class="kwrd"&gt;max&lt;/span&gt;) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    [Testo] [nvarchar](&lt;span class="kwrd"&gt;max&lt;/span&gt;) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt; &lt;span class="kwrd"&gt;CONSTRAINT&lt;/span&gt; [PK_NewsLocale_1] &lt;span class="kwrd"&gt;PRIMARY&lt;/span&gt; &lt;span class="kwrd"&gt;KEY&lt;/span&gt; &lt;span class="kwrd"&gt;CLUSTERED&lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;    [NewsId] &lt;span class="kwrd"&gt;ASC&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    [CultureId] &lt;span class="kwrd"&gt;ASC&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;)&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;










.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Nella Tabella “&lt;em&gt;NewsLocale”&lt;/em&gt; vanno memorizzati i dati localizzati della notizia che vengono distinti per “&lt;em&gt;NewsId” &lt;/em&gt;e “&lt;em&gt;CultureId”&lt;/em&gt; . La query che, permette di selezionare le notizie localizzate sia nella lingua di default che nella lingua richiesta dall’utente, prevede l’utilizzo di due “&lt;em&gt;JOIN”&lt;/em&gt; &lt;em&gt;(vedi foto) &lt;/em&gt;un “&lt;em&gt;LEFT OUTER JOIN”&lt;/em&gt; per estrarre i dati localizzati ed un &lt;em&gt;INNER JOIN”&lt;/em&gt; per estrarre i dati localizzati nella lingua di default &lt;em&gt;(vedi codice)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a title="QueryJoin" href="http://www.flickr.com/photos/8919199@N04/4237605990/"&gt;&lt;img style="margin: 0px 10px" border="0" alt="QueryJoin" src="http://static.flickr.com/2775/4237605990_4f1a99047c.jpg" width="692" height="227" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @CultureIdDefault &lt;span class="kwrd"&gt;AS&lt;/span&gt; &lt;span class="kwrd"&gt;INT&lt;/span&gt; = 16;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @CultureId          &lt;span class="kwrd"&gt;AS&lt;/span&gt; &lt;span class="kwrd"&gt;INT&lt;/span&gt; = 9;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt;    NewsGenerale.&lt;span class="kwrd"&gt;Data&lt;/span&gt;, NewsGenerale.ImmagineUrl, NewsGenerale.Url, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;          NewsLocaleDefault.CultureId &lt;span class="kwrd"&gt;AS&lt;/span&gt; CultureIdLocaleDefault, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;          NewsLocaleDefault.ImmagineAltTesto &lt;span class="kwrd"&gt;AS&lt;/span&gt; ImmagineAltTestoLocaleDefault, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;          NewsLocaleDefault.Titolo &lt;span class="kwrd"&gt;AS&lt;/span&gt; TitoloLocaleDefault, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;          NewsLocaleDefault.Abstract &lt;span class="kwrd"&gt;AS&lt;/span&gt; AbstractLocaleDefault, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;          NewsLocaleDefault.Testo &lt;span class="kwrd"&gt;AS&lt;/span&gt; TestoLocaleDefault, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;          NewsLocale.CultureId &lt;span class="kwrd"&gt;AS&lt;/span&gt; CultureIdLocale, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;          NewsLocale.ImmagineAltTesto &lt;span class="kwrd"&gt;AS&lt;/span&gt; ImmagineAltTestoLocale, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;          NewsLocale.Titolo &lt;span class="kwrd"&gt;AS&lt;/span&gt; TitoloLocale, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;          NewsLocale.Abstract &lt;span class="kwrd"&gt;AS&lt;/span&gt; AbstractLocale, NewsLocale.Testo &lt;span class="kwrd"&gt;AS&lt;/span&gt; TestoLocale&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&lt;span class="kwrd"&gt;FROM&lt;/span&gt;      (&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;   NewsId, Visibile, &lt;span class="kwrd"&gt;Data&lt;/span&gt;, ImmagineUrl, Url&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            &lt;span class="kwrd"&gt;FROM&lt;/span&gt;     News&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;           ) &lt;span class="kwrd"&gt;AS&lt;/span&gt; NewsGenerale &lt;span class="kwrd"&gt;INNER&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;          (&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;   NewsId, CultureId, ImmagineAltTesto, Titolo, Abstract, Testo&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;            &lt;span class="kwrd"&gt;FROM&lt;/span&gt;     NewsLocale &lt;span class="kwrd"&gt;AS&lt;/span&gt; NewsLocale_2&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            &lt;span class="kwrd"&gt;WHERE&lt;/span&gt;     CultureId = @CultureIdDefault&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;           ) &lt;span class="kwrd"&gt;AS&lt;/span&gt; NewsLocaleDefault &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;             &lt;span class="kwrd"&gt;ON&lt;/span&gt; NewsGenerale.NewsId = NewsLocaleDefault.NewsId &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;             &lt;span class="kwrd"&gt;LEFT&lt;/span&gt; &lt;span class="kwrd"&gt;OUTER&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;          (&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;   NewsId, CultureId, ImmagineAltTesto, Titolo, Abstract, Testo&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            &lt;span class="kwrd"&gt;FROM&lt;/span&gt;     NewsLocale &lt;span class="kwrd"&gt;AS&lt;/span&gt; NewsLocale_1&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;            &lt;span class="kwrd"&gt;WHERE&lt;/span&gt;     CultureId = @CultureId&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;           ) &lt;span class="kwrd"&gt;AS&lt;/span&gt; NewsLocale &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;             &lt;span class="kwrd"&gt;ON&lt;/span&gt; NewsGenerale.NewsId = NewsLocale.NewsId&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;









.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;A questo punto può essere utile soprattutto se bisogna avere a che fare con grandi quantità di dati paginare i dati direttamente da SQL Server, la tecnica che verrà usata è la stessa vista nel post precedente, che prevede di contare le righe e poi estrarre le righe a cui siamo effettivamente interessati &lt;em&gt;(vedi codice)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @CultureIdDefault &lt;span class="kwrd"&gt;AS&lt;/span&gt; &lt;span class="kwrd"&gt;INT&lt;/span&gt;;   &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @CultureId        &lt;span class="kwrd"&gt;AS&lt;/span&gt; &lt;span class="kwrd"&gt;INT&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @FirstRecord      &lt;span class="kwrd"&gt;AS&lt;/span&gt; &lt;span class="kwrd"&gt;INT&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @LastRecord       &lt;span class="kwrd"&gt;AS&lt;/span&gt; &lt;span class="kwrd"&gt;INT&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&lt;span class="kwrd"&gt;SET&lt;/span&gt;     @CultureIdDefault = 16;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="kwrd"&gt;SET&lt;/span&gt;     @CultureId          = 9;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&lt;span class="kwrd"&gt;SET&lt;/span&gt;     @FirstRecord      = 1;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&lt;span class="kwrd"&gt;SET&lt;/span&gt;     @LastRecord       = 4;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt;    NewsGenerale.&lt;span class="kwrd"&gt;Data&lt;/span&gt;, NewsGenerale.ImmagineUrl, NewsGenerale.UserId, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;          NewsGenerale.CategoriaNewsId, NewsGenerale.FlagEvento, NewsGenerale.DataDa, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;          NewsGenerale.DataA, NewsGenerale.Url,   &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;          NewsLocaleDefault.ImmagineAltTesto &lt;span class="kwrd"&gt;AS&lt;/span&gt; ImmagineAltTestoLocaleDefault,    &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;          NewsLocaleDefault.Titolo &lt;span class="kwrd"&gt;AS&lt;/span&gt; TitoloLocaleDefault,   &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;          NewsLocaleDefault.Abstract &lt;span class="kwrd"&gt;AS&lt;/span&gt; AbstractLocaleDefault,    &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;          NewsLocaleDefault.Testo &lt;span class="kwrd"&gt;AS&lt;/span&gt; TestoLocaleDefault,   &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;          NewsLocale.CultureId &lt;span class="kwrd"&gt;AS&lt;/span&gt; CultureIdLocale,   &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;          NewsLocale.ImmagineAltTesto &lt;span class="kwrd"&gt;AS&lt;/span&gt; ImmagineAltTestoLocale,   &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;          NewsLocale.Titolo &lt;span class="kwrd"&gt;AS&lt;/span&gt; TitoloLocale,   &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;          NewsLocale.Abstract &lt;span class="kwrd"&gt;AS&lt;/span&gt; AbstractLocale, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;          NewsLocale.Testo &lt;span class="kwrd"&gt;AS&lt;/span&gt; TestoLocale  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;&lt;span class="kwrd"&gt;FROM&lt;/span&gt;      (  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;    Temp.NewsId, Temp.Visibile, Temp.&lt;span class="kwrd"&gt;Data&lt;/span&gt;, Temp.ImmagineUrl, Temp.UserId, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;                      Temp.CategoriaNewsId, Temp.FlagEvento, Temp.DataDa, Temp.DataA, Temp.Url    &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;            &lt;span class="kwrd"&gt;FROM&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;                (&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;   ROW_NUMBER() &lt;span class="kwrd"&gt;OVER&lt;/span&gt; (&lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; &lt;span class="kwrd"&gt;Data&lt;/span&gt; &lt;span class="kwrd"&gt;DESC&lt;/span&gt;) &lt;span class="kwrd"&gt;AS&lt;/span&gt; NumeroRiga,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;                             NewsId, Visibile, &lt;span class="kwrd"&gt;Data&lt;/span&gt;, ImmagineUrl, UserId, CategoriaNewsId, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;                             FlagEvento, DataDa, DataA, Url  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;FROM&lt;/span&gt;     News  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;                ) &lt;span class="kwrd"&gt;AS&lt;/span&gt; Temp&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;            &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; (Temp.NumeroRiga &amp;gt;= @FirstRecord) &lt;span class="kwrd"&gt;AND&lt;/span&gt; (Temp.NumeroRiga &amp;lt;= @LastRecord)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;          ) &lt;span class="kwrd"&gt;AS&lt;/span&gt; NewsGenerale &lt;span class="kwrd"&gt;INNER&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt;  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;          (  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;            &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;   NewsId, CultureId, ImmagineAltTesto, Titolo, Abstract, Testo  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;            &lt;span class="kwrd"&gt;FROM&lt;/span&gt;     NewsLocale &lt;span class="kwrd"&gt;AS&lt;/span&gt; NewsLocale_2  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;            &lt;span class="kwrd"&gt;WHERE&lt;/span&gt;     CultureId = @CultureIdDefault &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;          ) &lt;span class="kwrd"&gt;AS&lt;/span&gt; NewsLocaleDefault &lt;span class="kwrd"&gt;ON&lt;/span&gt; NewsGenerale.NewsId = NewsLocaleDefault.NewsId &lt;span class="kwrd"&gt;LEFT&lt;/span&gt; &lt;span class="kwrd"&gt;OUTER&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt;  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;          (  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;            &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;   NewsId, CultureId, ImmagineAltTesto, Titolo, Abstract, Testo  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;            &lt;span class="kwrd"&gt;FROM&lt;/span&gt;     NewsLocale &lt;span class="kwrd"&gt;AS&lt;/span&gt; NewsLocale_1 &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;            &lt;span class="kwrd"&gt;WHERE&lt;/span&gt;     CultureId = @CultureId &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;           ) &lt;span class="kwrd"&gt;AS&lt;/span&gt; NewsLocale &lt;span class="kwrd"&gt;ON&lt;/span&gt; NewsGenerale.NewsId = NewsLocale.NewsId&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetside.org/aggbug.aspx?PostID=22370" width="1" height="1"&gt;</description><category domain="http://dotnetside.org/blogs/madil/archive/tags/Sql+Server/default.aspx">Sql Server</category><category domain="http://dotnetside.org/blogs/madil/archive/tags/SQL/default.aspx">SQL</category></item><item><title>Paginare i dati con SQL Server</title><link>http://dotnetside.org/blogs/madil/archive/2010/01/02/paginare-i-dati-con-sql-server.aspx</link><pubDate>Sat, 02 Jan 2010 16:31:13 GMT</pubDate><guid isPermaLink="false">2d5e8256-a19a-4586-a65e-031f7ebe8345:22369</guid><dc:creator>MADIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetside.org/blogs/madil/rsscomments.aspx?PostID=22369</wfw:commentRss><comments>http://dotnetside.org/blogs/madil/archive/2010/01/02/paginare-i-dati-con-sql-server.aspx#comments</comments><description>&lt;p&gt;All’interno di un sito Web la paginazione dei dati è una delle operazioni fondamentali. Con una query prendevo tutti i dati dal database e poi provvedevo ad eseguire la paginazione da codice &lt;em&gt;(vedi codice)&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt;     Products.ProductName, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;           Products.QuantityPerUnit, Products.UnitPrice, Categories.CategoryName&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;FROM&lt;/span&gt;       Products &lt;span class="kwrd"&gt;INNER&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;           Categories &lt;span class="kwrd"&gt;ON&lt;/span&gt; Products.CategoryID = Categories.CategoryID&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;




.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Ottenendo i risultati visibili in figura &lt;em&gt;(77 righe)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a title="Query" href="http://www.flickr.com/photos/8919199@N04/4236830291/"&gt;&lt;img style="margin: 0px 10px 0px 0px; display: inline" border="0" alt="Query" src="http://static.flickr.com/2729/4236830291_3d97e23eaf.jpg" width="500" height="351" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questo modo di procedere può andare bene fino a quando si lavora con siti Web di piccole dimensioni, in quanto sono limitati sia i dati da gestire che gli accessi, ma quando si passa a siti Web di medie dimensioni, una query come quella mostrata sopra influisce pesantemente sulle prestazioni. &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;La soluzione consiste nell’estrarre effettivamente i dati che servono, quindi facendoli paginare da SQL Server in questo modo sulla rete non viaggiano dati inutili ed il Web server non deve provvedere a filtrare ulteriormente i dati per eseguire la paginazione correttamente.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;La query che permette a SQL Server di paginare i dati è la seguente:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre&gt;&lt;span class="lnum"&gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @FirstRecord &lt;span class="kwrd"&gt;AS&lt;/span&gt; &lt;span class="kwrd"&gt;INT&lt;/span&gt; = 10;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @LastRecord &lt;span class="kwrd"&gt;AS&lt;/span&gt; &lt;span class="kwrd"&gt;INT&lt;/span&gt; = 30;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; NumeroRiga, ProductName, QuantityPerUnit, UnitPrice, CategoryName&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;FROM&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    (    &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;     ROW_NUMBER() &lt;span class="kwrd"&gt;OVER&lt;/span&gt; (&lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; Products.ProductName &lt;span class="kwrd"&gt;DESC&lt;/span&gt;) &lt;span class="kwrd"&gt;AS&lt;/span&gt; NumeroRiga,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                   Products.ProductName, Products.QuantityPerUnit, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                   Products.UnitPrice, Categories.CategoryName&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="kwrd"&gt;FROM&lt;/span&gt;       Products &lt;span class="kwrd"&gt;INNER&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                   Categories &lt;span class="kwrd"&gt;ON&lt;/span&gt; Products.CategoryID = Categories.CategoryID&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    ) &lt;span class="kwrd"&gt;AS&lt;/span&gt; ProductsCategories&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&lt;span class="kwrd"&gt;WHERE&lt;/span&gt;    (ProductsCategories.NumeroRiga &amp;gt;= @FirstRecord) &lt;span class="kwrd"&gt;AND&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;         (ProductsCategories.NumeroRiga &amp;lt;= @LastRecord)&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;style type="text/css"&gt;




.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Questa query permette di paginare i dati utilizzando la funzione “ROW_NUMBER” che conta le righe selezionate in base ad un specificato, poi questa viene racchiusa da una query più grande che provvede a selezionare le righe interessate secondo i criteri specificati &lt;a href="mailto:&amp;ldquo;@FirstRecord"&gt;“@FirstRecord&lt;/a&gt;” e &lt;a href="mailto:&amp;ldquo;@LastRecord"&gt;“@LastRecord&lt;/a&gt;”, da questa query otteniamo &lt;em&gt;(21 righe)&lt;/em&gt; per dati di dimensione limitata la differenza non si nota ma grandi quantitativi di dati questo modo di procedere aumenta notevolmente le prestazioni &lt;em&gt;(vedi figura)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a title="Query_1" href="http://www.flickr.com/photos/8919199@N04/4237605788/"&gt;&lt;img style="display: inline; margin-left: 0px; margin-right: 0px" border="0" alt="Query_1" src="http://static.flickr.com/4005/4237605788_290082a9b3.jpg" width="500" height="355" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetside.org/aggbug.aspx?PostID=22369" width="1" height="1"&gt;</description><category domain="http://dotnetside.org/blogs/madil/archive/tags/Sql+Server/default.aspx">Sql Server</category><category domain="http://dotnetside.org/blogs/madil/archive/tags/SQL/default.aspx">SQL</category></item><item><title>Upload di file di grandi dimensioni</title><link>http://dotnetside.org/blogs/madil/archive/2009/10/01/upload-di-file-di-grandi-dimensioni.aspx</link><pubDate>Thu, 01 Oct 2009 14:09:37 GMT</pubDate><guid isPermaLink="false">2d5e8256-a19a-4586-a65e-031f7ebe8345:22241</guid><dc:creator>MADIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetside.org/blogs/madil/rsscomments.aspx?PostID=22241</wfw:commentRss><comments>http://dotnetside.org/blogs/madil/archive/2009/10/01/upload-di-file-di-grandi-dimensioni.aspx#comments</comments><description>&lt;p&gt;A volte capita di avere la necessità all’interno di una applicazione Web di permettere all’utente di caricare sul server file anche di notevoli dimensioni.&lt;/p&gt;  &lt;p&gt;Infatti per ASP.NET 2.0 la dimensione massima impostata come default dovrebbe essere intorno ai 4 MB, se si vuole permettere all’utente di caricare documenti di dimensioni maggiori bisogna impostare aggiungere nella sezione “&lt;em&gt;sysstem.web”&lt;/em&gt; presente nel Web.config dell’applicazione la chiave &lt;em&gt;httpRuntime&lt;/em&gt; nella quale si specificano la dimensione massima ed il tempo massimo necessari all’upload &lt;em&gt;(vedi codice)&lt;/em&gt;.&lt;/p&gt;  &lt;pre class="csharpcode"&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.web&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;
          [...]

    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;httpHandlers&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

              [...]

    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;httpHandlers&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;httpRuntime&lt;/span&gt; &lt;span class="attr"&gt;executionTimeout&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;18000&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;maxRequestLength&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;10000&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;httpModules&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

              [...]

    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;httpModules&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

          [...]   

  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;system.web&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetside.org/aggbug.aspx?PostID=22241" width="1" height="1"&gt;</description><category domain="http://dotnetside.org/blogs/madil/archive/tags/Web/default.aspx">Web</category><category domain="http://dotnetside.org/blogs/madil/archive/tags/ASP.NET+2.0/default.aspx">ASP.NET 2.0</category></item><item><title>FileUpload…per [non] dimenticare</title><link>http://dotnetside.org/blogs/madil/archive/2009/10/01/fileupload-per-non-dimenticare.aspx</link><pubDate>Thu, 01 Oct 2009 13:57:24 GMT</pubDate><guid isPermaLink="false">2d5e8256-a19a-4586-a65e-031f7ebe8345:22239</guid><dc:creator>MADIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetside.org/blogs/madil/rsscomments.aspx?PostID=22239</wfw:commentRss><comments>http://dotnetside.org/blogs/madil/archive/2009/10/01/fileupload-per-non-dimenticare.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://msdn.microsoft.com/it-it/library/system.web.ui.webcontrols.fileupload(VS.80).aspx" target="_blank"&gt;FileUpload&lt;/a&gt; è un controllo presente in ASP.NET 2.0 il quale permette di uploadare file sul server, un errore che si può commettere facilmente è quello di inserire un controllo &lt;a href="http://msdn.microsoft.com/it-it/library/system.web.ui.webcontrols.fileupload(VS.80).aspx" target="_blank"&gt;FileUpload&lt;/a&gt; all’interno di un &lt;a href="http://www.asp.net/" target="_blank"&gt;UpdatePanel&lt;/a&gt; in quanto le librerie di &lt;a href="http://www.asp.net/ajax/" target="_blank"&gt;AJAX&lt;/a&gt; non permettono di caricare un file in modo asincrono “&lt;em&gt;cioè senza ricaricare la pagina”&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;Quindi nel caso in cui si vuole implementare questa feature è necessario ricorrere all’utilizzo dei frame.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetside.org/aggbug.aspx?PostID=22239" width="1" height="1"&gt;</description><category domain="http://dotnetside.org/blogs/madil/archive/tags/Web/default.aspx">Web</category><category domain="http://dotnetside.org/blogs/madil/archive/tags/ASP.NET+2.0/default.aspx">ASP.NET 2.0</category></item><item><title>Accesso e gestione dei dati con Linq2SQL e DataGridView</title><link>http://dotnetside.org/blogs/madil/archive/2009/08/07/accesso-e-gestione-dei-dati-con-linq2sql-e-datagridview.aspx</link><pubDate>Fri, 07 Aug 2009 18:27:16 GMT</pubDate><guid isPermaLink="false">2d5e8256-a19a-4586-a65e-031f7ebe8345:22194</guid><dc:creator>MADIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetside.org/blogs/madil/rsscomments.aspx?PostID=22194</wfw:commentRss><comments>http://dotnetside.org/blogs/madil/archive/2009/08/07/accesso-e-gestione-dei-dati-con-linq2sql-e-datagridview.aspx#comments</comments><description>&lt;p&gt;In un gestionale l’utente vuole avere la possibilità di eseguire diverse operazioni &lt;em&gt;(inserimento/modifica/eliminazione) &lt;/em&gt;e, successivamente, annullare o confermare in un unico passo le operazioni fatte. Per questioni di semplicità ho creato un database &lt;em&gt;“Anagrafica”&lt;/em&gt; contenente una sola tabella.&lt;/p&gt;  &lt;p&gt;Di seguito viene mostrato lo script per la creazione della tabella:&lt;/p&gt;  &lt;pre class="sql:nogutter:nocontrols:showcolumns" name="code"&gt;USE [Anagrafica]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Anagrafica](
	[Id] [uniqueidentifier] ROWGUIDCOL  &lt;br /&gt;               NOT NULL CONSTRAINT [DF_Anagrafica_Id]  DEFAULT (newid()),
	[Nome] [nvarchar](max) NOT NULL,
	[Cognome] [nvarchar](max) NOT NULL,
	[Indirizzo] [nvarchar](max) NOT NULL,
	[Citta] [nvarchar](max) NOT NULL,
	[Cap] [nchar](5) NOT NULL,
	[Provincia] [nchar](2) NOT NULL,
 CONSTRAINT [PK_Anagrafica] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)&lt;br /&gt;  WITH (&lt;br /&gt;        PAD_INDEX  = OFF, &lt;br /&gt;        STATISTICS_NORECOMPUTE  = OFF, &lt;br /&gt;        IGNORE_DUP_KEY = OFF, &lt;br /&gt;        ALLOW_ROW_LOCKS  = ON, &lt;br /&gt;        ALLOW_PAGE_LOCKS  = ON&lt;br /&gt;       ) ON [PRIMARY]
) ON [PRIMARY]&lt;/pre&gt;

&lt;p&gt;Il dataLayer del gestionale è stato realizzato &lt;em&gt;Linq2SQL&lt;/em&gt; ed i dati vengono visualizzati utilizzando un dataGridView &lt;em&gt;(vedi foto)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a title="dataGridView" href="http://www.flickr.com/photos/8919199@N04/3797550587/"&gt;&lt;img alt="dataGridView" src="http://static.flickr.com/2487/3797550587_385e66bd35.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Il problema nella gestione dei dati.&lt;/p&gt;

&lt;p&gt;I dati vengono visualizzati nel DataGridView assegnando al suo dataSource un Oggetto&lt;em&gt; Table&amp;lt;Anagrafica&amp;gt; (vedi codice)&lt;/em&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;dcAnagraficaDataContext dc = &lt;span class="kwrd"&gt;new&lt;/span&gt; dcAnagraficaDataContext();
dataGridView1.DataSource = dc.GetTable&amp;lt;Anagrafica&amp;gt;();&lt;/pre&gt;
&lt;style type="text/css"&gt;












.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;em&gt;&lt;/em&gt;

&lt;p&gt;Una volta che sono stati visualizzati i dati l’utente ha la possibilità di modificare i dati visualizzati nel dataGridView, il mio problema a questo punto è capire quali sono le righe del dataGridView che sono state modificate e qual’è il loro stato, il dataContext contiene un metodo &lt;em&gt;“GetChangeSet()”&lt;/em&gt; che restituisce una collection contenente le righe modificate del dataGridView; a questo punto i dati vengono salvati sul database &lt;em&gt;(vedi codice)&lt;/em&gt;&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SaveChanges()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                &lt;span class="rem"&gt;//dcdi tipo dcAnagraficaDataContex &lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                ChangeSet cs = dc.GetChangeSet();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                dc.Connection.Open();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                dc.Transaction = dc.Connection.BeginTransaction();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; cs.Inserts.Count; i++)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                { ((Anagrafica)cs.Inserts).Id = Guid.NewGuid(); }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                dc.SubmitChanges();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                dc.Transaction.Commit();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                dc.Transaction.Rollback();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;                &lt;span class="kwrd"&gt;throw&lt;/span&gt; ex;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            &lt;span class="kwrd"&gt;finally&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (dc.Connection.State == ConnectionState.Open)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;                { dc.Connection.Close(); }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;                dataGridView1.Refresh();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;











.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Nel caso in cui l’utente vuole annullare le modifiche fatte anche in questo caso si lavora con la collection ChangeSet, con la differenza che vengono invertite le operazioni rappresentate dalle liste presenti nella collection &lt;em&gt;(vedi codice)&lt;/em&gt;.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RevertChanges()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                &lt;span class="rem"&gt;//dc di tipo dcAnagraficaDataContext &lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                ChangeSet cs = dc.GetChangeSet();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                dc.Connection.Open();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                dc.Transaction = dc.Connection.BeginTransaction();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; cs.Inserts.Count; i++)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                    var temp = cs.Inserts.GetType();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                    dc.GetTable(temp).DeleteOnSubmit(cs.Inserts);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; cs.Updates.Count; i++)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                    var temp = cs.Updates.GetType();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;                    ModifiedMemberInfo[] modifyInfo = &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dc.GetTable(temp).&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GetModifiedMembers(cs.Updates);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; j = 0; j &amp;lt; modifyInfo.Length; j++)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;                    {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (modifyInfo[j].Member &lt;span class="kwrd"&gt;is&lt;/span&gt; PropertyInfo)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;                            var pi = (PropertyInfo)modifyInfo[j].Member;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;                            pi.SetValue(cs.Updates, &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; modifyInfo[j].OriginalValue, &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;                        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (modifyInfo[j].Member &lt;span class="kwrd"&gt;is&lt;/span&gt; FieldInfo)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;                        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;                            var fi = (FieldInfo)modifyInfo[j].Member;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;                            fi.SetValue(cs.Updates, &lt;br /&gt;                                               modifyInfo[j].OriginalValue);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;                        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;                    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;                }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;                &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; cs.Deletes.Count; i++)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;                {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;                    var temp = cs.Deletes.GetType();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;                    dc.GetTable(temp).InsertOnSubmit(cs.Deletes);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;                }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;                dc.SubmitChanges();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;                dc.Transaction.Commit();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;                dc.Transaction.Rollback();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;                &lt;span class="kwrd"&gt;throw&lt;/span&gt; ex;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;            &lt;span class="kwrd"&gt;finally&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (dc.Connection.State == ConnectionState.Open)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;                { dc.Connection.Close(); }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;                dataGridView1.Refresh();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;











.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Sia la procedura “&lt;em&gt;SaveChanges()” &lt;/em&gt;che la procedura “&lt;em&gt;RevertChanges()”&lt;/em&gt; utilizzano le transazioni. In particolare la procedura “RevertChanges()”&lt;em&gt; &lt;/em&gt;funziona attraverso l’utilizzo della reflection. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetside.org/aggbug.aspx?PostID=22194" width="1" height="1"&gt;</description><category domain="http://dotnetside.org/blogs/madil/archive/tags/Programmazione/default.aspx">Programmazione</category><category domain="http://dotnetside.org/blogs/madil/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://dotnetside.org/blogs/madil/archive/tags/Linq/default.aspx">Linq</category></item><item><title>Genrazione dinamica di un link</title><link>http://dotnetside.org/blogs/madil/archive/2009/07/10/genrazione-dinamica-di-un-link.aspx</link><pubDate>Fri, 10 Jul 2009 04:43:00 GMT</pubDate><guid isPermaLink="false">2d5e8256-a19a-4586-a65e-031f7ebe8345:22164</guid><dc:creator>MADIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetside.org/blogs/madil/rsscomments.aspx?PostID=22164</wfw:commentRss><comments>http://dotnetside.org/blogs/madil/archive/2009/07/10/genrazione-dinamica-di-un-link.aspx#comments</comments><description>&lt;p&gt;Ho avuto qualche problema per visualizzare l&amp;rsquo;indirizzo e-mail e l&amp;rsquo;indirizzo Web all&amp;rsquo;interno di un repeater, i quali dovevano essere entrambi linkabili.&lt;/p&gt;
&lt;p&gt;La prima soluzione a cui ho pensato &amp;egrave; stata quella di utilizzare un &lt;i&gt;asp:hyperlink&lt;/i&gt; dove la propriet&amp;agrave; &lt;i&gt;navigateUrl&lt;/i&gt; veniva impostata con l&amp;rsquo;indirizzo, questa soluzione pu&amp;ograve; andare bene per l&amp;rsquo;indirizzo del Sito Web ma per l&amp;rsquo;e-mail non funziona.&lt;/p&gt;
&lt;p&gt;Quindi ho pensato di scrivere un metodo che riceve in input due parametri &lt;i&gt;l&amp;rsquo;indirizzo&lt;/i&gt; ed &lt;i&gt;il protocollo&lt;/i&gt; e restituisce in output un tag &lt;i&gt;a&lt;/i&gt; con la propriet&amp;agrave; &lt;i&gt;href&lt;/i&gt; impostata secondo i parametri di input.&lt;/p&gt;
&lt;p&gt;Ecco il codice con il repeater che effettua la&amp;nbsp; chiamata:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt; &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585;"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000;"&gt;Repeater&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;ID&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;"repDealer"&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;runat&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;"server"&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;DataSourceID&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;"odsDealer"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;ItemTemplate&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;	     &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;               &lt;br /&gt;	      &lt;span style="background-color: #ffff00; color: black;"&gt;&amp;lt;%&lt;/span&gt;# Eval("Nomer") &lt;span style="background-color: #ffff00; color: black;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;span style="background-color: #ffff00; color: black;"&gt;&amp;lt;%&lt;/span&gt;# Eval("Indirizzo") &lt;span style="background-color: #ffff00; color: black;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;span style="background-color: #ffff00; color: black;"&gt;&amp;lt;%&lt;/span&gt;# Eval("Citta") &lt;span style="background-color: #ffff00; color: black;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;span style="background-color: #ffff00; color: black;"&gt;&amp;lt;%&lt;/span&gt;# Eval("Provincia") &lt;span style="background-color: #ffff00; color: black;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;span style="background-color: #ffff00; color: black;"&gt;&amp;lt;%&lt;/span&gt;# Eval("Cap") &lt;span style="background-color: #ffff00; color: black;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;span style="background-color: #ffff00; color: black;"&gt;&amp;lt;%&lt;/span&gt;# Eval("Telefono") &lt;span style="background-color: #ffff00; color: black;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;span style="background-color: #ffff00; color: black;"&gt;&amp;lt;%&lt;/span&gt;# Eval("Fax") &lt;span style="background-color: #ffff00; color: black;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;      &lt;br /&gt;              &lt;span style="background-color: #ffff00; color: black;"&gt;&amp;lt;%&lt;/span&gt;# GetUrl(Eval("IndirizzoSitoWeb"), "http://", true)&lt;span style="background-color: #ffff00; color: black;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;span style="background-color: #ffff00; color: black;"&gt;&amp;lt;%&lt;/span&gt;# GetUrl(Eval("Email"), "mailto:", false) &lt;span style="background-color: #ffff00; color: black;"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;           &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;ItemTemplate&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585;"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000;"&gt;Repeater&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Ecco il metodo &lt;i&gt;GetUrl&lt;/i&gt; che costruisce il link:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; String GetUrl(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; indirizzo, &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; protocollo, &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; target)&lt;br /&gt;{&lt;br /&gt;   StringBuilder sb = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; StringBuilder(String.Empty);&lt;br /&gt;   sb.Append("&lt;span style="color: #8b0000;"&gt;&amp;lt;a href=\"&lt;/span&gt;");&lt;br /&gt;   sb.Append(protocollo.ToString());&lt;br /&gt;   sb.Append(indirizzo.ToString());&lt;br /&gt;   sb.Append("&lt;span style="color: #8b0000;"&gt;\" &lt;/span&gt;");      &lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; ((&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;)target)&lt;br /&gt;      { sb.Append("&lt;span style="color: #8b0000;"&gt; target=\"_blank\" &lt;/span&gt;"); }&lt;br /&gt;   sb.Append("&lt;span style="color: #8b0000;"&gt;&amp;gt;&lt;/span&gt;");&lt;br /&gt;   sb.Append(indirizzo.ToString());&lt;br /&gt;   sb.Append("&lt;span style="color: #8b0000;"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;");&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; sb.ToString();&lt;br /&gt;}&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetside.org/aggbug.aspx?PostID=22164" width="1" height="1"&gt;</description><category domain="http://dotnetside.org/blogs/madil/archive/tags/Programmazione/default.aspx">Programmazione</category><category domain="http://dotnetside.org/blogs/madil/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Capitalizing a string with C#</title><link>http://dotnetside.org/blogs/madil/archive/2009/07/01/capitalizing-a-string-with-c.aspx</link><pubDate>Wed, 01 Jul 2009 10:25:00 GMT</pubDate><guid isPermaLink="false">2d5e8256-a19a-4586-a65e-031f7ebe8345:22155</guid><dc:creator>MADIL</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetside.org/blogs/madil/rsscomments.aspx?PostID=22155</wfw:commentRss><comments>http://dotnetside.org/blogs/madil/archive/2009/07/01/capitalizing-a-string-with-c.aspx#comments</comments><description>&lt;p&gt;Mi &amp;egrave; capitato di dover trasformare una stringa utilizzando per le lettere iniziali di ciascuna parola il carattere maiuscolo. Nella libreria String di C# non esiste una funzione di questo tipo, facendo una piccola ricerca su &lt;a href="http://www.google.it/" target="_blank"&gt;san google&lt;/a&gt; ho trovato una funzione che faceva al mio caso &lt;i&gt;(vedi codice)&lt;/i&gt;. &lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!IsPostBack)&lt;br /&gt;    {&lt;br /&gt;       Literal1.Text = Regex.Replace(&lt;br /&gt;                                       Literal1.Text, &lt;br /&gt;                                       @"&lt;span style="color: #8b0000;"&gt;\w+&lt;/span&gt;", &lt;br /&gt;                                       &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MatchEvaluator(CapitalizeString)&lt;br /&gt;                                     );&lt;br /&gt;     }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; CapitalizeString(Match matchString)&lt;br /&gt;{&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; strTemp = matchString.ToString();&lt;br /&gt;  strTemp = &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;.ToUpper(strTemp[0]) + strTemp.Substring(1, strTemp.Length - 1).ToLower();&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; strTemp;&lt;br /&gt;}&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetside.org/aggbug.aspx?PostID=22155" width="1" height="1"&gt;</description><category domain="http://dotnetside.org/blogs/madil/archive/tags/Programmazione/default.aspx">Programmazione</category><category domain="http://dotnetside.org/blogs/madil/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Verificare il Mime Type di un file uploadato</title><link>http://dotnetside.org/blogs/madil/archive/2009/06/24/verificare-il-mime-type-di-un-file-uploadato.aspx</link><pubDate>Wed, 24 Jun 2009 00:51:00 GMT</pubDate><guid isPermaLink="false">2d5e8256-a19a-4586-a65e-031f7ebe8345:22147</guid><dc:creator>MADIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetside.org/blogs/madil/rsscomments.aspx?PostID=22147</wfw:commentRss><comments>http://dotnetside.org/blogs/madil/archive/2009/06/24/verificare-il-mime-type-di-un-file-uploadato.aspx#comments</comments><description>&lt;p&gt;Quando si realizza un sito Web capita spesso di aggiungere un controllo che permette all&amp;rsquo;utente di uploadare dei documenti.&lt;/p&gt;
&lt;p&gt;Per caricare un file attraverso il sito Web utilizzo il controllo fileUpload di ASP.NET, ovviamente bisogna effettuare un controllo che verifica se il documento caricato appartiene ad un tipo consentito.&lt;/p&gt;
&lt;p&gt;Innizialmente questo controllo veniva fatto sull&amp;rsquo;estensione del file, in seguito &lt;a target="_blank" href="http://www.dotnetside.org/blogs/lucab" title="Blog di Luca"&gt;Luca&lt;/a&gt; mi ha fatto notare che un controllo del genere poteva essere aggirato facilmente in quanto basta cambiare l&amp;rsquo;estensione di un eseguibile &lt;em&gt;(.exe)&lt;/em&gt; nell&amp;rsquo;estensione di un immagine &lt;em&gt;(.jpg)&lt;/em&gt; ed il file verrebbe caricato senza problemi &lt;img src="http://dotnetside.org/emoticons/emotion-12.gif" alt="Angry" /&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://www.dotnetside.org/blogs/lucab" title="Blog di Luca"&gt;Luca&lt;/a&gt; mi suggeriva di cambiare il controllo sul tipo di file aggiugendo la verifica del mime type oltre alla verifica dell&amp;rsquo;estensione del file. &lt;br /&gt;Il controllo sul mime type pu&amp;ograve; essere effettuato prima di fare l&amp;rsquo;upload del file mentre per verificare l&amp;rsquo;estensione devo prima caricare il file sul server, considerando che l&amp;rsquo;estensione di un file pu&amp;ograve; essere modificata mentre il mime type no penso che sia sufficiente verificare solo il mime type.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Questo &amp;egrave; il codice che verifica se il che effettua l&amp;rsquo;upload di un file e verifica che MIME TYPE del file caricato sia consentito:&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;protected void&lt;/span&gt; LinkButton1_Click(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)
  {
    String path = "&lt;span style="color: #8b0000;"&gt;/Temp/&lt;/span&gt;";
    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (FileUpload1.HasFile)
    {
      &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (VerificaContentType(FileUpload1.PostedFile.ContentType))
      {
        fuDocumento.SaveAs(Server.MapPath(path) + FileUpload1.FileName);
        literal1.Text = String.Empty;
      }
      &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;
      {
        FileUpload1.FileContent.Dispose();
        Literal1.Text = "&lt;span style="color: #8b0000;"&gt;Attenzione: non &amp;egrave; possibile caricare il documento.&lt;/span&gt;";
      }
    }
  }&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; VerificaContentType(String contentType)
{    
  List&amp;lt;tipiConsentiti&amp;gt; tipologie = GetTipologie();
  &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; max = tipologie.Count;
  &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; trovato = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;
  &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; max &amp;amp;&amp;amp; !trovato; i++)
  {
    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (tipologie .ContentType.ToLower() == contentType.ToLower())
    { trovato = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;; }
  }
   &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; trovato;
}&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetside.org/aggbug.aspx?PostID=22147" width="1" height="1"&gt;</description><category domain="http://dotnetside.org/blogs/madil/archive/tags/Programmazione/default.aspx">Programmazione</category><category domain="http://dotnetside.org/blogs/madil/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://dotnetside.org/blogs/madil/archive/tags/ASP.NET+2.0/default.aspx">ASP.NET 2.0</category></item><item><title>Impostazione passwordFormat e recupero password</title><link>http://dotnetside.org/blogs/madil/archive/2009/02/18/impostazione-passwordformat-e-recupero-password.aspx</link><pubDate>Wed, 18 Feb 2009 11:50:26 GMT</pubDate><guid isPermaLink="false">2d5e8256-a19a-4586-a65e-031f7ebe8345:21986</guid><dc:creator>MADIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetside.org/blogs/madil/rsscomments.aspx?PostID=21986</wfw:commentRss><comments>http://dotnetside.org/blogs/madil/archive/2009/02/18/impostazione-passwordformat-e-recupero-password.aspx#comments</comments><description>&lt;p&gt;Con ASP.NET 2.0 nella &lt;strong&gt;MemberShip &lt;/strong&gt;è possibile impostare diverse opzioni per la memorizzazione della password dell&amp;#39;utente e di conseguenza per il ripristino della stessa.&lt;/p&gt; &lt;p&gt;La property che bisogna impostare è &lt;strong&gt;passwordFormat&lt;/strong&gt; per la quale sono previsti i valori:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Clear&lt;/strong&gt;: la password viene memorizzata in chiaro.  &lt;li&gt;&lt;strong&gt;Encrypted&lt;/strong&gt;: la password viene criptata e memorizzata nel database, nel Web.config bisogna inserire la &lt;strong&gt;machineKey&lt;/strong&gt; che viene utilizzato per descriptare la password. A questo &lt;a href="http://www.developmentnow.com/articles/machinekey_generator.aspx" target="_blank"&gt;link&lt;/a&gt; è disponibile &lt;em&gt;(on line) &lt;/em&gt;un tool per la &lt;a href="http://www.developmentnow.com/articles/machinekey_generator.aspx" target="_blank"&gt;generazione automatica del machineKey&lt;/a&gt;.  &lt;li&gt;&lt;strong&gt;Hashed&lt;/strong&gt;: la password viene criptata utilizzando la funzione hash SHA-1 e memorizzata nel database. Questo vuol dire che nel caso in cui l&amp;#39;utente perda la sua password non è possibile recuperarla ,ma ne viene generata una nuova dal sistema. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Una volta impostata la &lt;strong&gt;passwordFormat&lt;/strong&gt; bisogna specificare l&amp;#39;azione da eseguire nel quando viene richiesta la password attraverso le property &lt;em&gt;(booleane)&lt;/em&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;enablePasswordRetrieval&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;enablePasswordReset.&lt;/strong&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetside.org/aggbug.aspx?PostID=21986" width="1" height="1"&gt;</description></item><item><title>Finestra di download: permessi sui files</title><link>http://dotnetside.org/blogs/madil/archive/2009/02/06/finestra-di-download-permessi-sui-files.aspx</link><pubDate>Fri, 06 Feb 2009 09:59:38 GMT</pubDate><guid isPermaLink="false">2d5e8256-a19a-4586-a65e-031f7ebe8345:21967</guid><dc:creator>MADIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetside.org/blogs/madil/rsscomments.aspx?PostID=21967</wfw:commentRss><comments>http://dotnetside.org/blogs/madil/archive/2009/02/06/finestra-di-download-permessi-sui-files.aspx#comments</comments><description>&lt;p&gt;un messaggio Alcune volte capita di voler permettere ai visitatori di un sito Web di scaricarsi dei files bisogna tener conto delle autorizzazioni che bisogna assegnare al file che si vuole scaricare, qualche giorno fa per un progetto dovevo peil download dei files &lt;em&gt;&amp;quot;.pdf&amp;quot;&lt;/em&gt; mentre testavo il sito sul server di sviluppo mi sono scontrato con un problema di autorizzazioni infatti usciva un messaggio che diceva &lt;em&gt;&amp;quot;accesso al file negato&amp;quot; &lt;img alt="smile_angry" src="http://spaces.live.com/rte/emoticons/smile_angry.gif" /&gt;&amp;nbsp;&lt;/em&gt;&lt;em&gt;(vedi foto)&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;&lt;a title="3257871850_525a70c9ea_o" href="http://www.flickr.com/photos/8919199@N04/3257101837/"&gt;&lt;img alt="3257871850_525a70c9ea_o" src="http://static.flickr.com/3077/3257101837_80fe728b86.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.dotnetside.org/blogs/lucab" target="_blank"&gt;Luca&lt;/a&gt; mi aveva suggerito che poteva essere un problema di permessi ed assegnare le autorizzazioni neccessarie all&amp;#39;utente &lt;em&gt;&amp;quot;NETWORK SERVICE&amp;quot; (in italiano SERVIZIO DI RETE)&lt;/em&gt;. Per motivi di sicurezza avevo creato una cartella apposta per i files che i visitatori del sito potevano scaricarsi assegnando i permessi corretti alla cartella &lt;em&gt;(vedi foto)&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;&lt;a title="AutorizzazioniFile" href="http://www.flickr.com/photos/8919199@N04/3257871740/"&gt;&lt;img alt="AutorizzazioniFile" src="http://static.flickr.com/3460/3257871740_cf98baea42.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Quando facevo per effettuare il download del file ottenevo comunque un errore sui permessi legati al file, dopo qualche tentativo mi sono accorto che sui files oltre alle autorizzazioni definite sulla cartella era neccessario definire il permesso di scrittura &lt;em&gt;(vedi foto)&lt;/em&gt;. Gli altri li eredita dalla cartella.&lt;/p&gt; &lt;p&gt;&lt;a title="AutorizzazioniFile3" href="http://www.flickr.com/photos/8919199@N04/3257871928/"&gt;&lt;img alt="AutorizzazioniFile3" src="http://static.flickr.com/3367/3257871928_6642aa5a87.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Tutto funziona correttamente &lt;img alt="smile_teeth" src="http://spaces.live.com/rte/emoticons/smile_teeth.gif" /&gt;&amp;nbsp;&lt;em&gt;(vedi foto)&lt;/em&gt;. &lt;a href="http://support.microsoft.com/kb/260519" target="_blank"&gt;A questo link ci sono info su come visualizzare una finestra di download.&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="AutorizzazioniFile2" href="http://www.flickr.com/photos/8919199@N04/3257042853/"&gt;&lt;img alt="AutorizzazioniFile2" src="http://static.flickr.com/3474/3257042853_4a49147d3c.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetside.org/aggbug.aspx?PostID=21967" width="1" height="1"&gt;</description><category domain="http://dotnetside.org/blogs/madil/archive/tags/Sicurezza/default.aspx">Sicurezza</category><category domain="http://dotnetside.org/blogs/madil/archive/tags/Windows/default.aspx">Windows</category><category domain="http://dotnetside.org/blogs/madil/archive/tags/Web/default.aspx">Web</category></item><item><title>Realizzare un NavigateUrl custom</title><link>http://dotnetside.org/blogs/madil/archive/2009/01/27/realizzare-un-navigateurl-custom.aspx</link><pubDate>Tue, 27 Jan 2009 02:41:00 GMT</pubDate><guid isPermaLink="false">2d5e8256-a19a-4586-a65e-031f7ebe8345:21937</guid><dc:creator>MADIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetside.org/blogs/madil/rsscomments.aspx?PostID=21937</wfw:commentRss><comments>http://dotnetside.org/blogs/madil/archive/2009/01/27/realizzare-un-navigateurl-custom.aspx#comments</comments><description>&lt;p&gt;Quando si lavora alla realizzazione di applicazioni web come nel mio caso capita di dovere realizzare funzionalit&amp;agrave; comuni a tutti i siti web &lt;em&gt;&amp;quot;es. un motore di ricerca interno&amp;quot;&lt;/em&gt; allora in questi casi preferisco esternare funzionalit&amp;agrave; come questa all&amp;#39;interno di un controllo &lt;em&gt;&amp;quot;es. ctrlCerca.ascx&amp;quot;&lt;/em&gt; in questo modo si aumenta la produttivit&amp;agrave; in quanto in ogni progetto non devo fare altro che includere il controllo ed aggiungerlo alla &lt;em&gt;&amp;quot;pagina.aspx&amp;quot;&lt;/em&gt; che mi interessa. &lt;/p&gt;
&lt;p&gt;Per rendere il funzionamento del controllo indipendente dai contesto ho aggiunto una &lt;em&gt;&amp;quot;Property&amp;quot;&lt;/em&gt; public di tipo String come nel codice che segue:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; String SearchResultsPageUrl { get; set; }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;in questo modo quando viene avviata la ricerca con il codice che segue:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; btnCerca_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{ &lt;span class="kwrd"&gt;this&lt;/span&gt;.Response.Redirectl(&lt;span class="kwrd"&gt;this&lt;/span&gt;.SearchResultsPageUrl + &lt;span class="str"&gt;&amp;quot;?q=&amp;quot;&lt;/span&gt; + tbCerca.Text); }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;L&amp;#39;utente viene reinderizzato sulla pagina specificata dal programmatore, in questo modo l&amp;#39;utilizzo del controllo &amp;egrave; indipendente dal contesto.&amp;nbsp; &lt;br /&gt;in questo modo per&amp;ograve; il programmatore non ha la possibilit&amp;agrave; di usufruire dell&amp;#39;aiuto che di solito viene fornito per la propriet&amp;agrave; &lt;em&gt;&amp;quot;NavigateUrl&amp;quot; (vedi foto). &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/8919199@N04/3231376156/" title="CustomNavigateUrl"&gt;&lt;img border="0" src="http://static.flickr.com/3346/3231376156_c2fe0c3297.jpg" alt="CustomNavigateUrl" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Per ottenere il risultato mostrato nella foto basta aggiungere alla &lt;em&gt;&amp;quot;Property&amp;quot;&lt;/em&gt; che ho definito gli attributi che vengono mostrati nel codice che segue:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;[Editor(&amp;quot;&lt;span style="color:#8b0000;"&gt;System.Web.UI.Design.UrlEditor, System.Design, Version=2.0.0.0, Culture=neutral, &lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;span style="color:#8b0000;"&gt;PublicKeyToken=b03f5f7f11d50a3a&lt;/span&gt;&amp;quot;, &lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(UITypeEditor))]
[Bindable(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)]
[DefaultValue(&amp;quot;&lt;span style="color:#8b0000;"&gt;&lt;/span&gt;&amp;quot;)]
[UrlProperty]
&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; String SearchResultsPageUrl { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ottenendo il risultato mostrato nella foto:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/8919199@N04/3231376166/" title="CustomNavigateUrl_1"&gt;&lt;img border="0" src="http://static.flickr.com/3113/3231376166_65d52afc40.jpg" alt="CustomNavigateUrl_1" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetside.org/aggbug.aspx?PostID=21937" width="1" height="1"&gt;</description><category domain="http://dotnetside.org/blogs/madil/archive/tags/Programmazione/default.aspx">Programmazione</category><category domain="http://dotnetside.org/blogs/madil/archive/tags/Web/default.aspx">Web</category><category domain="http://dotnetside.org/blogs/madil/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Finalmente</title><link>http://dotnetside.org/blogs/madil/archive/2008/10/29/finalmente.aspx</link><pubDate>Wed, 29 Oct 2008 06:28:00 GMT</pubDate><guid isPermaLink="false">2d5e8256-a19a-4586-a65e-031f7ebe8345:21791</guid><dc:creator>MADIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetside.org/blogs/madil/rsscomments.aspx?PostID=21791</wfw:commentRss><comments>http://dotnetside.org/blogs/madil/archive/2008/10/29/finalmente.aspx#comments</comments><description>&lt;p&gt;&amp;Egrave; stata annunciata l&amp;#39;uscita di &lt;a target="_blank" href="http://it.wikipedia.org/wiki/Chinese_Democracy"&gt;Chinese Democracy&lt;/a&gt; l&amp;#39;ultimo album dei &lt;a target="_blank" href="http://it.wikipedia.org/wiki/Guns_N%27_Roses"&gt;Guns N&amp;#39; Roses&lt;/a&gt;, anche se della nuvoa formazione non fa parte il mitico &lt;a target="_blank" href="http://it.wikipedia.org/wiki/Slash"&gt;Slash&lt;/a&gt;&amp;nbsp;&lt;img src="http://spaces.live.com/rte/emoticons/smile_sad.gif" alt="smile_sad" /&gt;&amp;nbsp;[:&amp;#39;(]. &lt;/p&gt;
&lt;p&gt;Penso valga comunque la pena provare ad ascoltare questo loro nuovo lavoro. A questo &lt;a target="_blank" href="http://web.gunsnroses.com/splash.jsp"&gt;indirizzo&lt;/a&gt; &amp;egrave; possibile ascoltare il primo singolo dell&amp;#39;album.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetside.org/aggbug.aspx?PostID=21791" width="1" height="1"&gt;</description><category domain="http://dotnetside.org/blogs/madil/archive/tags/Web/default.aspx">Web</category><category domain="http://dotnetside.org/blogs/madil/archive/tags/Other/default.aspx">Other</category></item><item><title>Errore Visual Studio</title><link>http://dotnetside.org/blogs/madil/archive/2008/10/20/errore-visual-studio.aspx</link><pubDate>Mon, 20 Oct 2008 06:01:00 GMT</pubDate><guid isPermaLink="false">2d5e8256-a19a-4586-a65e-031f7ebe8345:21740</guid><dc:creator>MADIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetside.org/blogs/madil/rsscomments.aspx?PostID=21740</wfw:commentRss><comments>http://dotnetside.org/blogs/madil/archive/2008/10/20/errore-visual-studio.aspx#comments</comments><description>&lt;p&gt;&lt;a target="_blank" href="http://www.flickr.com/photos/8919199@N04/2958486990/" title="Errore Visual Studio 2008"&gt;&lt;img border="0" align="right" width="240" src="http://static.flickr.com/3008/2958486990_8f704a606d.jpg" alt="Cattura" height="96" /&gt;&lt;/a&gt; Un paio di giorni fa Visual Studio 2008 mi da un errore quando cercavo di aprire un Sito Web o creare un nuovo Sito Web per me che realizzo applicazioni Web queesto errore era una tragedia&amp;nbsp;[:&amp;#39;(] &lt;em&gt;(vedi figura).&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;Dopo aver provato praticamente tutte le alternative possibili che mi venivano in mente ho provato a fare una piccola ricerca su &lt;a target="_blank" href="http://www.google.it/"&gt;san google&lt;/a&gt; inserendo il messaggio dell&amp;#39;errore fra i vari risultati ho trovato un &lt;a target="_blank" href="http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3880357&amp;amp;SiteID=1"&gt;articolo&lt;/a&gt; sul &lt;a target="_blank" href="http://forums.microsoft.com/MSDN/default.aspx?SiteID=1"&gt;forum di MSDN&lt;/a&gt; dove veniva spiegato come risolvere il problema.&lt;/p&gt;
&lt;p&gt;Praticamente bisogna lanciare da linea di comando &lt;em&gt;(Start-&amp;gt;esegui) &lt;/em&gt;questo comando: &lt;em&gt;&amp;quot;devenv /ResetSkipPkgs&amp;quot;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A questo &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/xee0c8y7(VS.80).aspx"&gt;indirizzo&lt;/a&gt; &amp;egrave; possibille trovare la guida al comando &lt;em&gt;&amp;quot;Devenv&amp;quot;&lt;/em&gt; con tutte le opzioni disponibili, per fortuna adesso Visual Studio funziona alla perfezione. &lt;img src="http://spaces.live.com/rte/emoticons/smile_tongue.gif" alt="smile_tongue" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetside.org/aggbug.aspx?PostID=21740" width="1" height="1"&gt;</description><category domain="http://dotnetside.org/blogs/madil/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item></channel></rss>