2011-10-15 13 views
5

Tengo un problema y aprendí algo al mismo tiempo ...La base de datos ya existe. Elija un nombre diferente utilizando CreateDatabase()

Creé un DBML desde una base de datos de servidor existente.

Desde el DBML, quería crear una base de datos local (un archivo .mdf). Creé la base de datos using DataContext.CreateDatabase("C:\xxxx.mdf").

Luego decidí eliminarlo (MANUALMENTE, lo cual es una cosa mala evidentemente) porque cuando intento recrear la base de datos con el mismo nombre (aunque los archivos se eliminan), obtengo el error La base de datos ya existe. Elija un nombre diferente usando CreateDatabase()

Intenté buscar en el registro, sin suerte ... Intenté buscar todo el disco duro en el archivo ... sin suerte.

Después de googlear, encontré que eliminaste una base de datos que se creó con CreateDatabase() con DeleteDatabase() .... Luego puedes volver a crear la base de datos.

El problema es que ahora todavía no puedo volver a crear la base de datos anterior porque el sistema cree que el nombre ya existe.

¿Hay una manera de deshacerse de los reminents del archivo DATABSE edad del "no existe"

+0

cuando lo eliminó manualmente tenía que eliminar tanto el MDF y LDF? Además, ¿qué error obtienes cuando llamas a DeleteDatabase() ahora? –

+0

Cuando intento DeleteDatabase(), obtengo esto: ** System.Data.SqlClient.SqlException: Falló un intento de adjuntar una base de datos llamada automáticamente para el archivo C: \ xxxx.mdf. Existe una base de datos con el mismo nombre, o el archivo especificado no se puede abrir, o está ubicado en el recurso compartido UNC. ** –

Respuesta

7

Es necesario abrir master base de datos a través de server explorer en Visual Studio (Agregar nueva conexión + Seleccionar master base de datos) a continuación, agregue un New query, escriba Drop Database xxxx y ejecútelo. También puede utilizar Sql Server Management Studio.

+1

También encontré el mismo problema. ¿Es posible hacer lo que sugeriste programáticamente? – remi

+0

En caso de que alguien se esté preguntando lo mismo, sí, puede hacerlo programáticamente. Simplemente conéctese a la base de datos en su código, luego envíe la declaración SQL correspondiente para su ejecución ('drop database xxxx'). – Daniel

3

Una solución (a través de here) es el uso de SSEUtil para separar el DB existente:

try 
{ 
    // open a connection to the database for test 
} 
catch (SystemException ex) // Change exception type based on your underlying data provider 
{ 
    if (ex.Message.ToLower().Contains("already exists. choose a different database name")) 
    { 
     var match = Regex.Match(ex.Message, "database '(.*)' already exists.", 
      RegexOptions.IgnoreCase); 

     if (match.Success) 
     { 
      String dbFileName = match.Groups[1].Value; 
      Process p = new Process(); 
      p.StartInfo.UseShellExecute = true; 
      p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
      p.StartInfo.FileName = String.Format("{0}/Tools/SSEUtil.exe", 
       Environment.CurrentDirectory); 
      p.StartInfo.WorkingDirectory = Environment.CurrentDirectory; 
      p.StartInfo.Arguments = String.Format("-d \"{0}\"", dbFileName); 

      p.Start(); 
     } 
    } 
} 
+0

+1 He encontrado este problema al implementar mediante programación bases de datos de SQL Server con clases de SQL a SQL. No estoy seguro de por qué la base de datos permanece adjunta después de que existe la aplicación, sin embargo, esta herramienta logra separar la base de datos. Si alguien tiene ideas sobre cómo prevenir este problema en primer lugar y, por lo tanto, elimina la necesidad de esta solución, sería genial. Gracias por la solución por cierto. –

-1

También en realidad tenía este mismo problema. Previamente, eliminé (corte) la base de datos en mysqlserver2012 y la copié a la carpeta de mi aplicación. Después de crear mi aplicación, obtuve este error y lo resolví eliminando la parte Initial Catalog de mi Cadena de conexión.

Su cadena de conexión final debe ser algo como esto:

Data Source=<your server name>;AttachDbFileName=database path\databaseName.mdf;Integrated Security=True" + ";User Instance=True" + ";Context Connection=False;

Cuestiones relacionadas