在运行时切换数据库连接

时间:2013-12-10 14:32:17

标签: c# sql-server client-server

我开发了一个应用程序,它针对位于另一台机器上的数据库运行查询(让我们调用il SRV-SQL)。

在某些情况下,应用程序可能无法与数据库计算机通信,因此我的雇主希望我开发一个新模块,该模块能够在现有连接(到SRV-SQL)和本地数据库实例之间的运行时切换(这与数据库机器中的副本完全相同)。

我有几个问题:

  1. 这是检测连接问题的最佳方法,以便我可以触发“事件”以从远程连接切换到区域设置?我需要陷阱SqlException还是有更好的方法?

  2. 有没有办法在不破坏用户操作的情况下在2个环境之间切换?

  3. 第二点不那么简单,因为可以接受注销并要求用户再次登录(即使我会尽量避免它)。

    如果您需要更多信息,请告诉我...对不起,但我无法提供任何代码,因为这是一个设计问题!

    感谢您抽出宝贵时间回答!

1 个答案:

答案 0 :(得分: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));