<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>ADO.Net</title>
        <link>http://community.dotnetwork.it/AndreaZ/category/36.aspx</link>
        <description>Piccoli tips sulla programmazione di ADO.Net</description>
        <language>it-IT</language>
        <copyright>Andrea Zingoni</copyright>
        <managingEditor>andrea.zingoni@poste.it</managingEditor>
        <generator>Subtext Version 1.9.5.176</generator>
        <item>
            <title>Recuperare i MetaDati di una tabella SQL</title>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2008/07/23/recuperare-i-metadati-di-una-tabella-sql.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://community.dotnetwork.it/images/community_dotnetwork_it/AndreaZ/WindowsLiveWriter/RecuperareiMetaDatidiunatabella_7D85/image_6.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="286" alt="image" src="http://community.dotnetwork.it/images/community_dotnetwork_it/AndreaZ/WindowsLiveWriter/RecuperareiMetaDatidiunatabella_7D85/image_thumb_2.png" width="734" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Nei miei post precedenti (&lt;a href="http://community.dotnetwork.it/AndreaZ/archive/2008/05/22/recuperare-lelenco-dei-database-sql.aspx" target="_blank"&gt;Recuperare l'elenco dei database SQL&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/AndreaZ/archive/2008/07/21/recuperare-lelenco-delle-tabelle-presenti-in-un-database-sql.aspx" target="_blank"&gt;Recuperare l'elenco delle  tabelle presenti in un database SQL&lt;/a&gt;) ho descritto come poter accedere alle tabelle presenti in un database collegato ad un'istanza SQL. Adesso vedremo come recuperare i MetaDati delle colonne di una determinata tabella. &lt;/p&gt;  &lt;p&gt;Conoscere i MetaDati delle colonne ci dà la possibilità di identificarne le proprietà come ad esempio: DataType, Ordinal, ColumnSize ecc... E' quindi possibile determinare anche se una colonna è Chiave Primaria (PK), Identity e se accetta valori NULL.&lt;/p&gt;  &lt;p&gt;Per recuperare queste informazioni non è sufficiente eseguire un'unica query sulle tabelle di sistema ma bisogna eseguirne più di una perché i MetaDati sono suddivisi per tipologia su più tabelle (come ad esempio le chiavi primarie ed i vincoli di chiave esterna).&lt;/p&gt;  &lt;p&gt;Per poter raggruppare facilmente tutte queste proprietà in un'unica DataTable, utilizzeremo l'oggetto &lt;a href="http://msdn.microsoft.com/it-it/library/system.data.sqlclient.sqldatareader.aspx" target="_blank"&gt;SqlClient.SqlDataReader&lt;/a&gt; che eseguirà al posto nostro le query necessarie per recuperare le informazioni tramite il proprio metodo .&lt;a href="http://msdn.microsoft.com/it-it/library/system.data.sqlclient.sqldatareader.getschematable.aspx" target="_blank"&gt;GetSchemaTable&lt;/a&gt;.&lt;/p&gt;  &lt;pre class="VisualBasicFormat"&gt;        &lt;span class="rem"&gt;' VB.&lt;/span&gt;
        &lt;span class="rem"&gt;' Recupera le informazioni delle colonne.&lt;/span&gt;
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; strSql &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="str"&gt;"Data Source=MIO SERVER;Initial Catalog=MIO DATABASE;Integrated Security=True"&lt;/span&gt;
        Using cnn &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SqlClient.SqlConnection(strSql)
            &lt;span class="rem"&gt;' Utilizza una stringa di connessione generica per recuperare tutti i records della &lt;/span&gt;
            &lt;span class="rem"&gt;' tabella Customers del database Northwind.&lt;/span&gt;
            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; command &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SqlClient.SqlCommand(&lt;span class="str"&gt;"SELECT * FROM Customers"&lt;/span&gt;, cnn)
            cnn.Open()
            &lt;span class="rem"&gt;' Recupera le informazioni sule chiavi.&lt;/span&gt;
            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; dr &lt;span class="kwrd"&gt;As&lt;/span&gt; SqlClient.SqlDataReader
            dr = command.ExecuteReader(CommandBehavior.KeyInfo)
            &lt;span class="rem"&gt;' Recupera le informazioni sui MetaDati della tabella.&lt;/span&gt;
            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; dtColumnsSchema &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; DataTable
            dtColumnsSchema = dr.GetSchemaTable()
            dr.Close()
            cnn.Close()
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;.DataGridView1.DataSource = dtColumnsSchema
        &lt;span class="kwrd"&gt;End&lt;/span&gt; Using&lt;/pre&gt;

