0

我有一个应用程序可以检查它是否是最新版本。如果没有,它会通过使用File.Copy新的数据库替换附加到应用程序的数据库来更新自身(可能已经或可能没有对其进行更改)。为了防止数据被删除,我创建了一个备份系统,该系统在删除数据库之前将所有数据写入 XML 文件,并在复制数据库后恢复数据。

但是,我遇到了该File.Copy方法的问题,因为弹出一个错误告诉我.MDF正在被另一个进程使用。

有人告诉我停止 SQL Server 会起作用,但它没有。我也被告知我可以使用 SMO,但也无法做到这一点。由于这看起来如此接近完成,SMO 似乎也没有必要了。

我的代码是这样的:

'This is the backup. I make sure to close the SQL Connection when the process is complete.

        Dim db As String = "C:\ACE DB\localACETest.mdf"
        Dim dbLog As String = "C:\ACE DB\localACETest_log.ldf"

        If File.Exists(db) = True Then
              'Backup process
              '...
        End If


       '"Data/localACETest.mdf" referenced below is the file located inside of my application that is used to overwrite the other MDF; it is NOT the .MDF I'm looking to replace.

       Directory.CreateDirectory("C:\Random Directory\")
       File.Copy("Data/localACETest.mdf", db, True) 'This is the line where I get the error
       File.Copy("Data/localACETest_log.ldf", dbLog, True)
       success = False
       ...

编辑: 我已将问题缩小到备份我的数据的方法。我正在使用以下连接字符串:

Private Const _sqlDB As String = "Data Source=(localdb)\v11.0;Initial Catalog=localACETest;Integrated Security=True; _
AttachDbFileName=C:\ACE DB\localACETest.mdf"

我打开 SQL,运行一个命令,然后关闭它:

Using connection = New SqlConnection(_sqlDB)
            connection.Open()
            ...
            connection.close()

为什么这不会从流程中释放 MDF?(当我不运行它时,我没有问题)

4

1 回答 1

0

您最好向 SQL Server 发送命令,告诉它为您进行备份。这篇 SO 文章有一个很棒的(命令行)脚本,您可以复制/粘贴: SQL Server 命令行备份语句

将其放入批处理并像这样启动它。

System.Diagnostics.Process.Start("C:\Ace Db\MakeADBBackup.bat")

如果您希望让程序等到备份完成,请阅读有关启动过程的信息:http: //support.microsoft.com/kb/305368


如果您真的坚持要制作 .mdf 的副本(这不是一个好主意),那么您需要在制作副本之前要求服务器停止 SQL 服务。你可以运行一个批处理,上面写着

NET STOP MSSQLSERVER

假设您的 SQL Server 在名称“MSSQLSERVER”下运行。要检查正在运行的服务的名称,请打开命令提示符并输入“NET START”。它将给出正在运行的服务列表。其中之一将是 SQL Server 正在运行的服务的“进程名称”。

更好的是,这里有一篇文章(针对 VB.NET)显示了启动/停止 SQL Server 的源代码。 http://msdn.microsoft.com/en-us/library/ms162139(v=SQL.90).aspx

我强烈建议您尝试我建议的第一种方法。

于 2013-08-21T17:20:55.853 回答