2011-04-05 398 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