&lt;pre class="CSharpFormat"&gt;{ 
    &lt;span class="rem"&gt;// C#. &lt;/span&gt;
    &lt;span class="rem"&gt;// Recupera le informazioni delle colonne. &lt;/span&gt;
    &lt;span class="kwrd"&gt;string&lt;/span&gt; strSql = &lt;span class="str"&gt;"Data Source=MIO SERVER;Initial Catalog=MIO DATABASE;Integrated Security=True"&lt;/span&gt;; 
    &lt;span class="kwrd"&gt;using&lt;/span&gt; (SqlClient.SqlConnection cnn = &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlClient.SqlConnection(strSql)) { 
        &lt;span class="rem"&gt;// Utilizza una stringa di connessione generica per recuperare tutti i records della &lt;/span&gt;
        &lt;span class="rem"&gt;// tabella Customers del database Northwind. &lt;/span&gt;
        SqlClient.SqlCommand command = &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlClient.SqlCommand(&lt;span class="str"&gt;"SELECT * FROM Customers"&lt;/span&gt;, cnn); 
        cnn.Open(); 
        &lt;span class="rem"&gt;// Recupera le informazioni sule chiavi. &lt;/span&gt;
        SqlClient.SqlDataReader dr; 
        dr = command.ExecuteReader(CommandBehavior.KeyInfo); 
        &lt;span class="rem"&gt;// Recupera le informazioni sui MetaDati della tabella. &lt;/span&gt;
        DataTable dtColumnsSchema = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataTable(); 
        dtColumnsSchema = dr.GetSchemaTable(); 
        dr.Close(); 
        cnn.Close(); 
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataGridView1.DataSource = dtColumnsSchema; 
    } 
}&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Da sottolineare che la procedura appena descritta è molto simile a quella utilizzata dai DataAdapter di Visual Studio durante il popolamento delle DataTable.&lt;/p&gt;

