【问题标题】:Attach SQL Server database in C#在 C# 中附加 SQL Server 数据库
【发布时间】:2016-09-01 07:02:07
【问题描述】:

我正在用 C# 开发一个项目。我想使用 SMO 从 C# 代码中分离然后附加 SQL Server 数据库。我可以分离数据库,但是当我想附加它时,出现错误:

无法打开物理文件“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");
}

【问题讨论】:

  • 您的帖子中的 smo 是什么?
  • @RBT: SQL Server 的共享管理对象 - 用于管理服务器及其数据库对象的库
  • SMO 代表 SQL Server 管理对象
  • 好的。请发布您为附加数据库文件而编写的 SMO 的 C# 代码

标签: c# sql-server attachment smo detach


【解决方案1】:

几个观察:

  1. 变量sqlconn2serverconn2s1是不必要的,因为您可以重复使用变量s重新附加ghale数据库
  2. 如果我注释掉将备份文件恢复到 mydb2 的中间部分,则重新附加 ghale 数据库将起作用
  3. 我怀疑您正在将ghale 备份文件恢复到数据库mydb2,如果是这样,请查看数据库属性| mydb2 的文件你会看到它正在使用文件ghale.mdfghale_log.ldf。因此,您无法重新附加 ghale.mdf,因为该文件现在正被数据库 mydb2 使用,因此出现 Access Denied 错误消息。

更新: 我认为以下代码是您想要完成的:

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 以使用不同的物理文件存储数据和日志,并重命名逻辑名称。

【讨论】:

    【解决方案2】:

    试试这个..

    首先要找到你的sqlserver服务账号,在任务管理器中同时按ctrl+alt+delete可以看到;然后,你必须赋予“C:\”的读/写权限Murach\SQL Server 2008\Databases”到服务帐户。

    【讨论】:

    • C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA ...然后右键单击您的数据库 -> 属性 -> 安全选项卡 -> 继续 -> 选择完全控制用户
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多