如何在Windows应用程序中使用singleton类进行数据库连接

时间:2014-04-15 10:48:11

标签: c# winforms singleton database-connection global

在我的Windows应用程序中,我正在使用Access数据库。应用程序启动时应该打开连接。我使用连接字符串来调用过程/存储的查询并访问数据。连接应该打开,直到应用程序退出。

我被要求使用singleton课程。请帮我看看如何使用singleton类进行数据库连接。

1 个答案:

答案 0 :(得分:2)

要直接使用单例,您必须从连接对象继承,这对于OleDbConnection是不可能的(因为它是密封的)。因此,您必须编写一个类,其公共属性公开连接本身,并使该包装类成为单例。

然而,唯一的目标是拥有一个连接实例,你可以使用'Lazy'结构,这是线程安全的(就此而言,即使在单例中,我也会使用Lazy或LazyInitializer为线程做好准备)

public static class Data    
{
    public static readonly Lazy<OleDbConnection> Connection = new Lazy<OleDbConnection>(CreateConnection); //(using System.Threading)

    static OleDbConnection CreateConnection()
    {
        var conn = new OleDbConnection("YourConnectionString");
        //etc
        conn.Open();
        return conn;
    }
}

获得连接将是这样的:

var conn = Data.Connection.Value;

然后,再次,如果你要包含一个封装所有连接调用的类,那对于单例来说就是一个完美的例子

* edit **使用单一连接的示例,带有reset *

    public static class Data   
{
    static OleDbConnection conn;
    public static OleDbConnection Connection
    {
        get
        {
            if (conn == null)
                LazyInitializer.EnsureInitialized(ref conn, CreateConnection);
            return conn;
        }
    }

    static OleDbConnection CreateConnection()
    {
        if (strDataFilePath == null)
            throw new Exception("Datafile paths is not set");
        //build connection, using strDataFilePath
        var conn = new OleDbConnection("YourConnectionStringWithDataFilePath"); 
        //other settings

        //open
        conn.Open();
        return conn;
    }

    static string strDataFilePath;

    public static string DataFilePath
    {
        get { return strDataFilePath; }
        set
        {
            if(strDataFilePath==value)return;
            strDataFilePath = value;
            if(conn!=null){
                conn.Close(); //NB, no checks were added if the connection is being used, but if the value is only set on startup or idle moments, this should be ok for the example.
                conn.Dispose();
                conn=null; //conn is reset, and (re)created the next time Connection is called
            }
        }
    }
}

初始化:

Data.DataFilePath = ".....";

使用连接:

var conn = Data.Connection; //Connection is created and opened on first call