&lt;p&gt;Ringrazio &lt;a href="http://community.dotnetwork.it/alberto/Default.aspx" target="_blank"&gt;Alberto&lt;/a&gt; e &lt;a href="http://community.dotnetwork.it/sabrina/Default.aspx" target="_blank"&gt;Sabrina&lt;/a&gt; per &lt;a href="http://www.dotnetwork.it/Forums/tabid/54/forumid/4/tpage/1/view/topic/postid/2117/language/it-IT/Default.aspx#2117" target="_blank"&gt;l'aiuto&lt;/a&gt; che mi hanno dato.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;
  &lt;/p&gt;&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c0658b88-e745-4055-a5be-2abe9f9fa56f" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Tag Cloud: &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Sql/default.aspx" rel="tag"&gt;Sql&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/DataTable/default.aspx" rel="tag"&gt;DataTable&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/SqlConnection/default.aspx" rel="tag"&gt;SqlConnection&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Tips/default.aspx" rel="tag"&gt;Tips&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/119.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2008/07/23/recuperare-i-metadati-di-una-tabella-sql.aspx</guid>
            <pubDate>Wed, 23 Jul 2008 10:38:02 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/119.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2008/07/23/recuperare-i-metadati-di-una-tabella-sql.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/119.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Recuperare l'elenco delle tabelle presenti in un database SQL</title>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2008/07/21/recuperare-lelenco-delle-tabelle-presenti-in-un-database-sql.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://community.dotnetwork.it/images/community_dotnetwork_it/AndreaZ/WindowsLiveWriter/Recuperarelelencodelletabellediundatabas_840B/image_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="343" alt="image" src="http://community.dotnetwork.it/images/community_dotnetwork_it/AndreaZ/WindowsLiveWriter/Recuperarelelencodelletabellediundatabas_840B/image_thumb.png" width="526" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Nel &lt;a href="http://community.dotnetwork.it/AndreaZ/archive/2008/05/22/recuperare-lelenco-dei-database-sql.aspx" target="_blank"&gt;post&lt;/a&gt; precedente si è visto come recuperare l'elenco delle istanze SQL disponibili nella rete locale. E' possibile risalire a queste informazioni utilizzando una query che recupera i dati dalla tabella di sitema &lt;a href="http://technet.microsoft.com/it-it/library/ms179900.aspx" target="_blank"&gt;sys.sysdatabases&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Abbiamo detto che è possibile evitare l'utilizzo di una query utilizzando il metodo .&lt;a href="http://msdn.microsoft.com/it-it/library/system.data.sqlclient.sqlconnection.getschema(VS.80).aspx"&gt;GetSchema&lt;/a&gt; dell'oggetto &lt;a href="http://msdn.microsoft.com/it-it/library/system.data.sqlclient.sqlconnection(VS.80).aspx"&gt;SqlConnection&lt;/a&gt; (versione 2.0 e superiore).&lt;/p&gt;  &lt;p&gt;Sempre utilizzando una query o un oggetto SqlConnection è possibile leggere i nomi delle tabelle presenti in un database SQL:&lt;/p&gt;  &lt;pre class="VisualBasicFormat"&gt;        &lt;span class="rem"&gt;' VB.&lt;/span&gt;
        &lt;span class="rem"&gt;' Recupera l'insieme delle tabelle presenti nel database.&lt;/span&gt;
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; strSql &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="str"&gt;"Data Source=MIO SERVER;Initial Catalog=MIO DATABASE;Integrated Security=True"&lt;/span&gt;
        Using cnn &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SqlClient.SqlConnection(strSql)
            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; cmd &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SqlClient.SqlCommand(&lt;span class="str"&gt;"SELECT * FROM sys.tables"&lt;/span&gt;, cnn)
            cnn.Open()
            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; dr &lt;span class="kwrd"&gt;As&lt;/span&gt; SqlClient.SqlDataReader = cmd.ExecuteReader()
            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; dt &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; DataTable
            dt.Load(dr)
            cnn.Close()
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;.DataGridView1.DataSource = dt
        &lt;span class="kwrd"&gt;End&lt;/span&gt; Using&lt;/pre&gt;

&lt;pre class="CSharpFormat"&gt;{ 
    &lt;span class="rem"&gt;// C#. &lt;/span&gt;
    &lt;span class="rem"&gt;// Recupera l'insieme delle tabelle presenti nel database. &lt;/span&gt;
    &lt;span class="kwrd"&gt;string&lt;/span&gt; strSql = &lt;span class="str"&gt;"Data Source=MIO SERVER;Initial Catalog=MIO DATABASE;Integrated Security=True"&lt;/span&gt;; 
    &lt;span class="kwrd"&gt;using&lt;/span&gt; (SqlClient.SqlConnection cnn = &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlClient.SqlConnection(strSql)) { 
        SqlClient.SqlCommand cmd = &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlClient.SqlCommand(&lt;span class="str"&gt;"SELECT * FROM sys.tables"&lt;/span&gt;, cnn); 
        cnn.Open(); 
        SqlClient.SqlDataReader dr = cmd.ExecuteReader(); 
        DataTable dt = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataTable(); 
        dt.Load(dr); 
        cnn.Close(); 
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataGridView1.DataSource = dt; 
    } 
} &lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Utilizzando l'oggetto SqlConnection:&lt;/p&gt;

