2013-12-10 179 views
0

我開發了一個應用程序,該應用程序針對位於另一臺機器上的數據庫運行查詢(我們稱之爲il SRV-SQL)。在運行時切換db連接

在某些情況下,應用程序可能無法與數據庫計算機通信,所以我的僱主希望我開發一個新模塊,該模塊能夠在現有連接(到SRV-SQL)到本地數據庫實例(這是數據庫機器中的一個副本)。

我有一個關於這幾個問題:

  1. 這是爲了檢測連接問題,這樣我就可以觸發一個「事件」,從該區域設置一個遠程連接切換的最佳方式?我需要陷阱SqlException還是有更好的方法?

  2. 有沒有什麼辦法可以在不破壞用戶操作的情況下在兩種環境之間切換?

第二點不是微不足道的,因爲它是可以接受的註銷,並要求用戶再次登錄(即使我會盡量避免它)。

如果您需要更多信息,請讓我知道...另外,很抱歉,由於這是一個設計問題,我無法提供任何代碼!

感謝您花時間回答!

+0

你有什麼打算時,你的數據在2個數據庫蔓延呢? – Matthew

+0

本地數據庫中的數據將從另一個負責該特定任務的模塊複製到主數據庫。 – andreapier

+0

有一些像故障轉移這樣的服務,但這是針對企業場景的,我認爲您最初想到的「SqlException」可能會起作用,但您應該嘗試將其從應用程序中提取出來。 – Matthew

回答

1

從應用程序的其餘部分中抽取出可能存在多個數據庫的事實是很好的做法。

public class WidgetRepository 
{ 
    private readonly string _primaryConnectionString; 
    private readonly string _secondaryConnectionString; 

    public WidgetRepository(string primaryConnectionString, string secondaryConnectionString) 
    { 
     _primaryConnectionString = primaryConnectionString; 
     _secondaryConnectionString = secondaryConnectionString; 
    } 

    public void AddWidget(Widget widget) 
    { 
     ExecuteAction(AddWidgetAction(widget)); 
    } 

    public void UpdateWidget(Widget widget) 
    { 
     ExecuteAction(UpdateWidgetAction(widget)); 
    } 

    private Action<string> AddWidgetAction(Widget widget) 
    { 
     return Action<string>(connectionString => { 
      using (var connection = new SqlConnection(connectionString)) 
      { 
       connection.Open(); 

       using (var command = connection.CreateCommand()) 
       { 
        command.CommandText = "INSERT INTO Widgets(name, price) VALUES(@name, @price)"; 
        command.Parameters.AddWithValue("@name", widget.Name); 
        command.Parameters.AddWithValue("@price", widget.Price); 
        command.ExecuteNonQuery(); 
       }   
      } 
     }); 
    } 

    private Action<string> UpdateWidgetAction(Widget widget) 
    { 
     // Logic here to update a widget 
    } 

    private void ExecuteAction(Action<string> action) 
    { 
     try 
     { 
      action(_primaryConnectionString); 
     } 
     catch (SqlException) 
     { 
      action(_secondaryConnectionString); 
     } 
    } 
} 

用法:

var widgetRepository = new WidgetRepository("dbconn1", "dbconn2"); 

widgetRepository.AddWidget(new Widget("Cog", 15.99m)); 
+0

很好!我想我會試試這個。當然,我想抽象,因爲我不希望我的應用程序知道它是否連接到特定的提供者。謝謝 – andreapier