Прикрепить базу данных SQL Server на C#

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

Не удалось открыть физический файл «C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\ghale.mdf». Ошибка операционной системы 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");
}

person atefeh    schedule 01.09.2016    source источник
comment
Что такое smo в вашем посте?   -  person RBT    schedule 01.09.2016
comment
@RBT: общие объекты управления SQL Server — библиотека для управления сервером и его объектами базы данных.   -  person marc_s    schedule 01.09.2016
comment
SMO означает объекты управления SQL Server.   -  person atefeh    schedule 01.09.2016
comment
В порядке. Пожалуйста, опубликуйте написанный вами код C# для SMO, чтобы прикрепить файл базы данных.   -  person RBT    schedule 01.09.2016
comment
Возможный дубликат Как подключить базу данных sqlserver в C#   -  person Liesel    schedule 01.09.2016


Ответы (2)


Пара наблюдений:

  1. Переменные sqlconn2, serverconn2 и s1 не нужны, так как вы можете просто повторно использовать переменную s для повторного подключения базы данных ghale.
  2. Если я закомментирую средний раздел, который восстанавливает файл резервной копии в mydb2, повторное подключение базы данных ghale будет работать.
  3. Я подозреваю, что вы восстанавливаете файл резервной копии ghale в базу данных mydb2, если это так, если вы посмотрите на свойства базы данных | Файлы mydb2 вы увидите, что он использует файлы ghale.mdf и ghale_log.ldf. В результате вы не можете повторно подключить ghale.mdf, потому что этот файл теперь используется базой данных 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);
    }
}

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

person sly    schedule 01.09.2016

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

Во-первых, вы должны узнать свою учетную запись службы sqlserver, вы можете увидеть ее в диспетчере задач, когда вы одновременно нажимаете ctrl + alt + delete; затем вы должны предоставить привилегию чтения/записи «C:\Murach\SQL Server 2008\Databases" на учетную запись службы.

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