&lt;pre class="VisualBasicFormat"&gt;        &lt;span class="rem"&gt;' VB.&lt;/span&gt;
        &lt;span class="rem"&gt;' Recupera l'insieme delle tabelle presenti nel database.&lt;/span&gt;
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; strSql &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="str"&gt;"Data Source=MIO SERVER;Initial Catalog=MIO DATABASE;Integrated Security=True"&lt;/span&gt;
        Using cnn &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SqlClient.SqlConnection(strSql)
            cnn.Open()
            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; tbl &lt;span class="kwrd"&gt;As&lt;/span&gt; DataTable = cnn.GetSchema(&lt;span class="str"&gt;"Tables"&lt;/span&gt;) ' gestire le restrizioni per filtrare i risultati.
            cnn.Close()
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;.DataGridView1.DataSource = tbl
        &lt;span class="kwrd"&gt;End&lt;/span&gt; Using&lt;/pre&gt;

&lt;pre class="CSharpFormat"&gt;{ 
    &lt;span class="rem"&gt;// C#. &lt;/span&gt;
    &lt;span class="rem"&gt;// Recupera l'insieme delle tabelle presenti nel database. &lt;/span&gt;
    &lt;span class="kwrd"&gt;string&lt;/span&gt; strSql = &lt;span class="str"&gt;"Data Source=MIO SERVER;Initial Catalog=MIO DATABASE;Integrated Security=True"&lt;/span&gt;; 
    &lt;span class="kwrd"&gt;using&lt;/span&gt; (SqlClient.SqlConnection cnn = &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlClient.SqlConnection(strSql)) { 
        cnn.Open(); 
        DataTable tbl = cnn.GetSchema(&lt;span class="str"&gt;"Tables"&lt;/span&gt;); // gestire le restrizioni per filtrare i risultati.
        cnn.Close(); 
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataGridView1.DataSource = tbl; 
    } 
} &lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:80a7b99e-3763-4311-a232-1193460a4f9a" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Tag Cloud: &lt;a href="http://community.dotnetwork.it/andreaz/Tags/SQL/default.aspx" rel="tag"&gt;SQL&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/DataTable/default.aspx" rel="tag"&gt;DataTable&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/SqlConnection/default.aspx" rel="tag"&gt;SqlConnection&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Tips/default.aspx" rel="tag"&gt;Tips&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/117.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2008/07/21/recuperare-lelenco-delle-tabelle-presenti-in-un-database-sql.aspx</guid>
            <pubDate>Mon, 21 Jul 2008 08:11:12 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/117.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2008/07/21/recuperare-lelenco-delle-tabelle-presenti-in-un-database-sql.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/117.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Recuperare l'elenco dei database SQL</title>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2008/05/22/recuperare-lelenco-dei-database-sql.aspx</link>
            <description>&lt;p&gt;L'idea di scrivere questo tip nasce dalla voglia di approfondire le risposte ricevute a questa mia &lt;a href="http://www.dotnetwork.it/Forums/tabid/54/forumid/4/postid/1722/view/topic/language/it-IT/Default.aspx" target="_blank"&gt;domanda&lt;/a&gt; posta nel forum di &lt;a href="http://www.dotnetwork.it/" target="_blank"&gt;DNW&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Una volta recuperato l'elenco delle istanze di SQL disponibili nella rete locale (vedi precedente &lt;a href="http://community.dotnetwork.it/AndreaZ/archive/2008/05/13/recuperare-lelenco-dei-server-sql.aspx" target="_blank"&gt;post&lt;/a&gt;) è possibile leggere i nomi dei singoli database ad esse collegate eseguendo la query "SELECT Name FROM &lt;a href="http://technet.microsoft.com/it-it/library/ms179900.aspx" target="_blank"&gt;SysDataBases&lt;/a&gt;":&lt;/p&gt;  &lt;pre class="VisualBasicFormat"&gt;&lt;span class="rem"&gt;' VB.&lt;/span&gt;
&lt;span class="rem"&gt;' Crea la stringa di connessione all'istanza locale di SQL.&lt;/span&gt;
&lt;span class="kwrd"&gt;Dim&lt;/span&gt; strCnn &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="str"&gt;"Data Source=.\SQLExpress; Integrated Security=True;Connect Timeout=30;User Instance=True"&lt;/span&gt; 

