Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在VB.NET中释放.MDF文件_Sql_Sql Server_Vb.net - Fatal编程技术网

Sql 在VB.NET中释放.MDF文件

Sql 在VB.NET中释放.MDF文件,sql,sql-server,vb.net,Sql,Sql Server,Vb.net,我有一个应用程序,检查它是否是最新版本。如果没有,它将使用File.Copy更新自身,以用新的数据库替换附加到应用程序的数据库(可能有或可能没有对其进行更改)。为了防止数据被删除,我创建了一个备份系统,在删除数据库之前将所有数据写入XML文件,并在复制数据库后恢复数据 但是,File.Copy方法有问题,因为弹出一个错误,告诉我另一个进程正在使用.MDF 我被告知停止SQL Server会起作用,但事实并非如此。我还被告知我可以使用SMO,但我也无法做到这一点。随着这项工作看起来如此接近完成,S

我有一个应用程序,检查它是否是最新版本。如果没有,它将使用
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?(当我不运行它时,我没有问题)

您最好向SQL server发送一个命令,告诉它为您进行备份。本文提供了一个很好的(命令行)脚本,您可以复制/粘贴:

把它放进一批,然后像这样启动它

System.Diagnostics.Process.Start("C:\Ace Db\MakeADBBackup.bat")
如果希望让程序等待备份完成,请阅读有关启动过程的信息:


如果您确实坚持要复制.mdf(这不是一个好主意),那么您需要在复制之前要求服务器停止SQL服务。您可以运行一个批处理,其中

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

更好的是,这里有一篇文章(针对VB.NET)显示了启动/停止SQL Server的源代码


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

您不能,也不应该一开始就复制
.mdf
文件!SQL Server已定义了执行此操作的过程-使用备份/还原机制(在源上创建备份
.bak
文件,在目标上还原)或使用分离/附加方法。但在任何情况下,都不要试图在SQL Server背后复制文件!那肯定是灾难的导火索别这样!解释一下为什么会在这里接待我。MDF文件是一个我知道细节的文件,只有我的应用程序才能访问它。千万不要这样杀死SQL Server进程。使用服务管理API停止服务。疯子谢谢你的评论。我已经摆脱了进程终止,但我仍然无法解决这个问题。出于某种原因,我使用SQL连接备份数据库的方法没有完全释放MDF,尽管在方法结束时确保关闭连接。备份不会释放.MDF。。。它将简单地创建一个.bak。你还是完全错了。还原/备份或附加/分离类似于前面所述。感谢您的评论。我的问题是:如何备份所有SQL数据,以便在更新应用程序的数据库(例如更新的特定表)时,可以将其(数据)恢复到新数据库中。我意识到,通过调整表,我可能会产生问题,但是,假设我正在编辑的表不会受到重新插入的影响,我如何才能做到这一点?许多人发现,进行备份,然后以不同的名称还原数据库很有用。然后他们可以根据需要复制数据(并且他们有备份,以防出错)。表也可以这样做(顺便说一句,SSMS就是这样做的)。与其替换表,不如重命名它。然后创建一个新的并将数据复制回。如果事情变坏了,撤销就更容易了。但是,在进行任何操作之前,请先进行DB备份!