如何在应用程序仍处于打开状态时将 .mdf 和 .ldf 文件从一个位置复制到另一个位置?

How to copy .mdf and .ldf files from one location to another while the application is still open?

我创建了一个使用 SQL 数据库存储和查询数据的应用程序。一切正常,但问题是备份,经过大量搜索,我找到了两种备份方式。首先,使用命令"use [Database Name] Backup database [Database Name] To Disk='[Backup Location]'。但是这种方法的问题是它需要在机器上安装 SSM 软件,但我不希望安装它,因为它会让用户拥有更多的控制权,然后他需要那个数据库文件,所以如果有人可以给我对此的解决方案真的很有帮助。第二种方法是复制 .mdf 文件和 .ldf 文件,但问题是我不能直接从应用程序复制这些文件,甚至不能在打开应用程序时间接复制这些文件,只有在关闭应用程序时才能复制,但我没有我不想这样,我的主要问题集中在这个问题上。

我的问题。 如何直接从应用程序使用 VB.Net 编码将这些文件从默认位置复制到备份位置而不关闭它?无论如何要关闭与这些文件的连接?

注意:我尝试了 Connection.Close()Connection.Dispose()

好的,在回答问题之前让我先说几句,我们大多数人都知道并在许多网站上看到过 第二种方法(复制 .mdf 和 .ldf 文件)是最不安全的方法,可能会导致严重的问题,第一种方法(使用 Transact-SQL 进行备份/恢复) 更可取、更方便,而且方法更安全。但我想很多人(尤其是像我这样的初学者)会对查询 use [DatabaseName] Backup database [DatabaseName] To Disk='[Backup Location]' 有疑问,因为数据库由两个文件(.mdf 和 .ldf)组成,所以这两个文件如何与这段代码一起使用。我找到的解决方案是将 initial catalog = [DatabaseName] 添加到我的 ConnectionString,检查以下代码:

Dim connectionString As String = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=" + My.Settings.DBLocation + ";initial catalog=InvoiceDB;Integrated Security=True"

Sub Backup_Click()
    With SaveFileDialogue2
        .Title = "Select Backup Location"
        .Filter = "BAK File Only|*.bak"
        .FileName = "Backup " + Format(Now.ToString("dd MMM yyyy"))
        If SaveFileDialogue2.ShowDialog = DialogResult.OK Then
            If .FileName <> "" Then
                Dim BackupQuery As String
                BackupQuery = "Backup database [DatabaseName] To Disk='" + .FileName + "'"
                Using conn As New SqlConnection(connectionString)
                    Using comm As New SqlCommand()
                        With comm
                            .Connection = conn
                            .CommandType = CommandType.Text
                            .CommandText = BackupQuery
                        End With
                        Try
                            conn.Open()
                            comm.ExecuteNonQuery()
                            MsgBox("Backup Completed!", MsgBoxStyle.OkOnly, "Successful")
                            conn.Close()
                        Catch ex As SqlException
                            MessageBox.Show(ex.Message.ToString(), "Error Message")
                        Finally
                            conn.Dispose()
                        End Try
                    End Using
                End Using
            End If
        End If
    End With

End Sub

瞧,它成功了!所以如果其他人有同样的问题,你可以试试这个....

注意:将 [DatabaseName] 更改为您的数据库名称并删除“[ ]”。我将此答案添加到另一个问题,因为它们很相似,因此您可以关注任何人。 Click Here 转到另一个问题。