&lt;span class="rem"&gt;' Crea il comando di selezione SQL.&lt;/span&gt;
&lt;span class="kwrd"&gt;Dim&lt;/span&gt; strSql &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="str"&gt;"SELECT Name FROM SysDataBases"&lt;/span&gt; 

&lt;span class="kwrd"&gt;Try&lt;/span&gt;
  &lt;span class="rem"&gt;' Crea la connessione al database.&lt;/span&gt;
  Using cnn &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SqlClient.SqlConnection(strCnn)
     cnn.Open()
        &lt;span class="rem"&gt;' Crea l'oggetto command per eseguire la query di selezione nel database.&lt;/span&gt;
        Using cmd &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SqlClient.SqlCommand(strSql, cnn)
           &lt;span class="rem"&gt;' Crea un DataReader per leggere i risultati della query.&lt;/span&gt;
           Using dr &lt;span class="kwrd"&gt;As&lt;/span&gt; SqlClient.SqlDataReader = cmd.ExecuteReader
              &lt;span class="rem"&gt;' Popola una nuova DataTable.&lt;/span&gt;
              &lt;span class="kwrd"&gt;Dim&lt;/span&gt; tbl &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; DataTable
              tbl.Load(dr)
              &lt;span class="rem"&gt;' Binda la DataGridView alla DataTable.&lt;/span&gt;
              &lt;span class="kwrd"&gt;Me&lt;/span&gt;.DataGridView1.DataSource = tbl
              dr.Close()
            &lt;span class="kwrd"&gt;End&lt;/span&gt; Using
        &lt;span class="kwrd"&gt;End&lt;/span&gt; Using
     cnn.Close()
  &lt;span class="kwrd"&gt;End&lt;/span&gt; Using
&lt;span class="kwrd"&gt;Catch&lt;/span&gt; ex &lt;span class="kwrd"&gt;As&lt;/span&gt; Exception
  MessageBox.Show(ex.Message)
&lt;span class="kwrd"&gt;End&lt;/span&gt; Try&lt;/pre&gt;

&lt;pre class="CSharpFormat"&gt;&lt;span class="rem"&gt;// C#. &lt;/span&gt;    
&lt;span class="rem"&gt;// Crea la stringa di connessione all'istanza locale di SQL. &lt;/span&gt;
&lt;span class="kwrd"&gt;string&lt;/span&gt; strCnn = &lt;span class="str"&gt;"Data Source=.\\SQLExpress; Integrated Security=True;Connect Timeout=30;User Instance=True"&lt;/span&gt;; 
    
&lt;span class="rem"&gt;// Crea il comando di selezione SQL. &lt;/span&gt;
&lt;span class="kwrd"&gt;string&lt;/span&gt; strSql = &lt;span class="str"&gt;"SELECT Name FROM SysDataBases"&lt;/span&gt;; 
    
&lt;span class="kwrd"&gt;try&lt;/span&gt; { 
    &lt;span class="rem"&gt;// Crea la connessione al database. &lt;/span&gt;
    &lt;span class="kwrd"&gt;using&lt;/span&gt; (SqlClient.SqlConnection cnn = &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlClient.SqlConnection(strCnn)) { 
        cnn.Open(); 
        &lt;span class="rem"&gt;// Crea l'oggetto command per eseguire la query di selezione nel database. &lt;/span&gt;
        &lt;span class="kwrd"&gt;using&lt;/span&gt; (SqlClient.SqlCommand cmd = &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlClient.SqlCommand(strSql, cnn)) { 
            &lt;span class="rem"&gt;// Crea un DataReader per leggere i risultati della query. &lt;/span&gt;
            &lt;span class="kwrd"&gt;using&lt;/span&gt; (SqlClient.SqlDataReader dr = cmd.ExecuteReader) { 
                &lt;span class="rem"&gt;// Popola una nuova DataTable. &lt;/span&gt;
                DataTable tbl = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataTable(); 
                tbl.Load(dr); 
                &lt;span class="rem"&gt;// Binda la DataGridView alla DataTable. &lt;/span&gt;
                &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataGridView1.DataSource = tbl; 
                dr.Close(); 
            } 
        } 
        cnn.Close(); 
    } 
} 
&lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex) { 
    MessageBox.Show(ex.Message); 
}&lt;/pre&gt;

