如何以编程方式将SQL Server数据库(localdb)从一台计算机移动到另一台计算机

时间:2013-12-18 21:10:17

标签: c# sql sql-server sql-server-2012 localdb

根据以下参考文档,我希望移动一个SQL Server Express数据库(在vs2013中创建localdb)。

How to move a localdb from one machine to another manually

但是,操作需要在我的wpf c#应用程序中完全自动化。

我想要实现的是(更新):

  1. 初始应用程序实施(目前最重要的) - >

    安装应用程序时,需要将数据库安装/复制到用户计算机,理想情况下,数据库需要打包在zip或安装程序文件中,以便在安装应用程序时可以轻松地将其传输到用户计算机,或者我对任何更好的想法持开放态度?

  2. 保持最新状态 - >应用程序需要能够将localdb中的数据导出并导入到本地网络共享上的sql数据库文件中。这可能需要合并数据。

  3. 是否通过c#代码或sql脚本完成(如果脚本请告知如何从c#运行脚本)一个最好怎么能实现这个目标?

    提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

基于你的问题,你试图简单地将数据库从一台机器转移到另一台机器上吗?您需要考虑一些变量,例如,您是否需要创建数据库?应用程序如何与每台机器对话?还需要考虑其他几个变量;然而,我很可能采取的路线是创建一个理想的网络服务。

Web服务允许您决定是将本地数据库拉到服务器,还是将服务器拉到本地计算机,或者是否需要任何要求。

如果没有这些要求,任务就变得困难。但是,如果你在较小的范围内考虑你的问题,那就很清楚了。

  1. 验证主数据库是否存在
  2. 发出命令以进行备份
  3. 创建新数据库
  4. 验证新创建的数据库是否存在
  5. 运行命令以恢复备份
  6. 这基本上就是你需要完成的所有事情,一个班级就可以做到。

    您需要为此调用的方法创建逻辑;但是想在同一台机器上做你的要求;这与您的要求没有什么不同。

    if(IsDatabaseInExistence(server.TemplateName) == true)
         CreateSQLDatabase(customer.WebAddress);
    
    if(IsDatabaseInExistence(customer.WebAddress) == true)
         RestoreSQLDatabase(server.TemplateName, customer.WebAddress);
    

    一种获取参数的方法,然后调用几个私有方法,您就完成了任务。在您完成任务时,尝试使用parameters,如果您发出原始SqlCommand,则可以使其易受 SQL注入的攻击。<​​/ p>

    糟糕的做法:

    using(SqlConnection connectionForSQL = new SqlConnection(@"Server=localhost; Integrated Security=SSPI; Database=master"))
    {
         string restoreSQLDb =
               "RESTORE FILELISTONLY FROM DISK='C:\\Program Files\\Microsoft SQL Server\\MSSQL11.MSSQLSERVER\\MSSQL\\Backup\\" + templateName + ".bak'"
               + "RESTORE DATABASE [" + webAddress + "] FROM DISK='C:\\Program Files\\Microsoft SQL Server\\MSSQL11.MSSQLSERVER\\MSSQL\\Backup\\" + templateName + ".bak'"
               + "WITH " 
               + "MOVE 'Parent' TO 'C:\\Program Files\\Microsoft SQL Server\\MSSQL11.MSSQLSERVER\\MSSQL\\DATA\\" + webAddress + ".mdf',"
               + "MOVE 'Parent_log' TO 'C:\\Program Files\\Microsoft SQL Server\\MSSQL11.MSSQLSERVER\\MSSQL\\DATA\\" + webAddress + "_log.ldf',"
              + "REPLACE";
    
              using(SqlCommand restoreDbCommand = new SqlCommand(restoreSQLDb, connectionForSQL))
              {
                   connectionForSQL.Open();
                   restoreDbCommand.ExecuteNonQuery();
              }
    }
    

    此外,我忘记发布备份方法的示例,但您明白了。

    但是我认为你的问题是从一台机器到另一台机器。我会研究 Windows Communication Foundation Services(WCF)。这应该提供与另一台机器通信的灵活性,并完成各种任务。

    不幸的是,我没有确切的要求,所以它真的很难帮助你。

    希望这会指出你正确的方向。