我正在创建一个Windows桌面应用程序,但我仍然需要SO开发人员的指导。
我的要求:
我的主要要求是创建一个可以将一个系统的数据库复制到另一个系统的Windows窗体应用程序。
见下文。
我到底尝试了什么?
我成功创建备份文件并使用C#在本地系统中恢复它,但现在它只适用于本地系统(系统A )。
我面临哪些问题?
我想用C#实现这一点。 我可以使用共享文件夹处理所有这些,但不建议这样做。
如何访问在另一个LAN系统中生成的备份,因为我们永远无法访问其他系统的目录。我想我可以使用共享文件夹来完成它,但有没有其他方法可以复制备份文件并将其存储在运行我的应用程序的系统中。
如何将备份文件还原到其他LAN系统。据我所知,SQL没有权限从外部本地目录恢复数据库。
有没有其他方法可以实现这种(复制数据库)功能?
任何与流程或任何参考相关的帮助都将受到赞赏。
答案 0 :(得分:5)
您可以将数据库备份创建到远程位置。例如,系统B 将在 System C 的共享文件夹中创建备份。然后,您可以在 System C 上恢复备份。您也可以反过来这样做,在系统B 上创建共享文件夹,在此文件夹中创建备份,并从远程位置恢复 System C 上的备份。
考虑到你想要完成的事情的性质,我假设如下:
D:\TEST\
分享为\\SYSTEM C\TEST\
。如果可以满足所有先前的条件,那么从系统A 中的应用程序,您可以在系统B 上执行以下命令:
BACKUP DATABASE [MyDataBase] TO DISK = N'\\SYSTEM C\TEST\MyDataBase.bak' WITH NOFORMAT, INIT, NAME = N'MyDataBase-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
假设\\SYSTEM C\TEST\
是D:\TEST\
的远程地址(显然在系统C 中),那么,从系统A 中的应用程序,您可以在 System C :
RESTORE DATABASE [MyDataBaseCopy] FROM DISK = N'D:\TEST\MyDataBase.bak' WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 5
这两个命令都可以从SqlCommand个实例,一个connection到系统B ,另一个与系统C 连接
希望它有所帮助。
编辑1
感谢@ PMF的评论指出,可能存在这样的情况,即该解决方案不起作用。如果你遇到这种错误:
Msg 3201, Level 16, State 1, Line 1
Cannot open backup device '\\SYSTEM C\TEST\MyDataBase.bak. Operating system error 5(Access is denied.).
根据您的方案,您可以尝试以下选项之一:
答案 1 :(得分:2)
如果您运行的帐户无法访问这些计算机,但您有另一个管理员帐户...您可以使用模拟(模拟更高权限的帐户)和管理员共享(例如\ servername \ c $来访问一台机器驱动器。我之前使用过这个模拟类...调用其中的更高权限方法https://www.codeproject.com/Articles/10090/A-small-C-Class-for-impersonating-a-User
答案 2 :(得分:2)
而不是备份和恢复,听起来你正试图将数据库从一个服务器复制到另一个服务器。 MSDN上有一个关于如何使用多个选项的完整链接。
您可以考虑在SSIS中构建转移过程(以及您可能希望包括的任何其他步骤,例如数据清理和其他准备工作),然后从您的应用程序本地调用该SSIS包或让应用程序调用SQL代理执行包的任务。
答案 3 :(得分:1)
我的第一直觉当有人说'#34;我想在C#中复制数据库"是:那是95%的可支持性错误的轨道。在DB或OS层中执行此操作。试图在C#中实现这一目标只会增加一大堆开销和可能出错的东西。
它认为你最终想要的是系统C有一个系统B的副本。数据库的术语是复制。特别是如果您希望系统C成为备份数据库,如果系统B出现故障,则最好采用正确的复制/集群方法。 https://en.wikipedia.org/wiki/Replication_(computing)#Database_replication
大多数商业DBMS甚至都支持这种东西,你最好只使用它。 如果你不能使用那些:祝你好运。