&lt;p&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Ricordarsi che "s&lt;em&gt;olo gli utenti con privilegi amministrativi hanno accesso alle viste e alle tabelle di sistema."&lt;/em&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="http://community.dotnetwork.it/images/community_dotnetwork_it/AndreaZ/WindowsLiveWriter/e95050e9fc38_13536/image_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="345" alt="image" src="http://community.dotnetwork.it/images/community_dotnetwork_it/AndreaZ/WindowsLiveWriter/e95050e9fc38_13536/image_thumb.png" width="417" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Una volta collegati ad un'istanza è possibile recuperare dai suoi database (permessi permettendo) numerose informazioni sulla loro struttura e sul loro contenuto eseguendo una sola query.&lt;/p&gt;

&lt;p&gt;In questo esempio recuperiamo le PK della tabella Costumers di Northwind:&lt;/p&gt;

&lt;pre class="VisualBasicFormat"&gt;&lt;span class="rem"&gt;' VB.&lt;/span&gt;
&lt;span class="rem"&gt;' Crea la stringa di connessione al database Northwind.&lt;/span&gt;
&lt;span class="kwrd"&gt;Dim&lt;/span&gt; strCnn &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="str"&gt;"Data Source=.\SQLExpress;"&lt;/span&gt; &amp;amp; _
                       &lt;span class="str"&gt;"AttachDbFilename="&lt;/span&gt;&lt;span class="str"&gt;"C:\SQL Server 2000 Sample Databases\NORTHWND.MDF"&lt;/span&gt;&lt;span class="str"&gt;";"&lt;/span&gt; &amp;amp; _
                       &lt;span class="str"&gt;"Integrated Security=True;Connect Timeout=30;User Instance=True"&lt;/span&gt;

&lt;span class="rem"&gt;' Individua le colonne di chiave primaria della tabella Customers nel database Northwind.&lt;/span&gt;
&lt;span class="kwrd"&gt;Dim&lt;/span&gt; strSql &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="str"&gt;"SELECT i.name AS index_name, ic.index_column_id, "&lt;/span&gt; &amp;amp; _
                       &lt;span class="str"&gt;"ic.key_ordinal, c.name AS column_name, "&lt;/span&gt; &amp;amp; _
                       &lt;span class="str"&gt;"TYPE_NAME(c.user_type_id) AS column_type, c.is_identity "&lt;/span&gt; &amp;amp; _
                       &lt;span class="str"&gt;"FROM sys.indexes AS i INNER JOIN "&lt;/span&gt; &amp;amp; _
                       &lt;span class="str"&gt;"sys.index_columns AS ic ON i.object_id = ic.object_id "&lt;/span&gt; &amp;amp; _
                       &lt;span class="str"&gt;"AND i.index_id = ic.index_id INNER JOIN "&lt;/span&gt; &amp;amp; _
                       &lt;span class="str"&gt;"sys.columns AS c ON ic.object_id = c.object_id "&lt;/span&gt; &amp;amp; _
                       &lt;span class="str"&gt;"AND c.column_id = ic.column_id "&lt;/span&gt; &amp;amp; _
                       &lt;span class="str"&gt;"WHERE (i.is_primary_key = 1) AND (i.object_id = "&lt;/span&gt; &amp;amp; _
                       &lt;span class="str"&gt;"OBJECT_ID('dbo.Customers'))"&lt;/span&gt;&lt;/pre&gt;

&lt;pre class="CSharpFormat"&gt;&lt;span class="rem"&gt;// C#.&lt;/span&gt;
&lt;span class="rem"&gt;// Crea la stringa di connessione al database Northwind.&lt;/span&gt;
&lt;span class="kwrd"&gt;string&lt;/span&gt; strCnn = &lt;span class="str"&gt;"Data Source=.\\SQLExpress;"&lt;/span&gt; + &lt;span class="str"&gt;"AttachDbFilename=\"C:\\SQL Server 2000 Sample Databases\\NORTHWND.MDF\";"&lt;/span&gt; + &lt;span class="str"&gt;"Integrated Security=True;Connect Timeout=30;User Instance=True"&lt;/span&gt;;&lt;/pre&gt;

