Índice de la sección dedicada a .NET (en el Guille) ADO .NET

Saber las bases de datos de una instancia de SQL Server con C#

Publicado el 05/Feb/2006
Actualizado el 05/Feb/2006
Autor: Guillermo 'guille' Som

Código de ejemplo para saber las bases de datos de una instancia (o servidor) de SQL Server usando código de Visual C# (cualquier versión)

 

Introducción

En este código de ejemplo, te voy a mostrar una función que devuelve un array de tipo string con los nombres de las bases de datos que contiene una instancia (o servidor) de SQL Server.

En ese array no se devuelven las bases de datos que el propio SQL Server utiliza para sus "cosillas", pero como comprobarás por el código, es fácil hacer que se devuelvan, ya que esas cuatro bases de datos (master, model, msdb y tempdb) las he puesto dentro de un array para que se compruebe antes de devolver los nombres de las demás bases de datos que esa instancia de SQL contiene.

Como verás, es un código bien simple, y lo que hago es utilizar la tabla sysdatabases que el propio SQL Server utiliza para esas y otras cosas. Por tanto, lo que hacemos es hacer una "consulta" (query) a esa tabla y por medio del campo name de esa tabla, sabremos los nombres de las bases de datos.

Esto nos puede resultar útil para saber los nombres de las bases de datos de una instancia en particular de SQL Server.
Pulsa aquí si quieres saber las instancias que hay en SQL Server del equipo actual.

En cualquier caso, debo decirte que es posible que esos valores solo puedas averiguarlos si tienes permisos suficientes, vamos que si el usuario actual de Windows dispone de esos privilegios. Aunque puedes indicar un usuario y password en la cadena de conexión, ya que en este ejemplo, uso la autenticación integrada (o del usuario actual de Windows).

 

Para que este código funcione debes tener la referencia a System.Data y la importación de los espacios de nombres System.Data y System.DataSqlClient.

 

El código de C#

Este código es válido para cualquier versión de Visual C#.

private String[] basesDeDatos( string instancia )
{
    // Las bases de datos propias de SQL Server
    string[] basesSys = {"master", "model", "msdb", "tempdb"};
    string[] bases;
    DataTable dt = new DataTable();
    // Usamos la seguridad integrada de Windows
    string sCnn = "Server=" + instancia + "; database=master; integrated security=yes";
 
    // La orden T-SQL para recuperar las bases de master
    string sel = "SELECT name FROM sysdatabases";
    try
    {
        SqlDataAdapter da = new SqlDataAdapter(sel, sCnn);
        da.Fill(dt);
        bases = new string[dt.Rows.Count - 1];
        int k = -1;
        for(int i= 0; i< dt.Rows.Count; i++){
            string s = dt.Rows[i]["name"].ToString();
            // Solo asignar las bases que no son del sistema
            if( Array.IndexOf(basesSys, s) == -1 ){
                k += 1;
                bases[k] = s;
            }
        }
        if( k == -1 ) return null;
        // ReDim Preserve
        {
            int i1_RPbases = bases.Length; 
            string[] copiaDe_bases = new string[i1_RPbases]; 
            Array.Copy(bases, copiaDe_bases, i1_RPbases);
            bases = new string[(k + 1)];
            Array.Copy(copiaDe_bases, bases, (k + 1));
        };
        return bases;
 
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message, 
            "Error al recuperar las bases de la instancia indicada", 
            MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    return null;
}

 

Y esto es todo.
Espero que te sea de utilidad, que de eso es de lo que se trata.

Nos vemos.
Guillermo


Ir al índice principal de el Guille