2016-09-01 14 views
0

Я разрабатываю проект на C#. Я хочу отсоединить, а затем добавить базу данных SQL Server из кода C# с помощью SMO. Я могу снять базу данных, но когда я хочу, чтобы прикрепить ее, возникает ошибка:Прикрепить базу данных SQL Server в C#

Невозможно открыть физический файл «C: \ Program Files \ Microsoft SQL Server \ MSSQL12.MSSQLSERVER \ MSSQL \ DATA \ ghale. мдф». Ошибка операционной системы 5: «5 (Доступ запрещен.)».

Код:

OpenFileDialog f = new OpenFileDialog(); 
f.Title = "sqlbakcup"; 
f.FileName = ""; 
f.Filter = @"SQL Backup files (*.BAK) |*.BAK|All files(*.*) |*.*"; 

if (f.ShowDialog() == DialogResult.OK) 
{ 
    SqlConnection sqlconn = new SqlConnection(@"Data Source=.;Initial Catalog=master;Integrated Security=True"); 
    ServerConnection serverconn = new ServerConnection(sqlconn); 

    Server s = new Server(serverconn); 
    s.DetachDatabase("ghale", false); 

    //MessageBox.Show("ok"); 
    SqlConnection sqlconn1 = new SqlConnection(@"Data Source=.;Initial Catalog=mydb2;Integrated Security=True"); 

    SqlCommand sqlcmd = new SqlCommand("ALTER DATABASE mydb2 SET SINGLE_USER with ROLLBACK IMMEDIATE " + "use master " + "RESTORE DATABASE [mydb2] FROM DISK = @n WITH REPLACE ", sqlconn1); 
    sqlcmd.Parameters.AddWithValue("@n", f.FileName); 

    sqlconn1.Open(); 
    sqlcmd.ExecuteNonQuery(); 
    sqlconn1.Close(); 

    SqlConnection sqlconn2 = new SqlConnection(@"Data Source=.;Initial Catalog=master;Integrated Security=True"); 
    ServerConnection serverconn2 = new ServerConnection(sqlconn2); 

    Server s1 = new Server(serverconn2); 
    s1.AttachDatabase("ghale", new StringCollection { 
      @"C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\ghale.mdf", 
      @"C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\ghale_log.ldf" }, AttachOptions.None); 
    //MessageBox.Show("ok"); 
    MessageBox.Show("OK"); 
} 
+0

Что такое smo в вашем посте? – RBT

+0

@ RBT: общие объекты управления SQL Server - библиотека для управления сервером и его объектами базы данных –

+1

SMO означает объекты управления SQL Server – atefeh

ответ

0

Попробуйте это ..

Первое, вы должны найти свой счет службы SQLServer, вы можете увидеть его в диспетчере задач при нажатии Ctrl + Alt + Delete в то же время. Затем вы должны предоставить привилегию чтения/записи «C: \ Murach \ SQL Server 2008 \ Базы данных» учетной записи службы.

+0

как предоставить права чтения/записи моей базе данных ???? – atefeh

+0

C: \ Program Files \ Microsoft SQL Server \ MSSQL12.MSSQLSERVER \ MSSQL \ DATA ... Затем щелкните правой кнопкой мыши yourdatabse -> Свойства-> вкладка Безопасность -> продолжить -> выберите полный контроль для пользователя – KJV111

1

Несколько наблюдений:

  1. Переменные sqlconn2, serverconn2 и s1 не нужны, как вы можете просто повторно использовать переменную s повторно подключить базу данных
  2. ghale Если я закомментируйте средний раздел который восстанавливает файл резервной копии до mydb2, перезапись базы данных ghale
  3. Я подозреваю, что вы восстанавливаете файл резервной копии ghale в базе данных mydb2, если это так, если вы посмотрите на Свойства базы данных | Файлы mydb2 вы увидите, что он использует файлы ghale.mdf и ghale_log.ldf. В результате вы не можете повторно присоединить ghale.mdf, потому что этот файл теперь используется базой данных mydb2, следовательно, сообщение об ошибке «Отказано в доступе».

UPDATE: Я думаю, что следующий код, что вы пытаетесь достичь:

OpenFileDialog f = new OpenFileDialog(); 
f.Title = "sqlbakcup"; 
f.FileName = ""; 
f.Filter = @"SQL Backup files (*.BAK) |*.BAK|All files(*.*) |*.*"; 

if (f.ShowDialog() == DialogResult.OK) 
{ 
    using (SqlConnection sqlconn = new SqlConnection(@"Data Source=.;Initial Catalog=master;Integrated Security=True")) 
    { 
     ServerConnection serverconn = new ServerConnection(sqlconn); 

     Server s = new Server(serverconn); 
     s.DetachDatabase("ghale", false); 

     SqlConnection sqlconn1 = new SqlConnection(@"Data Source=.;Initial Catalog=mydb2;Integrated Security=True"); 

     SqlCommand sqlcmd = new SqlCommand(
      "ALTER DATABASE [mydb2] SET SINGLE_USER with ROLLBACK IMMEDIATE use master " 
      + @"RESTORE DATABASE [mydb2] FROM DISK = @n WITH REPLACE, " 
      + @"MOVE 'ghale'  TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Data\mydb2.mdf', " 
      + @"MOVE 'ghale_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Data\mydb2_log.ldf' " 
      + @"ALTER DATABASE [mydb2] MODIFY FILE (NAME=N'ghale', NEWNAME=N'mydb2')" 
      + @"ALTER DATABASE [mydb2] MODIFY FILE (NAME=N'ghale_log', NEWNAME=N'mydb2_log')", 
     sqlconn1); 
     sqlcmd.Parameters.AddWithValue("@n", f.FileName); 

     sqlconn1.Open(); 
     sqlcmd.ExecuteNonQuery(); 
     sqlconn1.Close(); 

     s.AttachDatabase("ghale", 
         new StringCollection { 
     @"C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\ghale.mdf", 
     @"C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\ghale_log.ldf" }, 
         AttachOptions.None); 
    } 
} 

Я обновил базу данных mydb2 восстановления SQL использовать различные физические файлы данных и журналов , а также переименовать логические имена.