&lt;pre class="CSharpFormat"&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre class="CSharpFormat"&gt;&lt;span class="rem"&gt;// &lt;/span&gt;Individua le colonne di chiave primaria della tabella Customers nel database Northwind.&lt;/pre&gt;

&lt;pre class="CSharpFormat"&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; strSql = &lt;span class="str"&gt;@"
SELECT 
      i.name AS index_name
    , ic.index_column_id
    , ic.key_ordinal
    , c.name AS column_name
    , TYPE_NAME(c.user_type_id) AS column_type
    , c.is_identity 
FROM 
    ys.indexes i 
INNER JOIN 
    sys.index_columns ic 
ON 
    i.object_id = ic.object_id  
AND 
    i.index_id = ic.index_id 
INNER JOIN 
    sys.columns c 
ON 
    ic.object_id = c.object_id  
AND 
    c.column_id = ic.column_id 
WHERE 
    (i.is_primary_key = 1) 
AND 
    (i.object_id = OBJECT_ID('dbo.Customers'))
"&lt;/span&gt;;&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="http://community.dotnetwork.it/images/community_dotnetwork_it/AndreaZ/WindowsLiveWriter/e95050e9fc38_13536/image_6.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="132" alt="image" src="http://community.dotnetwork.it/images/community_dotnetwork_it/AndreaZ/WindowsLiveWriter/e95050e9fc38_13536/image_thumb_2.png" width="649" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Un elenco di query interessanti da eseguire sul catalogo di sistema di SQL lo troviamo a questo &lt;a href="http://technet.microsoft.com/it-it/library/ms345522.aspx" target="_blank"&gt;indirizzo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;C'è comunque &lt;strong&gt;&lt;u&gt;un altro sistema&lt;/u&gt;&lt;/strong&gt; per raggiungere i suddetti risultati, ossia quello di utilizzare il metodo .&lt;a href="http://msdn.microsoft.com/it-it/library/system.data.sqlclient.sqlconnection.getschema(VS.80).aspx" target="_blank"&gt;GetSchema&lt;/a&gt; dell'oggetto &lt;a href="http://msdn.microsoft.com/it-it/library/system.data.sqlclient.sqlconnection(VS.80).aspx" target="_blank"&gt;SqlConnection&lt;/a&gt; (versione 2.0 e superiore).&lt;/p&gt;

&lt;p&gt;Questo metodo permette di recuperare molte informazioni dall'oggetto SqlConnection senza dover conoscere la sintassi delle query sopra descritte. Richiamandolo e gestendo correttamente i suoi parametri di Overload, crea una nuova DataTable e la popola con tutte le informazioni richieste.&lt;/p&gt;

