在VB.NET中发布.MDF文件

时间:2013-08-20 00:15:35

标签: sql sql-server vb.net

我有一个应用程序,检查它是否是最新版本。如果没有,它会使用File.Copy更新自身,以使用新的DB替换附加到应用程序的数据库(可能已经或可能没有对其进行更改)。为了防止数据被删除,我创建了一个备份系统,在删除数据库之前将所有数据写入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? (当我不运行它时,我没有问题)

1 个答案:

答案 0 :(得分:0)

最好向SQL服务器发送命令,告诉它为您做备份。这篇SO文章有一个很棒的(命令行)脚本,你可以复制/粘贴: SQL Server command line backup statement

将其放入批处理中,然后像这样启动它。

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

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