2016-09-01 3 views
0

C#에서 프로젝트를 개발 중입니다. SMO를 사용하여 C# 코드에서 SQL Server 데이터베이스를 분리 한 다음 연결하려고합니다. 나는 데이터베이스를 분리 할 수 ​​있습니다,하지만 난 그것을 첨부 할 때 오류가 발생합니다C#에서 SQL Server 데이터베이스 연결

실제 파일을 열 수 없습니다 "C : \ 프로그램 Files \ Microsoft SQL 서버 \ MSSQL12.MSSQLSERVER \ MSSQL \ DATA의 \의 ghale합니다. mdf ". 운영 체제 오류 5 : "5 (액세스가 거부되었습니다.)".

코드 : 당신은 Ctrl + Alt + 삭제 키를 누르면

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의 서비스 계정을 찾아 내야한다, 당신은 작업 관리자에서 볼 수 있습니다 그런 다음 "C : \ Murach \ SQL Server 2008 \ Databases"의 읽기/쓰기 권한을 서비스 계정에 제공해야합니다.

+0

내 데이터베이스에 읽기/쓰기 권한을 부여하는 방법 ???? – atefeh

+0

C : \ Program Files \ Microsoft SQL Server \ MSSQL12.MSSQLSERVER \ MSSQL \ DATA ... 그런 다음 yourdatabse -> Properties -> Security 탭 -> 계속 -> 모든 권한을 사용자에게 선택 – KJV111

1

관찰의 커플 : 나는 중간 부분을 주석 처리하면

  1. 변수 sqlconn2, serverconn2s1 방금하는 변수 s을 다시 사용할 수 있습니다 불필요한있는 ghale 데이터베이스
  2. 을 다시 부착 백업 파일을 mydb2으로 복원하면 ghale 데이터베이스를 다시 첨부하면 작동합니다.
  3. ghale 백업 파일을 데이터베이스 0에 복원하는 것으로 의심됩니다인 경우 데이터베이스 속성 | mydb2의 파일은 ghale.mdfghale_log.ldf 파일을 사용하고있는 것을 볼 수 있습니다. 결과적으로 해당 파일이 데이터베이스 mydb2에 의해 사용 중이기 때문에 ghale.mdf을 다시 첨부 할 수 없으므로 액세스 거부 오류 메시지가 표시됩니다.

UPDATE : 데이터와 로그를 다른 물리적 파일을 사용하는 SQL을 복원 나는 mydb2 데이터베이스를 업데이트 한

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); 
    } 
} 

을 : 다음 코드는 당신이 달성하기 위해 노력하고 무엇을 생각 논리 이름의 이름을 바꿀 수 있습니다.

관련 문제