&lt;p&gt;A dire il vero, se si desiderano informazioni complesse (restituite tra l'altro con un certo ordine), l'utilizzo del suo Overload potrebbe risultare alquanto complicato, ma è del tutto banale nel caso si desideri leggere i dati di base. &lt;/p&gt;

&lt;p&gt;Per avere un eleco degli schemi che il metodo è in grado di recuperare non bisogna passaregli alcun parametro:&lt;/p&gt;

&lt;pre class="VisualBasicFormat"&gt;&lt;span class="rem"&gt;' VB.&lt;/span&gt;
...
&lt;span class="kwrd"&gt;Dim&lt;/span&gt; tbl &lt;span class="kwrd"&gt;As&lt;/span&gt; DataTable = cnn.GetSchema()
...&lt;/pre&gt;

&lt;pre class="CSharpFormat"&gt;&lt;span class="rem"&gt;// C#.&lt;/span&gt;
...
DataTable tbl = cnn.GetSchema(); 
...&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="http://community.dotnetwork.it/images/community_dotnetwork_it/AndreaZ/WindowsLiveWriter/e95050e9fc38_13536/image_4.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="453" alt="image" src="http://community.dotnetwork.it/images/community_dotnetwork_it/AndreaZ/WindowsLiveWriter/e95050e9fc38_13536/image_thumb_1.png" width="333" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Ogni schema può essere filtrato mediante apposite restrizioni che permettono un'accurata personalizzazione dei risultati ottenuti. L'argomento può diventare vasto e complesso, vi rimando quindi al vostro motore di ricerca preferito per cercare ulteriori approfondimenti su queste impostazioni. &lt;/p&gt;

&lt;p&gt;Tornando al nostro caso, possiamo quindi recuperare&lt;strong&gt; l'elenco dei database&lt;/strong&gt; presenti nell'istanza SQL senza utilizzare alcuna query:&lt;/p&gt;

&lt;pre class="VisualBasicFormat"&gt;&lt;span class="rem"&gt;' VB.&lt;/span&gt;
&lt;span class="rem"&gt;' Crea la stringa di connessione all'istanza locale di SQL.&lt;/span&gt;
&lt;span class="kwrd"&gt;Dim&lt;/span&gt; strCnn &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="str"&gt;"Data Source=.\SQLExpress; Integrated Security=True;Connect Timeout=30;User Instance=True"&lt;/span&gt;

&lt;span class="rem"&gt;' Si connette al database.&lt;/span&gt;
Using cnn &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SqlClient.SqlConnection(strCnn)
  cnn.Open()
  &lt;span class="kwrd"&gt;Dim&lt;/span&gt; tbl &lt;span class="kwrd"&gt;As&lt;/span&gt; DataTable = cnn.GetSchema(&lt;span class="str"&gt;"DATABASES"&lt;/span&gt;)
  &lt;span class="kwrd"&gt;Me&lt;/span&gt;.DataGridView1.DataSource = tbl
  cnn.Close()
&lt;span class="kwrd"&gt;End&lt;/span&gt; Using&lt;/pre&gt;

&lt;pre class="CSharpFormat"&gt;{ 
    &lt;span class="rem"&gt;// C#. &lt;/span&gt;
    &lt;span class="rem"&gt;// Crea la stringa di connessione all'istanza locale di SQL. &lt;/span&gt;
    &lt;span class="kwrd"&gt;string&lt;/span&gt; strCnn = &lt;span class="str"&gt;"Data Source=.\\SQLExpress; Integrated Security=True;Connect Timeout=30;User Instance=True"&lt;/span&gt;; 
    
    &lt;span class="rem"&gt;// Si connette al database. &lt;/span&gt;
    &lt;span class="kwrd"&gt;using&lt;/span&gt; (SqlClient.SqlConnection cnn = &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlClient.SqlConnection(strCnn)) { 
        cnn.Open(); 
        DataTable tbl = cnn.GetSchema(&lt;span class="str"&gt;"DATABASES"&lt;/span&gt;); 
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataGridView1.DataSource = tbl; 
        cnn.Close(); 
    } 
} &lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="http://community.dotnetwork.it/images/community_dotnetwork_it/AndreaZ/WindowsLiveWriter/e95050e9fc38_13536/image_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="345" alt="image" src="http://community.dotnetwork.it/images/community_dotnetwork_it/AndreaZ/WindowsLiveWriter/e95050e9fc38_13536/image_thumb.png" width="417" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:b944fef2-c74d-4292-9f25-1e11f4c1b28a" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Tag Cloud: &lt;a href="http://community.dotnetwork.it/andreaz/Tags/SQL/default.aspx" rel="tag"&gt;SQL&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/DataTable/default.aspx" rel="tag"&gt;DataTable&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/SqlConnection/default.aspx" rel="tag"&gt;SqlConnection&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Tips/default.aspx" rel="tag"&gt;Tips&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/104.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2008/05/22/recuperare-lelenco-dei-database-sql.aspx</guid>
            <pubDate>Thu, 22 May 2008 20:25:45 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/104.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2008/05/22/recuperare-lelenco-dei-database-sql.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/104.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>
