<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-8363946540170342205</atom:id><lastBuildDate>Sat, 19 May 2012 06:05:50 +0000</lastBuildDate><category>C#</category><category>asp.net</category><category>IOC</category><category>hosting</category><category>Jquery</category><category>SQL Server 2008</category><category>Linq</category><category>asp.net mvc</category><title>Appunti di programmazione da appassionati sviluppatori</title><description>Un blog dove riportiamo le esperienze quotidiane di programmazione con tecnologie Microsoft, quali: C#,Silverlight,ASP.NET MVC,WCF,Azure,SQL Server</description><link>http://blog.absistemi.it/</link><managingEditor>noreply@blogger.com (Andrea Leo)</managingEditor><generator>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8363946540170342205.post-8878425482545743623</guid><pubDate>Fri, 09 Sep 2011 17:08:00 +0000</pubDate><atom:updated>2011-09-09T19:08:27.400+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>SQL Server 2008</category><title>La paginazione in SQL Server 2008 e con la CTP3 di denali</title><description>Avete mai dovuto paginare i dati con SQL Server 2008 ?&lt;br /&gt;bhè, è un'operazione abbastanza semplice grazie alle funzioni di ranking che il sistema ci mette a disposizione.... Tali funzioni consentono una numerazione arbitraria delle righe reperite dalla selezione e nel nostro caso uso la funzione row_number() over(order by campi da ordinare)&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;use  TempDb&lt;br /&gt;Go&lt;br /&gt;&lt;br /&gt;--Creao una tabella contenente le righe su cui effettuare la paginazione&lt;br /&gt;Create table dbo.Paginata&lt;br /&gt;(&lt;br /&gt; id int identity(0,1),&lt;br /&gt; Nome varchar(15) not null,&lt;br /&gt; Cognome varchar(20) not null&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;ALTER TABLE dbo.Paginata ADD CONSTRAINT&lt;br /&gt; PK_Paginata PRIMARY KEY NONCLUSTERED &lt;br /&gt; (&lt;br /&gt; Nome,&lt;br /&gt; Cognome&lt;br /&gt; ) &lt;br /&gt;&lt;br /&gt;set nocount on&lt;br /&gt;declare @i int = 0&lt;br /&gt;&lt;br /&gt;--inserisco le righe&lt;br /&gt;While @i &lt; 100000&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt; insert into Paginata (Nome,Cognome) &lt;br /&gt;  values('Nome ' + cast(@i as varchar(8)), 'Cognome ' + cast(@i as varchar(8)));&lt;br /&gt; set @i = @i + 1&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--Ricerco la centesima pagina&lt;br /&gt;declare @pagenumber int= 100&lt;br /&gt;&lt;br /&gt;--Ogni pagina mi restituisce 10 righe&lt;br /&gt;declare @pagesize int = 10&lt;br /&gt;&lt;br /&gt;SELECT TOP (@pagesize) * FROM &lt;br /&gt;(&lt;br /&gt; SELECT row_number() over(order by Nome,Cognome) as RowNumber,&lt;br /&gt;  *&lt;br /&gt; FROM  Paginata&lt;br /&gt;)as A&lt;br /&gt;WHERE RowNumber &gt; ((@pagenumber - 1) * @pagesize)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Con la nuova versione SQL Server (ora sto provando la CTP3) il giochino sarà ancora più semplice !!&lt;br /&gt;&lt;pre class="brush: sql"&gt;--Ricerco la centesima pagina&lt;br /&gt;declare @pagenumber int= 100&lt;br /&gt;&lt;br /&gt;--Ogni pagina mi restituisce 10 righe&lt;br /&gt;declare @pagesize int = 10&lt;br /&gt;&lt;br /&gt;Select * from Paginata&lt;br /&gt; order by Nome,Cognome&lt;br /&gt; OFFSET ((@pagenumber - 1) * @pagesize)  ROWS &lt;br /&gt;    FETCH NEXT @pagesize ROWS ONLY; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;La sintassi dell'order by ora prevede le clausole Offset e Fetch next che consentono di implementare la paginazione senza utilizzare funzioni di ranking !!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8363946540170342205-8878425482545743623?l=blog.absistemi.it' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.absistemi.it/2011/09/la-paginazione-in-sql-server-2008-e-con.html</link><author>noreply@blogger.com (Luca Ferrari)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8363946540170342205.post-4616142550892628091</guid><pubDate>Fri, 09 Sep 2011 16:31:00 +0000</pubDate><atom:updated>2011-09-09T18:31:52.060+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>SQL Server 2008</category><title>Cercare una stringa in un database...</title><description>Vi è mai capitato di dover cercare una stringa specifica all'interno del database senza conoscerne la struttura ? A me si e per evitare di farmi migliaia di select a mano ho creato un piccolo script che mi aiuta in modo molto efficace nella ricerca....&lt;br /&gt;Utilizzo le viste information_schema che restituiscono la struttura del Db.&lt;br /&gt;Vediamo come ho fatto :&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;&lt;br /&gt;--non voglio ricevere informazioni sul numero di righe selezionate&lt;br /&gt;Set NoCount On&lt;br /&gt;&lt;br /&gt;--Dichiarazione variabile contenente la stringa da ritrovare&lt;br /&gt;Declare @strToFind varchar(max) = 'Luca'&lt;br /&gt;&lt;br /&gt;--Dichiarazione variabili d'appoggio&lt;br /&gt;Declare @strSchema sysname = ''&lt;br /&gt;Declare @strTab sysname = ''&lt;br /&gt;Declare @StrFieldsList varchar(Max) = ''&lt;br /&gt;Declare @StrWhereFieldsList varchar(Max) = ''&lt;br /&gt;Declare @strSql varchar(max) = ''&lt;br /&gt;&lt;br /&gt;--variabile tabella contenente la le tabelle e i campi testuali&lt;br /&gt;Declare @Tabs table(&lt;br /&gt;      TABLE_SCHEMA sysname&lt;br /&gt;      ,TABLE_NAME sysname&lt;br /&gt;     )&lt;br /&gt;&lt;br /&gt;Insert into @Tabs&lt;br /&gt;Select Distinct TABLE_SCHEMA,TABLE_NAME from INFORMATION_SCHEMA.COLUMNS&lt;br /&gt; Where DATA_TYPE in ('char','nchar','varchar','nvarchar','text','ntext')&lt;br /&gt;  Order by TABLE_SCHEMA,TABLE_NAME&lt;br /&gt;&lt;br /&gt;--Fino a che ci sono righe nella variabile tabella &lt;br /&gt;While 1=1&lt;br /&gt;Begin&lt;br /&gt;&lt;br /&gt; --operazioni preliminari per formattare la select di ricerca&lt;br /&gt; Set @StrFieldsList = ''&lt;br /&gt; Set @StrWhereFieldsList = ''&lt;br /&gt;&lt;br /&gt; Select Top 1 @strSchema = TABLE_SCHEMA, @strTab=TABLE_NAME from @Tabs &lt;br /&gt;  Order by TABLE_SCHEMA,TABLE_NAME;&lt;br /&gt; &lt;br /&gt; --Se la variabile tabella non mi ha restituito la prima riga esco dal ciclo&lt;br /&gt; --perchè ho esaurito le tabelle su cui implementare la ricerca&lt;br /&gt; IF @@ROWCOUNT=0&lt;br /&gt;  Break; &lt;br /&gt; &lt;br /&gt; --Formatto la stringa per ricercare il mio dato&lt;br /&gt; With Fields&lt;br /&gt; AS&lt;br /&gt; (&lt;br /&gt;  Select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS&lt;br /&gt;   Where DATA_TYPE in ('char','nchar','varchar','nvarchar','text','ntext')&lt;br /&gt;    And TABLE_SCHEMA = @strSchema&lt;br /&gt;    And TABLE_NAME = @strTab &lt;br /&gt; )&lt;br /&gt; Select @StrFieldsList = @StrFieldsList + '' + QUOTENAME(COLUMN_NAME) + ' AS ' + QUOTENAME(COLUMN_NAME) + ',',&lt;br /&gt;   @StrWhereFieldsList = @StrWhereFieldsList + QUOTENAME(COLUMN_NAME) + ' Like ''%' + @strToFind + '%'' OR '&lt;br /&gt;  From Fields&lt;br /&gt;&lt;br /&gt; Set @strSql = 'Select ''' + QUOTENAME(@strSchema) + ''' As Table_Schema,''' + QUOTENAME(@strTab) + ''' As Table_Name, ' + Substring(@StrFieldsList,0,LEN(@StrFieldsList))&lt;br /&gt;     + ' from ' + QUOTENAME(@strSchema) + '.' + QUOTENAME(@strTab)&lt;br /&gt;     + ' Where ' + Substring(@StrWhereFieldsList,0,LEN(@StrWhereFieldsList)-2)&lt;br /&gt;&lt;br /&gt; --eseguo il comando di ricerca appena generato&lt;br /&gt; Exec(@strSql)&lt;br /&gt; &lt;br /&gt; -- elimino la riga relativa alla tabella appena elaborata&lt;br /&gt; -- dalla tabella temporanea&lt;br /&gt; Delete From @Tabs&lt;br /&gt;   Where TABLE_SCHEMA = @strSchema&lt;br /&gt;    And TABLE_NAME = @strTab &lt;br /&gt; &lt;br /&gt;end &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8363946540170342205-4616142550892628091?l=blog.absistemi.it' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.absistemi.it/2011/09/cercare-una-stringa-in-un-database.html</link><author>noreply@blogger.com (Luca Ferrari)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8363946540170342205.post-4211133229814595015</guid><pubDate>Thu, 01 Sep 2011 12:55:00 +0000</pubDate><atom:updated>2011-09-01T14:58:35.538+02:00</atom:updated><title>Compare two collections with Linq and method Except</title><description>Suppose to have two collections of objects and you want to get the objects of the first collection that are not included in the second collection, you can use Linq with the method "Except".&lt;br /&gt;&lt;br /&gt;Let's show a simple example:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;            double[] numbers1 = { 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 };&lt;br /&gt;            double[] numbers2 = { 2.2 };&lt;br /&gt;&lt;br /&gt;            IEnumerable&lt;double&gt; onlyInFirstSet = numbers1.Except(numbers2);&lt;br /&gt;&lt;/double&gt;&lt;/pre&gt;Now onlyInFirstSet will contains only numbers that are not present in the secondo collection.&lt;br /&gt;&lt;br /&gt; You can get the inverse calling the method Expect on the collection numbers2 and  passing the parameter numbers1.&lt;br /&gt;&lt;br /&gt;  Remember that If you want to compare sequences of objects of some custom data type, you need to implement che interface IEquatable&amp;lt;T&amp;gt; where T is your object.&lt;br /&gt;&lt;br /&gt;This interface require to implement the methods Equals and GetHashCode.&lt;br /&gt;In the  method Equals you define the logic that let the program to know when two object are equals.&lt;br /&gt;&lt;br /&gt; In the method GetHashCode you implement the hash code: it is a numerical value that is tied to a fixed input and it is a form of one-way encryption, let you uniquely identifying an object. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8363946540170342205-4211133229814595015?l=blog.absistemi.it' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.absistemi.it/2011/09/compare-two-collections-with-linq-and.html</link><author>noreply@blogger.com (Andrea Leo)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8363946540170342205.post-3308158321460715064</guid><pubDate>Fri, 22 Jul 2011 10:09:00 +0000</pubDate><atom:updated>2011-07-22T12:12:30.707+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>asp.net</category><category domain='http://www.blogger.com/atom/ns#'>C#</category><title>Convertire un oggetto in istruzione SQL di Insert/update</title><description>Nello scorso articolo abbiamo visto come convertire un DataTable in una collezione di oggetti tipizzata:&lt;br /&gt;&lt;a href="http://blog.absistemi.it/2011/07/convertire-un-datatable-in-una.html"&gt;Convertire un datatable in oggetti&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Questa volta vediamo invece come convertire una collezione di oggetti in istruzioni di insert / update SQL.&lt;br /&gt;&lt;br /&gt;Ribadiamo il concetto che esistono degli ORM quali NHibernate,Entity Framework che fanno già queste operazioni in modo eccellente, questo post vuole dare una soluzione semplice per quei progetti dove non è necessario (proprio per il fatto che non sono progetti complessi) oppure per progetti legacy di salvare degli oggetti tramite ADO.Net.&lt;br /&gt;&lt;br /&gt;Diamo x scontato queste convenzioni:&lt;br /&gt;- l'oggetto/tabella prevede in campo Id come chiave primaria &lt;br /&gt;- le proprietà che vorremo mappare saranno di tipo &lt;b&gt;Virtual&lt;/b&gt;, tutte le altre verranno ignorate&lt;br /&gt;- il metodo eseguirà una insert (se id=0) o una update (se id!=0)&lt;br /&gt;- il metodo accetta in input una IList&lt;sqlparameter&gt; che verrà valorizzato e vi servirà poi per eseguire il comando SQl&lt;br /&gt;- il metodo ritorna la query sql che vi servirà poi per eseguire il comando di insert/update&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;using System;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Data.SqlClient;&lt;br /&gt;using System.Reflection;&lt;br /&gt;using MpsManager.Controllers.Helper;&lt;br /&gt;&lt;br /&gt;namespace MpsManager.Models&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    public static class MapDataAndBusinessEntityHelper&lt;br /&gt;    {&lt;br /&gt;      &lt;br /&gt;&lt;br /&gt;        public static T SaveOrUpdateBusinessEntityToSqlData&lt;T&gt;(T entity, string tableName,bool isUpdate) where T : new()&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            var hashtable = new Dictionary&lt;object,object&gt;();&lt;br /&gt;            PropertyInfo[] properties = typeof(T).GetProperties();&lt;br /&gt;&lt;br /&gt;               &lt;br /&gt;            foreach (PropertyInfo info in properties)&lt;br /&gt;            {&lt;br /&gt;&lt;br /&gt;                if (info.GetGetMethod().IsVirtual || (isUpdate &amp;&amp; info.Name=="Id"))&lt;br /&gt;                {&lt;br /&gt;                    &lt;br /&gt;                    hashtable[info.Name.ToUpper()] = info;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            IList&lt;SqlParameter&gt; list = new List&lt;SqlParameter&gt;();&lt;br /&gt;&lt;br /&gt;            SQLADOHelper.ExecuteScalarQueryCommand(isUpdate ? UpdateObject(hashtable, entity, tableName, list) : InsertObject(hashtable, entity, tableName, list), list);&lt;br /&gt;&lt;br /&gt;            return entity;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static string UpdateObject(Dictionary&lt;object, object&gt; hashtable, object entity, string tableName, IList&lt;SqlParameter&gt; list)&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            var isFirst = true;&lt;br /&gt;&lt;br /&gt;            var sql = "update " + tableName + " SET ";&lt;br /&gt;            foreach (var item in hashtable)&lt;br /&gt;            {&lt;br /&gt;                list.Add(new SqlParameter("@" + item.Key, ((PropertyInfo)item.Value).GetValue(entity, null) ?? DBNull.Value));&lt;br /&gt;&lt;br /&gt;                if (item.Key.ToString().ToUpper() != "ID")&lt;br /&gt;                {&lt;br /&gt;                    sql += (isFirst ? "" : ",") + "[" + item.Key + "]=" + "@" + item.Key;&lt;br /&gt;                    isFirst = false;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            sql += " where Id =@ID";&lt;br /&gt;&lt;br /&gt;            return sql;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        private static string InsertObject(Dictionary&lt;object, object&gt; hashtable, object entity, string tableName,IList&lt;SqlParameter&gt; list )&lt;br /&gt;        {&lt;br /&gt;            var isFirst = true;&lt;br /&gt;&lt;br /&gt;            var sql = "insert into " + tableName + " (";&lt;br /&gt;            foreach (var item in hashtable)&lt;br /&gt;            {&lt;br /&gt;                sql += (isFirst ? "" : ",") + "[" + item.Key + "]";&lt;br /&gt;                isFirst = false;&lt;br /&gt;            }&lt;br /&gt;            sql += ") values (";&lt;br /&gt;&lt;br /&gt;            isFirst = true;&lt;br /&gt;            foreach (var item in hashtable)&lt;br /&gt;            {&lt;br /&gt;                list.Add(new SqlParameter("@" + item.Key, ((PropertyInfo)item.Value).GetValue(entity, null) ?? DBNull.Value));&lt;br /&gt;&lt;br /&gt;                sql += (isFirst ? "" : ",") + "@" + item.Key;&lt;br /&gt;                isFirst = false;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            sql += ")";&lt;br /&gt;            return sql;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Questo invece è l'helper per poter effettuare operazioni Ado.net  &lt;pre class="brush: csharp"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Configuration;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Data.SqlClient;&lt;br /&gt;&lt;br /&gt;namespace MpsManager.Controllers.Helper&lt;br /&gt;{&lt;br /&gt;    public class SQLADOHelper&lt;br /&gt;    {&lt;br /&gt;        public static string ConnectionString&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                return ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static object ExecuteScalarQueryCommand(string sql)&lt;br /&gt;        {&lt;br /&gt;            return ExecuteScalarQueryCommand(sql, new List&lt;sqlparameter&gt;());&lt;br /&gt;        }&lt;br /&gt;        public static void ExecuteNonQueryCommand(string sql)&lt;br /&gt;        {&lt;br /&gt;            using (IDbConnection connection = new SqlConnection(ConnectionString))&lt;br /&gt;            {&lt;br /&gt;                connection.Open();&lt;br /&gt;                using (IDbCommand cmd = connection.CreateCommand())&lt;br /&gt;                {&lt;br /&gt;                    cmd.CommandText = sql;&lt;br /&gt;                    cmd.ExecuteNonQuery();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        public static DataTable ExecuteQueryCommand(string sql)&lt;br /&gt;        {&lt;br /&gt;            return ExecuteQueryCommand(sql, new List&lt;sqlparameter&gt;());&lt;br /&gt;        }&lt;br /&gt;        public static DataTable ExecuteQueryCommand(string sql, IList&lt;sqlparameter&gt; list)&lt;br /&gt;        {&lt;br /&gt;            var dt = new DataTable();&lt;br /&gt;            using (var connection = new SqlConnection(ConnectionString))&lt;br /&gt;            {&lt;br /&gt;&lt;br /&gt;                var cmd = new SqlCommand(sql, connection);&lt;br /&gt;                foreach (var sqlParameter in list)&lt;br /&gt;                {&lt;br /&gt;                    cmd.Parameters.Add(sqlParameter);&lt;br /&gt;                }&lt;br /&gt;                connection.Open();&lt;br /&gt;&lt;br /&gt;                SqlDataReader dr = cmd.ExecuteReader();&lt;br /&gt;&lt;br /&gt;                dt.Load(dr);&lt;br /&gt;&lt;br /&gt;                connection.Close();&lt;br /&gt;            }&lt;br /&gt;            return dt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static object ExecuteScalarQueryCommand(string sql, IList&lt;sqlparameter&gt; list)&lt;br /&gt;        {&lt;br /&gt;            using (IDbConnection connection = new SqlConnection(ConnectionString))&lt;br /&gt;            {&lt;br /&gt;                connection.Open();&lt;br /&gt;&lt;br /&gt;                using (IDbCommand cmd = connection.CreateCommand())&lt;br /&gt;                {&lt;br /&gt;                    cmd.CommandText = sql;&lt;br /&gt;                    foreach (var sqlParameter in list)&lt;br /&gt;                    {&lt;br /&gt;                        cmd.Parameters.Add(sqlParameter);    &lt;br /&gt;                    }&lt;br /&gt;                    try&lt;br /&gt;                    {&lt;br /&gt;                        object result = cmd.ExecuteScalar();&lt;br /&gt;                        return result;&lt;br /&gt;                    }&lt;br /&gt;                    catch (Exception e)&lt;br /&gt;                    {&lt;br /&gt;                        throw new ApplicationException("ExecuteScalarQueryCommand", e);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8363946540170342205-3308158321460715064?l=blog.absistemi.it' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.absistemi.it/2011/07/convertire-un-oggetto-in-istruzione-sql.html</link><author>noreply@blogger.com (Andrea Leo)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8363946540170342205.post-5881335442564635450</guid><pubDate>Fri, 22 Jul 2011 09:58:00 +0000</pubDate><atom:updated>2011-07-22T11:59:47.942+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>asp.net</category><category domain='http://www.blogger.com/atom/ns#'>C#</category><title>Convertire un DataTable in una collezione di  oggetti tipizzata</title><description>Premesso che attualmente si è soliti utilizzare un ORM (Object Relational Mapper) per mappare gli oggetti alle tabelle SQL, alcune volte può capitare di avere applicazioni vecchie o con codice legacy e nelle quali viene utilizzato Ado.Net per effettuare le query verso il database.&lt;br /&gt;&lt;br /&gt;La parte più onerosa si verifica quando effettuaiamo una query e ci viene restituito il risultato in un DataTable oppure un DataReader: bisogna instanziare una collezione di oggetti e valorizzarne le proprietà (una ad una).&lt;br /&gt;&lt;br /&gt;Per ovviare a questo problema possiamo utilizzare una classe di helper; diamo per scontato che i campi del database si chiamano nello stesso modo delle proprietà&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ecco la clase di helper, è sufficiente chiamare il metodo passando a parametro il DataTable e ci verrà restituita una collezione di oggetti&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;using System;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Data.SqlClient;&lt;br /&gt;using System.Reflection;&lt;br /&gt;using MpsManager.Controllers.Helper;&lt;br /&gt;&lt;br /&gt;namespace MpsManager.Models&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    public static class MapDataAndBusinessEntityHelper&lt;br /&gt;    {&lt;br /&gt;        public static List&lt;t&gt; MapDataToBusinessEntityCollection&lt;t&gt;(DataTable dr)&lt;br /&gt;        where T : new()&lt;br /&gt;        {&lt;br /&gt;            Type businessEntityType = typeof(T);&lt;br /&gt;&lt;br /&gt;            var entitys = new List&lt;t&gt;();&lt;br /&gt;&lt;br /&gt;            var hashtable = new Hashtable();&lt;br /&gt;&lt;br /&gt;            PropertyInfo[] properties = businessEntityType.GetProperties();&lt;br /&gt;&lt;br /&gt;            foreach (PropertyInfo info in properties)&lt;br /&gt;            {&lt;br /&gt;&lt;br /&gt;                hashtable[info.Name.ToUpper()] = info;&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            foreach (DataRow dataRow in dr.Rows)&lt;br /&gt;            {&lt;br /&gt;                T newObject = new T();&lt;br /&gt;&lt;br /&gt;                for (int index = 0; index &lt; dr.Columns.Count; index++)&lt;br /&gt;                {&lt;br /&gt;&lt;br /&gt;                    var info = (PropertyInfo)hashtable[dr.Columns[index].ColumnName.ToUpper()];&lt;br /&gt;&lt;br /&gt;                    if ((info != null) &amp;&amp; info.CanWrite)&lt;br /&gt;                    {&lt;br /&gt;&lt;br /&gt;                        info.SetValue(newObject, dataRow[info.Name] is DBNull ? null : dataRow[info.Name], null);&lt;br /&gt;&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                entitys.Add(newObject);&lt;br /&gt;            }&lt;br /&gt;            return entitys;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8363946540170342205-5881335442564635450?l=blog.absistemi.it' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.absistemi.it/2011/07/convertire-un-datatable-in-una.html</link><author>noreply@blogger.com (Andrea Leo)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8363946540170342205.post-101761033890564056</guid><pubDate>Wed, 20 Jul 2011 08:29:00 +0000</pubDate><atom:updated>2011-07-20T10:39:03.847+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Jquery</category><title>Applicare degli stili alle tabelle HTML con Jquery UI</title><description>Generalmente le tabelle html di default non si presentano belle esteticamente e quindi si è soliti applicare degli stili  CSS (Cascading Style Sheets) per renderle gradevoli.&lt;br /&gt;&lt;br /&gt;Se non abbiamo molto tempo per effettuare delle prove per capire come potrebbero presentarsi meglio le nostre tabelle, possiamo fare affidamento ai CSS che ci vengono forniti di default con JQuery UI.&lt;br /&gt;&lt;br /&gt;Una volta applicate le classi standard, la tabella assumerà un aspetto differente a secondo del tema di cui abbiamo fatto il download.&lt;br /&gt;&lt;br /&gt;Ecco un esempio di tabella con le classi assegnate:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;table class="ui-widget ui-widget-content width_70" id="functions"&gt;&lt;thead class="ui-widget-header"&gt;&lt;br /&gt;&lt;tr&gt;&lt;th colspan="2"&gt;Pannello di controllo&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/thead&gt;         &lt;tbody&gt;&lt;br /&gt;&lt;tr class="ui-state-default"&gt;             &lt;td&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="float_left"&gt;&lt;img src="../../Content/Images/users1_48.png" alt="" /&gt;&lt;/div&gt;&lt;div class="float_left"&gt;&lt;a href=""&gt;Amministrazione&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;             &lt;td&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="float_left"&gt;&lt;img src="../../Content/Images/users1_48.png" alt="" /&gt;&lt;/div&gt;&lt;div class="float_left"&gt;&lt;a href=""&gt;Amministrazione&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;          &lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;             &lt;td&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="float_left"&gt;&lt;img src="../../Content/Images/users1_48.png" alt="" /&gt;&lt;/div&gt;&lt;div class="float_left"&gt;&lt;a href=""&gt;Amministrazione&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;             &lt;td&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="float_left"&gt;&lt;img src="../../Content/Images/users1_48.png" alt="" /&gt;&lt;/div&gt;&lt;div class="float_left"&gt;&lt;a href=""&gt;Amministrazione&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;          &lt;/tr&gt;&lt;br /&gt;&lt;tr class="ui-state-default"&gt;             &lt;td&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="float_left"&gt;&lt;img src="../../Content/Images/users1_48.png" alt="" /&gt;&lt;/div&gt;&lt;div class="float_left"&gt;&lt;a href=""&gt;Amministrazione&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;             &lt;td&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="float_left"&gt;&lt;img src="../../Content/Images/users1_48.png" alt="" /&gt;&lt;/div&gt;&lt;div class="float_left"&gt;&lt;a href=""&gt;Amministrazione&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;          &lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;     &lt;/table&gt;&lt;/pre&gt;&lt;br /&gt;Ed ecco il risultato:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-c0Pw4llpjZs/TiaR0BPBOiI/AAAAAAAAAcs/DbVeNacXAMM/s1600/Capture.PNG" imageanchor="1" style=""&gt;&lt;img border="0" height="130" width="320" src="http://2.bp.blogspot.com/-c0Pw4llpjZs/TiaR0BPBOiI/AAAAAAAAAcs/DbVeNacXAMM/s320/Capture.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Ora proviamo a cambiare il tema Jquery UI e senza modificare nulla avremo:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-XXM_N2xOOdU/TiaUI24HYwI/AAAAAAAAAc8/kFLBzAzgfAc/s1600/Capture.PNG" imageanchor="1" style=""&gt;&lt;img border="0" height="106" width="320" src="http://3.bp.blogspot.com/-XXM_N2xOOdU/TiaUI24HYwI/AAAAAAAAAc8/kFLBzAzgfAc/s320/Capture.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8363946540170342205-101761033890564056?l=blog.absistemi.it' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.absistemi.it/2011/07/applicare-uno-stile-alle-tabelle-con.html</link><author>noreply@blogger.com (Andrea Leo)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-c0Pw4llpjZs/TiaR0BPBOiI/AAAAAAAAAcs/DbVeNacXAMM/s72-c/Capture.PNG' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8363946540170342205.post-6064925954271400272</guid><pubDate>Tue, 19 Jul 2011 14:41:00 +0000</pubDate><atom:updated>2011-07-19T16:49:27.460+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>asp.net</category><category domain='http://www.blogger.com/atom/ns#'>asp.net mvc</category><title>Form Authentication - utilizzare un custom provider sql</title><description>Utilizzando la form authentication in asp.net è possibile sfruttare il provider AspNetSqlProfileProvider per gestire gli accessi al sito,creare un nuovo utente, modificare la password e molto altro, senza la necessità di scrivere righe di codice.&lt;br /&gt;&lt;br /&gt;Tramite questo provider però è necessario creare un database ad hoc utilizzando il comando &lt;b&gt;Aspnet_regsql&lt;/b&gt; nel quale in automatico verranno create le tabelle,store procedure e tutto quanto è indispensabile per fare funzionare correttamente l'autenticazione.&lt;br /&gt;&lt;br /&gt;Supponiamo invece di volere utilizzare una tabella utenti presente nel nostro database, creeremo quindi un provider personalizzato secondo le nostre esigenze.&lt;br /&gt;&lt;br /&gt;Nel caso specifico abbiamo utilizzato ADO.NET per effettuare le query sul db, questo perchè la nostra esigenza era quella di realizzare un piccolo programma, ovviamente potete decidere di utilizzare un ORM come Entity Framework, NHibernate e così via...&lt;br /&gt;&lt;br /&gt;I passi da fare sono:&lt;br /&gt;&lt;br /&gt;- Creazione tabella utenti&lt;br /&gt;&lt;pre class="brush: sql"&gt;CREATE TABLE [Users] (    &lt;br /&gt;   [username] [varchar] (15) NOT NULL ,&lt;br /&gt;   [password] [varchar] (25) NOT NULL ,&lt;br /&gt;   [userRole] [tinyint]  NOT NULL , &lt;br /&gt;) ON [PRIMARY]&lt;br /&gt;GO &lt;br /&gt;ALTER TABLE [dbo].[Users] WITH NOCHECK ADD&lt;br /&gt;   CONSTRAINT [PK_Users] PRIMARY KEY  NONCLUSTERED     &lt;br /&gt;   (       &lt;br /&gt;      [username]    &lt;br /&gt;   )  ON [PRIMARY]  &lt;br /&gt;GO  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- Creazione di un provider&lt;br /&gt;Il provider è una classe che deriva da &lt;b&gt;MembershipProvider&lt;/b&gt; e nella quale andremo ad implementare i metodi che ci interessano per la validazione&lt;br /&gt;&lt;br /&gt;Nell'esempio abbiamo implementato solo il metodo ValidateUser che permette di effettuare il login al sito.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;using System.Collections;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Data.SqlClient;&lt;br /&gt;using System.Web.Security;&lt;br /&gt;&lt;br /&gt;namespace MpsManager.Controllers.Helper&lt;br /&gt;{&lt;br /&gt;    public class CustomSqlValidatorProvider : MembershipProvider&lt;br /&gt;    {&lt;br /&gt;        public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)&lt;br /&gt;        {&lt;br /&gt;            throw new System.NotImplementedException();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)&lt;br /&gt;        {&lt;br /&gt;            throw new System.NotImplementedException();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override string GetPassword(string username, string answer)&lt;br /&gt;        {&lt;br /&gt;            throw new System.NotImplementedException();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override bool ChangePassword(string username, string oldPassword, string newPassword)&lt;br /&gt;        {&lt;br /&gt;            throw new System.NotImplementedException();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override string ResetPassword(string username, string answer)&lt;br /&gt;        {&lt;br /&gt;            throw new System.NotImplementedException();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override void UpdateUser(MembershipUser user)&lt;br /&gt;        {&lt;br /&gt;            throw new System.NotImplementedException();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override bool ValidateUser(string username, string password)&lt;br /&gt;        {&lt;br /&gt;            IList&lt;sqlparameter&gt; list = new List&lt;sqlparameter&gt;();&lt;br /&gt;            list.Add(new SqlParameter("UserName",username));&lt;br /&gt;            list.Add(new SqlParameter("Password", password));&lt;br /&gt;            var status =  SQLADOHelper.ExecuteScalarQueryCommand("Select 1 from Users where userName=@UserName and password=@password",list);&lt;br /&gt;            return status != null;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override bool UnlockUser(string userName)&lt;br /&gt;        {&lt;br /&gt;            throw new System.NotImplementedException();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)&lt;br /&gt;        {&lt;br /&gt;            throw new System.NotImplementedException();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override MembershipUser GetUser(string username, bool userIsOnline)&lt;br /&gt;        {&lt;br /&gt;            throw new System.NotImplementedException();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override string GetUserNameByEmail(string email)&lt;br /&gt;        {&lt;br /&gt;            throw new System.NotImplementedException();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override bool DeleteUser(string username, bool deleteAllRelatedData)&lt;br /&gt;        {&lt;br /&gt;            throw new System.NotImplementedException();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)&lt;br /&gt;        {&lt;br /&gt;            throw new System.NotImplementedException();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override int GetNumberOfUsersOnline()&lt;br /&gt;        {&lt;br /&gt;            throw new System.NotImplementedException();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)&lt;br /&gt;        {&lt;br /&gt;            throw new System.NotImplementedException();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)&lt;br /&gt;        {&lt;br /&gt;            throw new System.NotImplementedException();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override bool EnablePasswordRetrieval&lt;br /&gt;        {&lt;br /&gt;            get { throw new System.NotImplementedException(); }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override bool EnablePasswordReset&lt;br /&gt;        {&lt;br /&gt;            get { throw new System.NotImplementedException(); }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override bool RequiresQuestionAndAnswer&lt;br /&gt;        {&lt;br /&gt;            get { throw new System.NotImplementedException(); }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override string ApplicationName&lt;br /&gt;        {&lt;br /&gt;            get { throw new System.NotImplementedException(); }&lt;br /&gt;            set { throw new System.NotImplementedException(); }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override int MaxInvalidPasswordAttempts&lt;br /&gt;        {&lt;br /&gt;            get { throw new System.NotImplementedException(); }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override int PasswordAttemptWindow&lt;br /&gt;        {&lt;br /&gt;            get { throw new System.NotImplementedException(); }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override bool RequiresUniqueEmail&lt;br /&gt;        {&lt;br /&gt;            get { throw new System.NotImplementedException(); }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override MembershipPasswordFormat PasswordFormat&lt;br /&gt;        {&lt;br /&gt;            get { throw new System.NotImplementedException(); }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override int MinRequiredPasswordLength&lt;br /&gt;        {&lt;br /&gt;            get { throw new System.NotImplementedException(); }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override int MinRequiredNonAlphanumericCharacters&lt;br /&gt;        {&lt;br /&gt;            get { throw new System.NotImplementedException(); }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override string PasswordStrengthRegularExpression&lt;br /&gt;        {&lt;br /&gt;            get { throw new System.NotImplementedException(); }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- modifichiamo il file web.config per aggiungere il nostro provider e attivare l'autenticazione specificando quale sarà la pagina che si occuperà del login.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;authentication mode="Forms"&gt;&lt;br /&gt;      &lt;forms loginUrl="~/Account/LogOn" timeout="2880" /&gt;&lt;br /&gt;    &lt;/authentication&gt;&lt;br /&gt;&lt;br /&gt;    &lt;membership defaultProvider="CustomSqlValidatorProvider"&gt;&lt;br /&gt;      &lt;providers&gt;&lt;br /&gt;        &lt;clear/&gt;&lt;br /&gt;        &lt;add name="CustomSqlValidatorProvider" type="MpsManager.Controllers.Helper.CustomSqlValidatorProvider" connectionStringName="ApplicationServices"&lt;br /&gt;             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"&lt;br /&gt;             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"&lt;br /&gt;             applicationName="/" /&gt;&lt;br /&gt;      &lt;/providers&gt;&lt;br /&gt;    &lt;/membership&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- Creiamo la view con i nostri campi di accesso (se utilizzate asp.net MVC la View ed il controller conterranno il codice che ci serve)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;View&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;    &lt;h2&gt;Accesso al sistema&lt;/h2&gt;   &lt;br /&gt;&lt;br /&gt;    &lt;% using (Html.BeginForm()) { %&gt;&lt;br /&gt;        &lt;%: Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.") %&gt;&lt;br /&gt;        &lt;div&gt;            &lt;fieldset class="ui-widget-content ui-corner-all"&gt;                &lt;legend&gt;Informazioni account&lt;/legend&gt;&lt;br /&gt;                &lt;br /&gt;                &lt;div class="editor-label"&gt;                    &lt;%: Html.LabelFor(m =&gt; m.UserName) %&gt;&lt;br /&gt;                &lt;/div&gt;                &lt;div class="editor-field"&gt;                    &lt;%: Html.TextBoxFor(m =&gt; m.UserName) %&gt;&lt;br /&gt;                    &lt;%: Html.ValidationMessageFor(m =&gt; m.UserName) %&gt;&lt;br /&gt;                &lt;/div&gt;                &lt;br /&gt;                &lt;div class="editor-label"&gt;                    &lt;%: Html.LabelFor(m =&gt; m.Password) %&gt;&lt;br /&gt;                &lt;/div&gt;                &lt;div class="editor-field"&gt;                    &lt;%: Html.PasswordFor(m =&gt; m.Password) %&gt;&lt;br /&gt;                    &lt;%: Html.ValidationMessageFor(m =&gt; m.Password) %&gt;&lt;br /&gt;                &lt;/div&gt;                &lt;br /&gt;                &lt;p&gt;                    &lt;input type="submit" value="Accedi" /&gt;&lt;br /&gt;                &lt;/p&gt;            &lt;/fieldset&gt;        &lt;/div&gt;    &lt;% } %&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Controller&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt; [HttpPost]&lt;br /&gt;        public ActionResult LogOn(LogOnModel model, string returnUrl)&lt;br /&gt;        {&lt;br /&gt;            if (ModelState.IsValid)&lt;br /&gt;            {&lt;br /&gt;                if (Membership.ValidateUser(model.UserName, model.Password))&lt;br /&gt;                {&lt;br /&gt;                    FormsAuthentication.SetAuthCookie(model.UserName, false);&lt;br /&gt;                    if (Url.IsLocalUrl(returnUrl) &amp;&amp; returnUrl.Length &gt; 1 &amp;&amp; returnUrl.StartsWith("/")&lt;br /&gt;                        &amp;&amp; !returnUrl.StartsWith("//") &amp;&amp; !returnUrl.StartsWith("/\\"))&lt;br /&gt;                    {&lt;br /&gt;                        return Redirect(returnUrl);&lt;br /&gt;                    }&lt;br /&gt;                    else&lt;br /&gt;                    {&lt;br /&gt;                        return RedirectToAction("Index", "Home");&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    ModelState.AddModelError("", "The user name or password provided is incorrect.");&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            // If we got this far, something failed, redisplay form&lt;br /&gt;            return View(model);&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8363946540170342205-6064925954271400272?l=blog.absistemi.it' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.absistemi.it/2011/07/form-authentication-utilizzare-un.html</link><author>noreply@blogger.com (Andrea Leo)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8363946540170342205.post-7404269541023067949</guid><pubDate>Fri, 08 Jul 2011 10:46:00 +0000</pubDate><atom:updated>2011-07-08T12:46:39.650+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>hosting</category><title>Aruba ancora down</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-yUDxhSg58h8/Thbf50XWJlI/AAAAAAAAAb8/BFKFvPgY910/s1600/aruba_logo_300dpi-300x89.jpg" imageanchor="1" style=""&gt;&lt;img border="0" height="89" width="300" src="http://2.bp.blogspot.com/-yUDxhSg58h8/Thbf50XWJlI/AAAAAAAAAb8/BFKFvPgY910/s320/aruba_logo_300dpi-300x89.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dopo il fermo della server farm Aruba causato da principio di incendio ad Aprile, anche oggi si è verificato un'altro down.&lt;br /&gt;Dalle indiscrezione sembrerebbe un problema causato dai nuovi UPS...&lt;br /&gt;&lt;br /&gt;Vi consigliamo di tenere monitorato twitter per avere nuove notizie...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8363946540170342205-7404269541023067949?l=blog.absistemi.it' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.absistemi.it/2011/07/aruba-ancora-down.html</link><author>noreply@blogger.com (Andrea Leo)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-yUDxhSg58h8/Thbf50XWJlI/AAAAAAAAAb8/BFKFvPgY910/s72-c/aruba_logo_300dpi-300x89.jpg' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8363946540170342205.post-7723177082836500679</guid><pubDate>Mon, 04 Jul 2011 09:24:00 +0000</pubDate><atom:updated>2011-07-04T11:26:32.694+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>SQL Server 2008</category><title>Come Eliminare SP,View e Function dinamicamente</title><description>Delle volte potrebbe essere utile eliminare tutte le Stored procedure, Viste e funzioni contenute nel database.&lt;br /&gt;Una delle prime soluzioni a cui si potrebbe arrivare è ciclare sulle liste di oggetti restituite dalle varie information_schema. Ma SQL è concepito per pensare "set based" e quindi potremmo sfruttare questa sua caratteristica per riuscire a formattare con un'unica query le istruzioni di drop.&lt;br /&gt;Con lo script seguente otteniamo esattamente ciò che ci siamo prefissati, un'unica query che mi restituisca tutte le istruzioni di drop necessarie.&lt;br /&gt;Le istruzioni saranno poi eseguite grazie alla EXEC.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;&lt;br /&gt;DECLARE @strSql VARCHAR(MAX) = ''&lt;br /&gt;SET @strSql = (&lt;br /&gt;    SELECT 'DROP ' + OBJTYPE + ' [' + OBJSCHEMA + '].[' + OBJNAME + ']; ' FROM&lt;br /&gt;    (&lt;br /&gt;     SELECT ROUTINE_TYPE OBJTYPE,ROUTINE_SCHEMA OBJSCHEMA,&lt;br /&gt;         ROUTINE_NAME OBJNAME&lt;br /&gt;      FROM INFORMATION_SCHEMA.ROUTINES&lt;br /&gt;     UNION&lt;br /&gt;     SELECT TABLE_TYPE, TABLE_SCHEMA, TABLE_NAME&lt;br /&gt;      FROM INFORMATION_SCHEMA.TABLES&lt;br /&gt;       WHERE TABLE_TYPE = 'VIEW'&lt;br /&gt;    ) OBJ    &lt;br /&gt;     FOR XML PATH ('')&lt;br /&gt;    )&lt;br /&gt;EXEC(@strSql)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Vi consiglio di approfondire la "FOR XML PATH('')" che potrebbe tornare molto utile....&lt;br /&gt;&lt;br /&gt;Ciao&lt;br /&gt;&lt;br /&gt;Luca&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8363946540170342205-7723177082836500679?l=blog.absistemi.it' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.absistemi.it/2011/07/come-eliminare-spview-e-function.html</link><author>noreply@blogger.com (Luca Ferrari)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8363946540170342205.post-7131603913643988256</guid><pubDate>Mon, 04 Jul 2011 09:14:00 +0000</pubDate><atom:updated>2011-07-04T11:16:52.080+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>SQL Server 2008</category><title>Come eseguire il Log delle modifiche alla struttura di un DB....</title><description>Molto spesso potrebbe tornare particolarmente utile sapere esattamente quali modifiche sono state effettuate alla struttura di un Database...&lt;br /&gt;Dalla versione SQL Server 2005, grazie ai trigger di database, è possibile ottenerlo senza sforzo... (finalmente direi...)&lt;br /&gt;&lt;br /&gt;In un database specifico per i log delle attività creiamo una tabella di log:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;create table [dbo].[Log]&lt;br /&gt;(&lt;br /&gt;data datetime,&lt;br /&gt;utente varchar(128),&lt;br /&gt;comando varchar(max),&lt;br /&gt;objname varchar(128),&lt;br /&gt;dbname varchar(128)&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Nel/Nei Database che desideriamo monitorare creiamo il seguente Trigger :&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;SET ANSI_NULLS ON&lt;br /&gt;GO&lt;br /&gt;SET QUOTED_IDENTIFIER ON&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;CREATE TRIGGER [Log_Modifiche_Struttura] ON DATABASE FOR&lt;br /&gt;CREATE_TABLE,&lt;br /&gt;ALTER_TABLE,&lt;br /&gt;DROP_TABLE,&lt;br /&gt;CREATE_VIEW,&lt;br /&gt;ALTER_VIEW,&lt;br /&gt;DROP_VIEW,&lt;br /&gt;CREATE_PROCEDURE,&lt;br /&gt;ALTER_PROCEDURE,&lt;br /&gt;DROP_PROCEDURE,&lt;br /&gt;CREATE_FUNCTION,&lt;br /&gt;ALTER_FUNCTION,&lt;br /&gt;DROP_FUNCTION,&lt;br /&gt;CREATE_INDEX,&lt;br /&gt;ALTER_INDEX,&lt;br /&gt;DROP_INDEX,&lt;br /&gt;CREATE_ASSEMBLY,&lt;br /&gt;ALTER_ASSEMBLY,&lt;br /&gt;DROP_ASSEMBLY,&lt;br /&gt;CREATE_TRIGGER,&lt;br /&gt;ALTER_TRIGGER,&lt;br /&gt;DROP_TRIGGER,&lt;br /&gt;CREATE_SCHEMA,&lt;br /&gt;ALTER_SCHEMA,&lt;br /&gt;DROP_SCHEMA&lt;br /&gt;AS&lt;br /&gt;&lt;br /&gt;DECLARE @command AS VARCHAR(MAX)--Comando eseguito&lt;br /&gt;DECLARE @login AS VARCHAR(128)--Utente che ha eseguito il comando&lt;br /&gt;DECLARE @db AS VARCHAR(128)--DB su cui ho effettuato l'operazione&lt;br /&gt;DECLARE @objName AS VARCHAR(128)--Oggetto interessato&lt;br /&gt;&lt;br /&gt;SELECT @login = SUSER_SNAME()--recupero il nome utente&lt;br /&gt;SELECT @command = EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')--recupero il comando di modifica struttura&lt;br /&gt;SELECT @objName = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(max)')--Recupero il nome dell'oggetto modificato/creato/eliminato&lt;br /&gt;SELECT @db = DB_NAME()--recupero il nome del database&lt;br /&gt;&lt;br /&gt;--Inserisco la modifica nello storico&lt;br /&gt;INSERT INTO NomeDbLog.dbo.[Log]&lt;br /&gt;values&lt;br /&gt;(&lt;br /&gt;getdate(),&lt;br /&gt;@login,&lt;br /&gt;@command,&lt;br /&gt;@objName,&lt;br /&gt;@db&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;SET ANSI_NULLS OFF&lt;br /&gt;GO&lt;br /&gt;SET QUOTED_IDENTIFIER OFF&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;DISABLE TRIGGER [Log_Modifiche_Struttura] ON DATABASE&lt;br /&gt;GO&lt;br /&gt;ENABLE TRIGGER [Log_Modifiche_Struttura] ON DATABASE&lt;br /&gt;GO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ogni operazione di Create, Alter, Drop su tabelle, stored procedure, viste, function, schema, index ed assembly verrà quindi tracciata nella nostra tabella di Log.&lt;br /&gt;&lt;br /&gt;Proviamo ora se tutto funziona.&lt;br /&gt;&lt;br /&gt;Creo la seguente tabella nel database monitorato :&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;create table dbo.tabellaprova&lt;br /&gt;(&lt;br /&gt;campo int&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Effettuo una select sul database di Log :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_WIaiBVKYS6s/TD8j2fmJKFI/AAAAAAAAAQs/7FyPpssvrQM/s1600/Immagine.bmp" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://4.bp.blogspot.com/_WIaiBVKYS6s/TD8j2fmJKFI/AAAAAAAAAQs/7FyPpssvrQM/s400/Immagine.bmp" alt="" id="BLOGGER_PHOTO_ID_5494149489516685394" border="0" style="float: left; margin-top: 0pt; margin-right: 10px; margin-bottom: 10px; margin-left: 0pt; cursor: pointer; width: 483px; height: 109px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Troviamo la tabella appena creata.&lt;br /&gt;&lt;br /&gt;Siamo quindi in grado di sapere esattamente chi ha fatto cosa e quando sul nostro DB...&lt;br /&gt;&lt;br /&gt;Notare l'utilizzo della funzione EventData, che restituisce al chiamante le informazioni in formato Xml. Per ottenere l'informazione specifica del comando T-SQL utilizzo la X-query :&lt;br /&gt;&lt;br /&gt;Select @command = EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')&lt;br /&gt;&lt;br /&gt;Spero vi sia utile.&lt;br /&gt;&lt;br /&gt;Ciao&lt;br /&gt;&lt;br /&gt;Alla prossima&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8363946540170342205-7131603913643988256?l=blog.absistemi.it' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.absistemi.it/2011/07/come-eseguire-il-log-delle-modifiche_6762.html</link><author>noreply@blogger.com (Luca Ferrari)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_WIaiBVKYS6s/TD8j2fmJKFI/AAAAAAAAAQs/7FyPpssvrQM/s72-c/Immagine.bmp' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8363946540170342205.post-3083716214342063540</guid><pubDate>Tue, 28 Jun 2011 10:44:00 +0000</pubDate><atom:updated>2011-06-28T12:51:43.141+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Linq</category><title>Linq estrarre tutti i figli da una collezione  di  oggetti</title><description>Supponiamo di avere un oggetto Utente ed un oggetto Gruppo&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;public class Utente&lt;br /&gt;  {&lt;br /&gt;    public string Nome { get; set; }&lt;br /&gt;    public IList&amp;lt;Gruppo&amp;gt; Gruppi { get; set; }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public class Gruppo&lt;br /&gt;  {&lt;br /&gt;    public string Descrizione { get; set; }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Abbiamo un collezione di oggetti Utente, ciascuno dei quali ha a sua volta una collezione di gruppi&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;IList&amp;lt;Utente&amp;gt; list = new List&amp;lt;Utente&amp;gt;&lt;br /&gt;                             {&lt;br /&gt;                               new Utente()&lt;br /&gt;                                 {&lt;br /&gt;                                   Gruppi = new List&amp;lt;Gruppo&amp;gt;()&lt;br /&gt;                                              {&lt;br /&gt;                                                new Gruppo(){Descrizione = "GRUPPO1"},&lt;br /&gt;                                                new Gruppo(){Descrizione = "GRUPPO2"},&lt;br /&gt;                                              }&lt;br /&gt;                                 },&lt;br /&gt;                                                                new Utente()&lt;br /&gt;                                 {&lt;br /&gt;                                   Gruppi = new List&amp;lt;Gruppo&amp;gt;()&lt;br /&gt;                                              {&lt;br /&gt;                                                new Gruppo(){Descrizione = "GRUPPO3"},&lt;br /&gt;                                                new Gruppo(){Descrizione = "GRUPPO4"},&lt;br /&gt;                                              }&lt;br /&gt;                                 }&lt;br /&gt;&lt;br /&gt;                             };&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ora vogliamo estrarre tutti i gruppi di tutti gli utenti, ma se utilizziamo la Select di Linq otterremmo un IEnumerable di liste di oggetti Gruppo:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;IEnumerable&amp;lt;IList&amp;lt;Gruppo&amp;gt;&amp;gt; gruppi = list.Select(x=&gt;x.Gruppi);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Noi invece vogliamo semplicemente una lista di oggetti gruppo e quindi possiamo scrivere:&lt;br /&gt;&lt;pre class="brush: csharp"&gt;IEnumerable&amp;lt;Gruppo&amp;gt; gruppiList = list.SelectMany(x =&gt; x.Gruppi);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8363946540170342205-3083716214342063540?l=blog.absistemi.it' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.absistemi.it/2011/06/linq-estrarre-tutti-i-figli-da-una.html</link><author>noreply@blogger.com (Andrea Leo)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8363946540170342205.post-566965495863957481</guid><pubDate>Sun, 26 Jun 2011 21:14:00 +0000</pubDate><atom:updated>2011-06-26T23:58:35.071+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>IOC</category><category domain='http://www.blogger.com/atom/ns#'>C#</category><title>Utilizzare Windsor  IOC container  con l'autoregistration</title><description>Castle Windsor è una libreria che pemette di iniettare automaticamente le dipendenze all'interno di una nostra classe (Dipendency Injection).&lt;br /&gt;&lt;br /&gt;Questo significa che se abbiamo una classe con un costruttore che accetta come parametro delle interfacce, sostanzialmente non dovremo essere noi a fare il "new" della classe che implementa quella interfaccia, ma verrà fatto in automatico dalla libreria.&lt;br /&gt;&lt;br /&gt;Questo è un esempio di una classe che ha nel costruttore una interfaccia di nome IRepository&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;public class SendMailTask : ISendMailTask&lt;br /&gt;    {&lt;br /&gt;        private IRepository2&lt;user&gt; _repository2;&lt;br /&gt;&lt;br /&gt;        public SendMailTask(IRepository2&lt;user&gt; repository2)&lt;br /&gt;        {&lt;br /&gt;            _repository2 = repository2;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Normalmente per instanziare la nostra classe SendMailTask dovremmo scrivere:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;SendMailTask sendMailTask = new SendMailTask(new Repository2&lt;user&gt;());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Utilizzando invece Windsor, potremo scrivere:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;var sendMailTask = ServiceLocatorInitializer.Container.Resolve&lt;isendmailtask&gt;();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Come avrete notato non abbiamo passato noi a parametro l'instanza della classe richiesta, perchè viene fatto in automatico.&lt;br /&gt;&lt;br /&gt;Risulta molto utile quando abbiamo più parametri nel costruttore, ma soprattutto ci facilita la possibilità di testare il codice attraverso gli Unit Test.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Come funziona&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Come prima cosa effettuiaamo il download di Windsor Castle dal sito  &lt;a href="http://www.castleproject.org/castle/download.html"&gt;www.castleproject.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Poi referenziamo nel nostro progetto le librerie CastleCore,CastleMicrokernel e CastleWindsor&lt;br /&gt;&lt;br /&gt;A questo punto dobbiamo registrare le dipendenze in modo che il programma sappia in automatico quale componente (o classe)&lt;br /&gt;è legato ad una determinata interfaccia &lt;br /&gt;e in questo modo sappia quale instanza deve creare a runtime e iniettare nel costruttore della classe.&lt;br /&gt;&lt;br /&gt;Possiamo utilizzare un file di configurazione che non spiegheremo in questo post e nel quale registriamo le dipendenze.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;castle&gt;&lt;br /&gt;&lt;br /&gt;    &lt;components&gt;&lt;br /&gt;        &lt;br /&gt;        &lt;component &lt;br /&gt;            id="httpservicewatcher"&lt;br /&gt;            type="GettingStartedPart1.HttpServiceWatcher, GettingStartedPart1" /&gt;&lt;br /&gt;&lt;br /&gt;        &lt;component &lt;br /&gt;            id="email.notifier"&lt;br /&gt;            service="GettingStartedPart1.IFailureNotifier, GettingStartedPart1"&lt;br /&gt;            type="GettingStartedPart1.EmailFailureNotifier, GettingStartedPart1" /&gt;&lt;br /&gt;&lt;br /&gt;        &lt;component &lt;br /&gt;            id="alarm.notifier"&lt;br /&gt;            service="GettingStartedPart1.IFailureNotifier, GettingStartedPart1"&lt;br /&gt;            type="GettingStartedPart1.AlarmFailureNotifier, GettingStartedPart1" /&gt;&lt;br /&gt;&lt;br /&gt;        &lt;component &lt;br /&gt;            id="form.component"&lt;br /&gt;            type="GettingStartedPart1.Form1, GettingStartedPart1" /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/components&gt;&lt;br /&gt;&lt;br /&gt;&lt;/castle&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Oppure possiamo utilizzare una nuova caratteristica di Windsor che si chiama AutoRegistration e permette&lt;br /&gt;in automatico di registrare le dipendenze di uno o più assembly.&lt;br /&gt;&lt;br /&gt;Ecco un esempio completo:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;_container = new WindsorContainer();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            _container.Register(&lt;br /&gt;                        AllTypes.Pick()&lt;br /&gt;                        .FromAssemblyNamed(Assembly.GetExecutingAssembly().FullName)&lt;br /&gt;                        .WithService.FirstInterface());&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ecco fatto, in questo modo vengono registrate tutte le dipendenze interfaccia/classe dell'assembly corrente.&lt;br /&gt;Possiamo anche decidere di aggiungere altre dipendenze manualmente:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;container.AddComponent("entityDuplicateChecker",&lt;br /&gt;                typeof(IEntityDuplicateChecker), typeof(EntityDuplicateChecker));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ora possiamo instanziare le nostre classi in questo modo:&lt;br /&gt;&lt;pre class="brush: csharp"&gt;var sendMailTask = ServiceLocatorInitializer.Container.Resolve&lt;isendmailtask&gt;();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Se abbiamo la necessità di utilizzare Windsor in varie classi, non dobbiamo instanziarlo ogni volta ma semplicemente &lt;br /&gt;faremo una classe di helper usando il pattern Singleton; la prima volta chiameremo il metodo Init, le volte successive essendo una classe statica&lt;br /&gt;potremo semplicemente utilizzare la proprietà  pubblica "Container"&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;public class ServiceLocatorInitializer&lt;br /&gt;    {&lt;br /&gt;        private static IWindsorContainer _container;&lt;br /&gt;&lt;br /&gt;        public static IWindsorContainer Container&lt;br /&gt;        {&lt;br /&gt;            get { return _container; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static void Init()&lt;br /&gt;        {&lt;br /&gt;            _container = new WindsorContainer();&lt;br /&gt;&lt;br /&gt;            ComponentRegistrar.AddComponentsTo(_container);&lt;br /&gt;            _container.Register(&lt;br /&gt;                        AllTypes.Pick()&lt;br /&gt;                        .FromAssemblyNamed(Assembly.GetExecutingAssembly().FullName)&lt;br /&gt;                        .WithService.FirstInterface());&lt;br /&gt;         &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8363946540170342205-566965495863957481?l=blog.absistemi.it' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.absistemi.it/2011/06/utilizzare-windsor-ioc-container-con.html</link><author>noreply@blogger.com (Andrea Leo)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8363946540170342205.post-9057020864925252435</guid><pubDate>Sun, 26 Jun 2011 16:16:00 +0000</pubDate><atom:updated>2011-06-26T18:44:59.103+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Linq</category><title>Concatenare una proprietà di una lista di oggetti con Linq</title><description>Supponiamo di avere una lista di oggetti e vorremmo estrarre dalla lista una proprietà e concatenarla alla successiva, magari aggiungendo un separatore come il punto e virgola.&lt;br /&gt;&lt;br /&gt;Con Linq questa operazione è estramente veloce, basta utilizzare l'extension method denominato Aggregate.&lt;br /&gt;Esempio:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;public class Foo&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        public string Proprieta1 { get; set; }&lt;br /&gt;&lt;br /&gt;        public string Proprieta2 { get; set; }&lt;br /&gt;&lt;br /&gt;        public string Proprieta3 { get; set; }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Popoliamo la lista:&lt;br /&gt;&lt;pre class="brush: csharp"&gt;IList&lt;foo&gt; list = new List&lt;foo&gt;()&lt;br /&gt;                {&lt;br /&gt;                    new Foo() {Proprieta1 = "a1",Proprieta2 = "b1",Proprieta3 = "c1"},&lt;br /&gt;                    new Foo() {Proprieta1 = "a2",Proprieta2 = "b2",Proprieta3 = "c2"},&lt;br /&gt;                    new Foo() {Proprieta1 = "a3",Proprieta2 = "b3",Proprieta3 = "c3"}&lt;br /&gt;&lt;br /&gt;                };&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/foo&gt;&lt;/foo&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ora testiamo il risultato:&lt;br /&gt;&lt;pre class="brush: csharp"&gt;var proprieta1Concatenata = list.Select(x =&amp;gt; x.Proprieta1).Aggregate((x, y) =&amp;gt; x + ";" + y);&lt;br /&gt;&lt;br /&gt;Assert.AreEqual("a1;a2;a3",proprieta1Concatenata);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8363946540170342205-9057020864925252435?l=blog.absistemi.it' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.absistemi.it/2011/06/concatenare-una-proprieta-di-un-lista.html</link><author>noreply@blogger.com (Andrea Leo)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8363946540170342205.post-5150092017706767954</guid><pubDate>Thu, 23 Jun 2011 20:05:00 +0000</pubDate><atom:updated>2011-06-23T22:42:50.122+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Jquery</category><title>Realizzare delle Faq per il vostro sito con JQuery</title><description>Oggi vediamo un esempio di come di come realizzare una pagina di Faq (Frequently Asked Questions) che possa aiutare i visitatori del vostro a capirne meglio le funzionalità.&lt;br /&gt;&lt;br /&gt;Faremo in modo che ci siano dei link contenenti la domanda, mentre le risposte saranno non visibili; quando il visitatore cliccherà su uno di questi link, allora si visualizzerà la risposta relativa a link cliccato.&lt;br /&gt;Allo stesso tempo verrà nascosta la descrizione del link dove il visitatore aveva precendentemente cliccato.&lt;br /&gt;&lt;br /&gt;Iniziamo quindi a referenziare la libreria di Jquery:&lt;br /&gt;&lt;pre class="html" name="code"&gt;&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ora creiamo una lista di elementi, ogni elemento sarà composto da un link e da una descrizione:&lt;br /&gt;&lt;br /&gt;&lt;pre class="html" name="code"&gt;&lt;br /&gt;&lt;ul id="lista"&gt;&lt;li&gt;  &lt;a href="#"&gt;Domanda1&lt;/a&gt;  Risposta alla domanda 1&lt;/li&gt;&lt;br /&gt;&lt;li&gt;  &lt;a href="#"&gt;Domanda2&lt;/a&gt;  Risposta alla domanda 2&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;/pre&gt;&lt;br /&gt;Ora inseriamo il codice jquery che serve per gestire i link:&lt;br /&gt;&lt;br /&gt;&lt;pre class="js" name="code"&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;  //nascondiamo tutti i paragrafi &lt;p&gt;&lt;br /&gt; al caricamento della pagine&lt;br /&gt;  $("ul#lista p").css({'display' : 'none'});&lt;br /&gt;    //quando viene cliccato un link&lt;br /&gt;  $("ul#lista a").click(function (e){&lt;br /&gt;    // disabilito il comportamento standard del link&lt;br /&gt;    e.preventDefault();&lt;br /&gt;    &lt;br /&gt;    // nascondi tutti i paragrafi&lt;br /&gt;    $("ul#lista p").css({'display' : 'none'});&lt;br /&gt;    &lt;br /&gt;    // visualizzo il paragrafo relativo al link cliccato&lt;br /&gt;    $(this).parent().find("p").css({'display' : 'block'});&lt;br /&gt;  });&lt;br /&gt; &lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ora vediamo la situazione iniziale della pagina:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-JYxoWrMAL0U/TgOiJke4RFI/AAAAAAAAAbE/Wj4hchDyBE4/s1600/Cattura.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-JYxoWrMAL0U/TgOiJke4RFI/AAAAAAAAAbE/Wj4hchDyBE4/s1600/Cattura.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ora clicco il primo link:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-iCpA1YiVXPg/TgOiQZnzsDI/AAAAAAAAAbI/pXnXB1FGb1M/s1600/Cattura1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-iCpA1YiVXPg/TgOiQZnzsDI/AAAAAAAAAbI/pXnXB1FGb1M/s1600/Cattura1.PNG" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ora clicco il secondo link (notare la descrizione del primo link che viene nascosta):&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-3EHvcJNeSvs/TgOikftg0tI/AAAAAAAAAbQ/slrZQJoQPMs/s1600/Cattura2.PNG" imageanchor="1"&gt;&lt;img border="0" height="120" src="http://3.bp.blogspot.com/-3EHvcJNeSvs/TgOikftg0tI/AAAAAAAAAbQ/slrZQJoQPMs/s320/Cattura2.PNG" width="208" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8363946540170342205-5150092017706767954?l=blog.absistemi.it' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.absistemi.it/2011/06/realizzare-delle-faq-per-il-vostro-con.html</link><author>noreply@blogger.com (Andrea Leo)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-JYxoWrMAL0U/TgOiJke4RFI/AAAAAAAAAbE/Wj4hchDyBE4/s72-c/Cattura.PNG' height='72' width='72'/><thr:total>0</thr:total></item></channel></rss>
