我有一个应用程序,检查它是否是最新版本。如果没有,它会使用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? (当我不运行它时,我没有问题)
答案 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
我强烈建议您尝试我建议的第一种方法。