[Silverlight 4] Accesso a SQL Server locale in modalità Elevated Trust

La beta 1 di Silverlight 4 finalmente apre la strada a tutta una serie di appliciazioni che richiedono accesso a risorse locali superiore a quanto offerto dalla modalita sandboxed di SL3.

Per una lista completa delle nuove feature suggerisco questo post:

http://timheuer.com/blog/archive/2009/11/18/whats-new-in-silverlight-4-complete-guide-new-features.aspx

Tra le cose più interessanti, c'è la possibilità di accedere a oggetti COM via late binding (per la serie: COM è morto lunga vita a COM!). Questo apre la strada ad un'infinità di soluzioni, con le stesse modalità usate a suo tempo in VBScript o VBA.

Una delle strade che si aprono è l'accesso ad una base dati client side, accessibile via OLEDB / ADO come ad es. SQL Server. Di seguito un semplice esempio su come fare.

Ricordatevi di:

  • Impostare in VS 2010 nelle opzioni Out-of-Browser: "Require elevated trust when running outside the browser" (elevated trust funziona solo out-of browser)
  • Aggiungere Microsoft.CSharp.dll ai reference (per l'uso dei tipi dinamici)

Le performance di questo approccio non sono eccezionali, a causa dei continui roundtrip via COM interop. Si possono tuttavia migliorare notevolmente limitando il numero di chiamate COM ad es. con la clausola "FOR XML" della istruzione SELECT in T-SQL

        private IList<Product> LoadData() 
        { 
            IList<Product> l = new List<Product>();

            dynamic conn = ComAutomationFactory.CreateObject("ADODB.Connection");
            try 
            { 
                conn.ConnectionString = @"Provider=SQLOLEDB.1;Integrated Security=SSPI;" + 
                                        @"Persist Security Info=False;Initial Catalog=AdventureWorks2008;" + 
                                        @"Data Source=.\MSSQL08";
                conn.Open(); 

                dynamic rs = conn.Execute("SELECT Name, ProductNumber, ListPrice, SellStartDate " + 
                                          "FROM Production.Product ORDER BY Name");

                while (!rs.EOF) 
                { 
                    l.Add(new Product() { Name = rs["Name"].Value, 
                                          ProductNumber = rs["ProductNumber"].Value, 
                                          ListPrice = rs["ListPrice"].Value, 
                                          SellStartDate = rs["SellStartDate"].Value });
                    rs.MoveNext(); 
                } 

                rs.Close(); 
            } 
            finally 
            { 
                conn.Close(); 
            } 

            return l; 
        } 
    } 

Alessandro Pilotti [MVP / IIS]

 
 

posted @ lunedì 23 novembre 2009 03:55

Print
Comments have been closed on this topic.