2010-02-28 10 views
5

Trato de hacer lo siguiente:Tratando de separar adjuntar la base de datos - configuración de acceso db después

  • separar la base de

  • Copiar archivos a una carpeta temporal

  • Fije la base de datos de nuevo

Esto funciona la primera vez, pero cuando tr Para ejecutar este método por segunda vez desde el mismo proceso, recibo un error. Siempre puedo acceder al databse que se adjuntó nuevamente desde otros clientes, pero no desde mi aplicación.

El error es:

"error de nivel de transporte al intentar enviar la solicitud al servidor. (Proveedor: Memoria Compartida-Provider, error:. 0 - ningún proceso en el otro extremo de la tubería)" , cuando trato de leer datos de sys.database_files del db recién conectado.

El error se Traducido del alemán "Fehler auf Übertragungsebene beim Senden der Anforderung un servidor den."

Sucede después de "cmdGetDBFileName.ExecuteReader". Todavía puedo abrir la conexión pero consultar los failo sys.database_files.

La fuente es bastante larga, pero supongo que puede omitir la parte al principio donde obtengo los nombres de archivo de la base de datos para separarla. ¿Ve mi error o tiene alguna idea de lo que podría verificar?

public bool DetachB2CPrepare() 
     { 
      _log.Debug("DetachB2CPrepare"); 
      SqlConnection prepareDBConnection = null; 
      SqlConnection prepareMasterDBConnection = null; 
      SqlDataReader readerDbFiles = null; 

      bool result = true; 
      try 
      { 
       //rc_b2c_product_prepare.mdf  
       string prepareDBPysicalFileName = ""; 
       //rc_b2c_product_prepare  
       string prepareDBFileName = ""; 
       //D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\rc_b2c_product_prepare.mdf 
       string prepareDBFileNameComplete = ""; 

       //rc_b2c_product_prepare_1.ldf 
       string prepareTransactionLogPhysicalFileName = ""; 
       //rc_b2c_product_prepare_log  
       string prepareTransactionLogFileName = ""; 
       //D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\rc_b2c_product_prepare_1.ldf 
       string prepareTransactionLogFileNameComplete = ""; 
       _log.DebugFormat("Try to open B2CPrepare"); 
       prepareDBConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["B2CPrepare"].ConnectionString); 
       prepareDBConnection.Open(); 



       //Get the file names of DB 
       SqlCommand cmdGetDBFileName = new SqlCommand("select name , physical_name, type from sys.database_files where type= 0"); 
       cmdGetDBFileName.Connection = prepareDBConnection; 
       readerDbFiles = cmdGetDBFileName.ExecuteReader(); 
       if (readerDbFiles.Read()) 
       { 
        prepareDBFileName = (string)readerDbFiles["name"]; 
        prepareDBFileNameComplete = (string)readerDbFiles["physical_name"]; 
        int lastSlash = prepareDBFileNameComplete.LastIndexOf(@"\"); 
        prepareDBPysicalFileName = prepareDBFileNameComplete.Substring(lastSlash + 1, prepareDBFileNameComplete.Length - lastSlash - 1); 
        readerDbFiles.Close(); 
       } 
       else{ 
        return false; 
       } 

       cmdGetDBFileName.CommandText = "select name , physical_name, type from sys.database_files where type= 1"; 
       readerDbFiles = cmdGetDBFileName.ExecuteReader(); 
       if (readerDbFiles.Read()) 
       { 
        prepareTransactionLogFileName = (string)readerDbFiles["name"]; 
        prepareTransactionLogFileNameComplete = (string)readerDbFiles["physical_name"]; 
        int lastSlash = prepareTransactionLogFileNameComplete.LastIndexOf(@"\"); 
        prepareTransactionLogPhysicalFileName = prepareTransactionLogFileNameComplete.Substring(lastSlash + 1, prepareTransactionLogFileNameComplete.Length - lastSlash - 1); 
        readerDbFiles.Close(); 
       } 
       else 
       { 
        return false; 
       } 

       _log.DebugFormat("shrink transactionlog {0}", prepareTransactionLogFileName); 

       SqlCommand cmdShrinkPrepare = new SqlCommand(string.Format(@"DBCC Shrinkfile('{0}',100) ", prepareTransactionLogFileName)); 
       cmdShrinkPrepare.Connection = prepareDBConnection; 
       cmdShrinkPrepare.ExecuteNonQuery(); 

       //master auf MyProductName 
       prepareMasterDBConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyProductNameMaster"].ConnectionString); 
       prepareMasterDBConnection.Open(); 

       _log.Debug("cmdOffline"); 

       //Datenbank verbindunge löschen 
       SqlCommand cmdOffline = new SqlCommand(@"ALTER DATABASE rc_b2c_product_prepare SET SINGLE_USER WITH ROLLBACK IMMEDIATE"); 
       cmdOffline.Connection = prepareMasterDBConnection; 
       cmdOffline.ExecuteNonQuery(); 

       _log.Debug("cmdDetach: rc_b2c_product_prepare" ); 

       SqlCommand cmdDetach = new SqlCommand(@"dbo.sp_detach_db @dbname = N'rc_b2c_product_prepare',@keepfulltextindexfile = N'false'"); 
       cmdDetach.Connection = prepareMasterDBConnection; 
       cmdDetach.ExecuteNonQuery(); 

       string pathForCopies = MyProductName.Backend.settings.B2CPrepareDBBackupPath; 

       //copy files to temp folder 
       string tempFileDB = pathForCopies + "\\" + prepareDBPysicalFileName; 
       string tempFileLog = pathForCopies + "\\" + prepareTransactionLogPhysicalFileName; 

       _log.DebugFormat("Copy: {0} TO: {1}", prepareDBFileNameComplete, tempFileDB); 

       System.IO.File.Copy(prepareDBFileNameComplete, tempFileDB, true); 

       _log.DebugFormat("Copy: {0} TO: {1}", prepareTransactionLogFileNameComplete, tempFileLog); 

       System.IO.File.Copy(prepareTransactionLogFileNameComplete, tempFileLog, true); 

       _log.DebugFormat("cmdAttach: db {0} log {1}", prepareDBFileNameComplete, prepareTransactionLogFileNameComplete); 

       SqlCommand cmdAttach = new SqlCommand( 
         string.Format(@" 
         CREATE DATABASE rc_b2c_product_prepare ON 
         (FILENAME = N'{0}'), 
         (FILENAME = N'{1}') 
         FOR ATTACH", prepareDBFileNameComplete, prepareTransactionLogFileNameComplete)); 

       cmdAttach.Connection = prepareMasterDBConnection; 
       cmdAttach.ExecuteNonQuery(); 

       _log.Debug("ALTER DATABASE rc_b2c_product_prepare SET MULTI_USER "); 

       //set multi user 
       SqlCommand cmdOnline = new SqlCommand(@"ALTER DATABASE rc_b2c_product_prepare SET MULTI_USER WITH ROLLBACK IMMEDIATE"); 
       cmdOnline.Connection = prepareMasterDBConnection; 
       cmdOnline.ExecuteNonQuery(); 

       return result; 
      } 
      catch (Exception e) 
      { 
       _log.Error(e); 
       return false; 
      } 
      finally 
      { 
       if (prepareDBConnection != null) 
       { 
        prepareDBConnection.Close(); 
       } 
       if (prepareMasterDBConnection != null) 
       { 
        prepareMasterDBConnection.Close(); 
       } 
       if (readerDbFiles != null) 
       { 
        readerDbFiles.Close(); 
       } 
      } 
     } 

Respuesta

1

suena como que podría estar relacionado con tratar de utilizar una conexión que ya no es válida, debido a la agrupación de conexiones.

Puede intentar desactivar la agrupación de conexiones para ver si ese es el problema. Para hacer esto, agregue "Pooling = false" a su cadena de conexión SQL en su archivo de configuración.

+0

deshabilitar la conexión ppoiling hizo el truco –

1

podría ser un problema con la agrupación de conexiones, que han intentado cerrar la prepareDBConnection antes de hacer el detach/attach?

En segundo lugar, ¿ha mirado los objetos de administración de SQL (SMO) - aquí es un example for the detach/attach.

Thridly, usted no tiene que separar la base de datos cuando lo que desea es hacer una copia de seguridad, puede establecer fuera de línea en su lugar. Using SMO o using SQL (sp_dboption doc).

0

Para separar una base de datos MSSQL

USE master; 
GO 
ALTER DATABASE [AdventureWorks2012] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
EXEC sp_detach_db @dbname = N'AdventureWorks2012'; 
GO 

Para adjuntar una base de datos separada

USE master; 
GO 
CREATE DATABASE MyAdventureWorks 
ON (FILENAME = 'C:\MySQLServer\AdventureWorks2012_Data.mdf'), 
(FILENAME = 'C:\MySQLServer\AdventureWorks2012_Log.ldf') 
FOR ATTACH; 
GO 

probé este código para múltiples bases de datos, que funcionaba bien.

Cuestiones relacionadas