2011-04-05 129 views
0

嗨什么是部署数据库脚本到我的客户端PC的最佳方式?我已经安装了应用程序,并在客户端电脑上安装了SQL管理工作室。除了当我需要更新数据库时,一切都很顺利。我如何更新数据库,而不必让我去他们的电脑上运行.sql更新脚本。这个问题适用于我的应用程序在其他国家使用。如何部署数据库

对于更新代码是好的,因为我使用ClickOnce。 这是一个基于窗口的应用程序。

请帮

+0

我想你应该阐明情况的一些情况。这是客户端服务器应用程序吗?你是否分享开发环境? – Peter 2011-04-05 13:59:51

+0

opss ..我忘了提及它是一个基于窗口的应用程序。数据库安装在客户端PC上。 – VeecoTech 2011-04-05 14:05:23

+0

因此,每个使用该应用程序的客户端都需要安装SQL Server实例?你知道你可以集中你的SQL Server,所以每个客户端连接到相同的? – Peter 2011-04-05 14:07:33

回答

2

我会附带应用程序中的SQL文件,并有一个总是检查其他地方进行了需要运行的脚本程序启动逻辑。它可以像检查所有.sql文件的[应用程序路径] \ MigrationScripts文件夹一样简单。如果找到文件,请阅读内容并针对数据库执行。

一旦检查(和潜在的数据库更新)完成,继续加载应用程序。

示例代码(未经测试),和一个非常基本的实现:

public class Migration 
{ 
    private string _migrationPath = @"C:\temp\MigrationSteps"; //change 
    private string[] _sqlFiles = null; 

    public Migration() 
    { 
     Initialize(); 
    } 

    public Migration(string path) 
    { 
     _migrationPath = path; 
     Initialize(); 
    } 

    private void Initialize() 
    { 
     _sqlFiles = Directory.GetFiles(_migrationPath, "*.sql"); 
    } 

    public bool Run() 
    { 
     bool success = true; 

     foreach (string sqlFile in _sqlFiles) 
     { 
      ExecuteRun(File.ReadAllText(sqlFile)); 
     } 

     return success; //Do something with this value 
    } 

    public bool CleanUp() 
    { 
     //Put some logic here to "clean up" files that have already been run. 
     throw new NotImplementedException(); 
    } 

    private bool ExecuteRun(string sqlText) 
    { 
     //Call your data access library and execute the sqlText 
     throw new NotImplementedException(); 
    } 
} 

用法:

Migration migration = new Migration(); 
if (migration.Run()) 
{ 
    migration.CleanUp(); 
} 
else 
{ 
    //Do something 
} 
+0

@BrandonZeider:这听起来不错。我可以在我的项目中创建一个新文件夹调用MigrationScripts,并将这些更新数据库脚本放在该文件夹中。但是,我应该在哪里编写检查脚本来检查MigrationScript文件夹中的所有.sql文件?你能提供一些代码示例吗? – VeecoTech 2011-04-05 14:18:06

+0

你会把逻辑放在你的Main入口点。你使用闪屏吗?我将用一些代码更新我的答案以检查sql文件。 – BrandonZeider 2011-04-05 14:27:59

+0

@BrandonZeider:这听起来不错。让我试试看,我会回到你身边。我想我需要为此设置一个启动画面。一个问题 - 当我调用ExecuteRun()来运行sql脚本时,是否需要输入Sql用户名和密码来运行这些脚本? – VeecoTech 2011-04-05 14:46:47