2009-05-16 12 views

Respuesta

17

establecer el Initial Catalog=master en la cadena de conexión y ejecutar:

select count(*) from sysdatabases where name = @name 

con @name establece en el nombre de la base de datos.

Si desea verificar la cadena de conexión como un todo (y no existe una base de datos independiente), intente conectarse a ella en un bloque try/catch.

+0

Esta debe ser la respuesta correcta ... – bryanmac

+0

¿cómo puede saber que una rentabilidad por encima de la consulta? – revolutionkpi

1

Simplemente pruebe un DBConnection.Open() envuelto en un bloque try capturando DBException.

Acerca de una solución tan elegante como la que va a encontrar.

4

Podrías intentar conectarte. Si arroja una excepción, entonces la cadena de conexión es mala de alguna manera, o la base de datos no existe, la contraseña es incorrecta, o alguna otra cosa.

DbConnection db = new SqlConnection(connection_string); 
try 
{ 
    db.Open(); 
} 
catch (SqlException e) 
{ 
    // Cannot connect to database 
} 
+1

Para ser justos, esto podría fallar por muchas razones, como formato incorrecto, usuario deshabilitado, contraseña incorrecta, etc. – cletus

+0

Encontramos que este método no es confiable, por cierto. La estación de trabajo desconectada de la red y el código aún informaron una conexión abierta. Sospecho que es una peculiaridad de la agrupación de conexiones. – peacedog

3

para cubrir el abanico de posibilidades (servidor no existe, la base de datos no existe, sin entrada, sin permisos, caída de servidor, etc.) - la idea más simple es simplemente para tratar de conectar de forma normal, y realice algo trivial - SELECT GETDATE() por ejemplo. Si obtiene una excepción, hay un problema!

Hay momentos (especialmente cuando se trata de sistemas fuera de proceso) cuando try/catch es la opción más pragmática.

+0

¿Quién rechazó eso? Es un tiro barato (a menos que haya algo que haya hecho estúpido). Es lo mismo que la respuesta aceptada, respondida en el mismo marco de tiempo. Tienes mi compasión –

+0

Hemos encontrado que es necesario ejecutar un comando, no solo abrir una conexión, a los fines de nuestra verificación de "estado de la red" (que realmente es una comprobación de "podemos guardar cosas en la base de datos"). – peacedog

+0

@peacedog de ahí el SELECCIONE GETDATE() –

1

tratar

IF NOT EXISTS(SELECT * FROM sys.databases WHERE [name] = @name) 
    CREATE DATABASE @name; 
GO 

o

IF db_id(@name) IS NOT NULL 
    CREATE DATABASE @name; 
GO 

o SqlConnection.ChangeDatabase(String). Creo que podría usar menos recursos de servidor SQL y luego un nuevo intento de conexión.

0

Si está utilizando Entity Framework o lo tiene a su disposición, sólo tiene que llamar Database.Exists():

if (Database.Exists(connectionString)) 
{ 
    // do something 
} 
else 
{ 
    // do something else 
} 
+0

¿Por qué fue esto downvoted? Funciona y se ajusta a la solicitud "elegante". Es mucho más elegante que usar excepciones como parte del flujo lógico. Añadí la advertencia sobre Entity Framework, que es una biblioteca de Microsoft diseñada para usar con MS SQL Server. –

1

Esto es lo que funcionó para mí para verificar la existencia de cualquier base de datos PostgreSQL con C#:

private bool chkDBExists(string connectionStr, string dbname) 
{ 
    using (NpgsqlConnection conn = new NpgsqlConnection(connectionStr)) 
    { 
     using (NpgsqlCommand command = new NpgsqlCommand 
      ($"SELECT DATNAME FROM pg_catalog.pg_database WHERE DATNAME = '{dbname}'", conn)) 
     { 
      try 
      { 
       conn.Open(); 
       var i = command.ExecuteScalar(); 
       conn.Close(); 
       if (i.ToString().Equals(dbname)) //always 'true' (if it exists) or 'null' (if it doesn't) 
        return true; 
       else return false; 
      } 
      catch (Exception e) { return false; } 
     } 
    } 
} 

** Si se usa en la instrucción try-catch simplemente podría verificar si el retorno de ExecuteScalar es nulo para DB inexistente y no nulo si existe.

0

se puede obtener la lista de base de datos con más abajo y verificar el nombre de db:

USE master 
GO 
SELECT name, database_id, create_date 
FROM sys.databases ; 
GO 
Cuestiones relacionadas