分离本地数据库.mdf,复制,附加新文件

时间:2016-12-18 04:21:18

标签: c# sql-server local detach

我试图分离我的本地数据库.mdf将其复制到另一个文件夹中并在启动时附加新文件并在关闭时复制到旧文件夹。

它似乎在启动时有效,但我在关闭表单时出错:

  

该进程无法访问文件' C:\ ProgramData \ MyData \ db1.mdf'因为它正被另一个进程使用。

那是我的代码:

    public Form()
    {
        InitializeComponent();
        DetachDatabase();
        CopyDb();
        AttachDatabase();
        AppDomain.CurrentDomain.SetData("DataDirectory", Data.MyNewFolder);    
    }


    public static bool DetachDatabase()
    {
        try
        {

            string connectionString = String.Format(@"Data Source=(LocalDB)\v11.0;Initial Catalog=master;Integrated Security=True");
            using (var cn = new SqlConnection(connectionString))
            {
                cn.Open();
                SqlCommand cmd = cn.CreateCommand();
                cmd.CommandText = String.Format("exec sp_detach_db '{0}'", "db1");
                cmd.ExecuteNonQuery();
                cmd.CommandText = String.Format("exec sp_detach_db '{0}'", "db2");
                cmd.ExecuteNonQuery();
                return true;
            } 
        }
        catch
        {
            return false;
        }
    }

    public static bool AttachDatabase()
    {
        try
        {
            string connectionString = String.Format(@"Data Source=(LocalDB)\v11.0;Initial Catalog=master;Integrated Security=True");
            using (var cn = new SqlConnection(connectionString))
            {
                cn.Open();
                SqlCommand cmd = cn.CreateCommand();
                cmd.CommandText = String.Format("exec sys.sp_attach_db    db1,    'db1.mdf'");
                cmd.CommandText = String.Format("exec sys.sp_attach_db    db2,    'db2.mdf'");
                cmd.ExecuteNonQuery();
                return true;
            }
        }
        catch
        {
            return false;
        }
    }

    private void Frm_FormClosing(object sender, FormClosingEventArgs e)
    {
        LocalDB.DetachDatabase();
        CopyDb();
        LocalDB.AttachDatabase();
    }

这样做的好方法是什么?

由于

1 个答案:

答案 0 :(得分:3)

您需要切换到> l $`1` [1] 1 2 $`2` [1] 2 3 $`3` [1] 3 4 并使目标数据库脱机

警告:使用风险自负(例如,您可以使用master吗?)

WITH ROLLBACK IMMEDIATE

var commandText = string.Format(@" USE MASTER; ALTER DATABASE {0} SET OFFLINE WITH ROLLBACK IMMEDIATE; EXEC sp_detach_db '{0}', 'true';", "db1"); 的第二个参数只是避免统计更新(会更快)

您现在可以安全地从原始位置移动sp_detach_dbmdf个文件

假设您的数据库已经离线且您已将ldf文件移至db1.mdf,我认为您可以执行此操作(我没有测试它,请注意

D:\Whatever