Idalgo Cantelli

.NET programming

  Home :: Contact :: Syndication  :: Login
  12 Posts :: 0 Stories :: 0 Comments :: 403 Trackbacks

Lavorare con i database è una pratica quotidiana. Un lavoro che deve affiancare la progettazione e lo sviluppo di database è la stesura di documentazione dettagliata sui database che creiamo. Per far ciò gli strumenti più comuni sono ErWin e Visio. E’ tuttavia possibile creare in modo rapido uno strumento di documentazione per SQL Server 2000.

Occorre utilizzare la libreria SQLDMO.dll (la si trova nella cartella Microsoft SQL Server\80\Tools\Binn\sqldmo.dll)

Si tratta di un oggetto COM che viene usato anche dall’Enterprise Manager per popolare il suo albero con la struttura dei database e delle tabelle.

Questa libreria fornisce accesso a tutti gli oggetti di Sql Server, dai database ai linked servers, dalle stored procedures ai file delle transazioni, dagli utenti ai job. Avrete insomma capito che utilizzandola ci si può creare un proprio Enterprise Manager senza dover conoscere nei più sottili dettagli le tabelle di sistema di SQL 2000.

Tempo fa avevo scritto una classe in VB.NET che elencava le stored procedures di un database.

Con pochissimo sforzo l’ho incapsulata in un Add-in per Microsoft Word. Non mi sono spinto molto oltre ma il risultato è gradevole. I metodi scrivono sul documento Word i database presenti sul server locale, e per ciascun database stampano l’elenco delle tabelle e delle stored Procedures.

Allego il codice della classe con i metodi che elencano gli oggetti. Ricordate che per usare la libreria SQLDMO.dll occorre avere SQL Server 2000 o MSDE installato sulla macchina di sviluppo. Poi occorre includere il riferimento al progetto .NET selezionando Add Reference -> COM -> Microsoft SQLDMO Object Library.

Siccome uno strumento del genere permette di elencare anche oggetti di amministrazione come i job e gli alerts, nonché di reperire informazioni sui file fisici e sui log delle transazioni, può essere appetibile anche per i Database Administrators oltre che per i progettisti. Il metodo getDatabaseFiles è un esempio di questo uso “amministrativo” della libreria.

Ecco come si presenta la classe:

 

 

 

using System;

using System.Diagnostics;

using SQLDMO;

using Microsoft.Office.Interop.Word;

using ApplicationClass = SQLDMO.ApplicationClass;

 

namespace WordAddin

{

        public class SQLDocumenter

      {

 

         #region Member variables

 

           internal SQLDMO.SQLServer server;

           internal SQLDMO.Database db;

           internal string serverName;

           internal string databaseName;

           internal string username;

           internal string password;

 

         #endregion

           

 

            /// Costruttore

            public SQLDocumenter()

            {

               server = new SQLDMO.SQLServer();

            }

 

 

 

 

 

            public void Connect()

            {

               try

               {

                  server.Connect(serverName, username, password);

               }

               catch (Exception ex)

               {

                  Trace.Fail(ex.Message);

               }

            }

 

 

 

            /// Elenca i Server registrati su un PC.

            public void getServers(Microsoft.Office.Interop.Word.Range rng)

            {

 

                  try

                  {

                     ApplicationClass APP = new ApplicationClass();

 

                     foreach (ServerGroup Sg in APP.ServerGroups)

                         foreach (RegisteredServer srv in Sg.RegisteredServers)

                                rng.InsertAfter(srv.Name + Environment.NewLine);

                  }

                  catch (Exception ex)

                  {

                     Trace.Fail(ex.Message);

                  }

            }

 

 

 

 

            /// Elenca i database di un server

            /// e scrive la lista su un oggetto Range di Microsoft Word.

            public void getDatabases(Microsoft.Office.Interop.Word.Range rng)

            {

                  rng.InsertAfter(string.Format("Database del server {0}{1}{1}",

server.Name, Environment.NewLine));

 

                  foreach (SQLDMO.Database db in server.Databases)

                  {

                        rng.InsertAfter(db.Name.ToUpper() + Environment.NewLine);

                        rng.InsertAfter("Database files: " + Environment.NewLine);

                                    getDatabaseFiles(db, rng);

                        rng.InsertAfter("TABELLE: "+ Environment.NewLine);

                                    myGetTables(db, rng);

                        rng.InsertAfter("STORED PROCEDURES:" + Environment.NewLine);

                                    myGetStoredProcedures(db, rng);

                        rng.InsertAfter("------------------------" +

                                        Environment.NewLine);

                  }

 

            }

 

 

 

 

            /// Enumera i nomi di file fisici del database (con il percorso completo), 

            /// le loro dimensioni in Megabyte

            /// e le dimensioni massime del file.

            /// -1 significa che il file non ha una dimensione massima.

            private void getDatabaseFiles(SQLDMO.Database db, 

                                          Microsoft.Office.Interop.Word.Range rng)

            {

                foreach (SQLDMO.FileGroup fg in db.FileGroups)

                {

                   foreach (SQLDMO.DBFile dbf in fg.DBFiles)

                       rng.InsertAfter(string.Format("Nome file: {0}; " +

"Size {1}MB; MaximumSize : {2}{3}" ,

                                  dbf.PhysicalName, dbf.Size,

 dbf.MaximumSize, Environment.NewLine));

                }

            }

 

 

 

            /// Elenca le tabelle di un database

            /// e scrive la lista su un oggetto Range di Word.

            /// Vengono escluse le tabelle di sistema.

            private void myGetTables(SQLDMO.Database db,

                              Microsoft.Office.Interop.Word.Range rng)

            {

                  foreach (SQLDMO.Table tb in db.Tables)

                  {

                        if (!tb.SystemObject)

                              rng.InsertAfter(string.Format("\t{0}{1}",

                              tb.Name, Environment.NewLine));

                  }

            }

 

 

 

 

 

            public void GetStoredProcedures(Microsoft.Office.Interop.Word.Range rng,

                                         string databaseName)

            {

 

                  foreach (SQLDMO.Database db in server.Databases)

                  {

                        if (string.Compare(db.Name, databaseName, true) == 0)

                        {                      

                              rng.InsertAfter(string.Format("Stored procedures " +

                                                            "del database {0}{1}{1}",

                                                            databaseName,

                                                            Environment.NewLine));

                              myGetStoredProcedures(db,rng);

                        }

                  }

            }

 

 

           

            /// Elenca le stored procedures di un database,

       /// e le scrive su un oggetto Range di Word.

            /// Sono escluse le stored procedures di sistema

            private void myGetStoredProcedures(SQLDMO.Database db,

                                               Microsoft.Office.Interop.Word.Range rng)

            {

               foreach (SQLDMO.StoredProcedure sp in db.StoredProcedures)

                  if (!sp.SystemObject)

                    rng.InsertAfter(string.Format("\t{0}{1}",

                                    sp.Name, Environment.NewLine));

            }

      }

}

?>

posted on mercoledì 18 maggio 2005 23.05