在数据库连接错误时自动切换连接字符串

时间:2012-09-21 13:10:23

标签: sql-server entity-framework sql-server-ce database-connection connection-string

我正在使用DbContext处理带有EntityFramework主干的C#应用​​程序。 该应用程序有两种选择:连接到远程SQL Server express或连接到本地SQL compact 4.0数据库,以防网络连接不可用。 当我的应用程序启动时,一个线程正在检查是否可以连接到远程数据库。否则,它自动需要切换连接字符串和提供程序以连接到本地数据库。 到目前为止,我试图通过修改app.config中的连接字符串部分来处理这个问题,并在保存配置后强制应用程序刷新该部分。这种方法不是最好的,因为我需要具有写入app.config文件的访问权限。 你能建议一个更好的方法吗?

2 个答案:

答案 0 :(得分:2)

在类中包装连接字符串的管理,使该类成为单例,并使用它来获取活动连接字符串,如下所示:

public delegate void ConnectionChangedEventHandler(object sender, EventArgs e);

class ConnStringManager {
    static public ConnStringManager Instance {get;private set;}
    static {
        Instance = new ConnStringManager();
    }
    public event ConnectionChangedEventHandler Changed;
    private readonly string localConn;
    private readonly string remoteConn;
    public string ConnectionString {get; private set;}
    private ConnStringManager() {
        localConn = ... // Get local connection string from the config
        remoteConn = ... // Get remote connection string from the config
        TestAndSetConnectionString();
    }
    public void TestAndSetConnectionString() {
        bool canUseRemote = true;
        if (...) {
             // Do some testing to see if remote DB is accessible
        }
        // Switch the connection string
        var nextString = canUseRemote ? remoteConn : localConn;
        bool changed = nextString != ConnectionString;
        ConnectionString = nextString;
        if (changed && Changed != null) {
             Changed(this, EventArgs.Empty);
        }
    }
}

答案 1 :(得分:0)

DbContext构造函数接受连接字符串的名称或您要选择的实际连接字符串。

你可以做的是测试你的初始连接字符串 - 可能是快速的ado连接或简单的东西,然后如果它连接使用它,否则使用你的另一个连接。

一些伪代码:

        YourDbContext YourContext;
        if (TestConnection())
        {
            YourContext = new YourDbContext("ConnectionString1");
        }
        else
        {
            YourContext = new YourDbContext("ConnectionString2");
        }