2

这是一个有点奇怪,但我想检查是否已连接到我的数据库已打开或没有?我如何检查?如果打开,我希望能够直接使用它,而无需通过所有语句:使用已经打开的数据库连接

sqlconnection conn = new sqlconnection("string ..."); 

可以这样做吗?我也知道连接字符串和连接名称。我想检查这个连接是否可用,然后继续。

回答

8

如果你知道在连接字符串,然后获取一个新的可用SQL连接的最简单的方法是创建SqlConnection类的新实例:

using (SqlConnection conn = new SqlConnection("MyConnectionString")) 
{ 
    conn.Open(); 
    // Use the connection 
} 

.NET框架使用连接池和因此没有必要担心开口效率&多个连接 - 在上面的代码将是重新使用可用的现有的连接,或者根据需要创建一个新的。

如果你想自己节省一些打字,那么你可能会发现它很有用自己创建一个小的辅助方法或属性:

class SqlHelper 
{ 
    public static SqlConnection GetConn() 
    { 
     SqlConnection returnValue = new SqlConnection("MyConnectionString"); 
     returnValue.Open(); 
     return returnValue; 
    } 
} 

用法:

using (SqlConnection conn = SqlHelper.GetConn()) 
{ 
    // Use the connection 
} 
+0

谢谢Kragen。我担心打开已经打开的连接。我不知道.NET的'重用'属性。 – zack 2010-10-22 15:33:42

+0

非常有用的答案,我没有什么是连接池,并打算创建一个机制自己! – Jack 2015-08-24 19:03:38

2

你看着为SqlConnection的文件?

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx

我相信,“国家”属性会告诉你想要的东西。

如果要问,而更普遍了如何使用从连接池中现有的连接,这将时自动创建一个相同的连接字符串作为有效连接的新的SqlConnection来完成。

如果你只是想避免编写冗余代码,然后把它放在一个类和重用。

1

虽然你可能只使用SQL Server可能是很好的做法,以熟悉,因为所有数据提供者实现他们System.Data所有的核心接口。我相信State财产上IDbConnection返回你所要求的(IDbConnection

你也可能想要隐藏某种集中的方法是逻辑的信息:

public static IDbConnection RetrieveConnection(){ 
    if(DataAccess.Connection.State == ConnectionState.Open) return DataAccess.Connection; 

    conn.Dispose(); //to be clean, I believe this is safe if it's already disposed 
    //retrieve configured connection string 
    //create and open connection 
    return DataAccess.Connection; 
} 

所以也许DataAccess是一些地方,你可以放置和检索你的连接对象,但我会避免让每个人都直接使用它。而是让他们通过可以确保连接可用的方法。我只是想给你提供一些想法。你

可能还需要采取这一步,使用类似的NHibernate将管理你的连接和所有的东西。尽管如果项目很小,这并不总是值得的。

编辑:取得的代码更明确的

+0

谢谢。在这里我应该用我的connectionstringName替换conn吧? – zack 2010-10-22 15:25:52

+0

哦,我实际上使用'conn'作为IDbConnection变量。我将更新变量名称。我试图表明,也许你有可能活连接挂在一些单身人士或缓存,这种方法知道。这样你所有的代码都可以使用这种方法,它可以检查并可能建立/打开连接。 – 2010-10-22 15:31:06

+0

我得到了我的答案。感谢分享这个虽然:) – zack 2010-10-22 15:32:52

1

Façade设计模式应该帮助你在这里。这是一个例子。

  1. Façade Pattern (wikipedia);
  2. Façade Design Pattern (Gang of Four)

一个“智能”门面知道什么方法需要连接到哪里,等等。门面打开连接,并将其传递给底层代码,通常包含在工厂类或类似的东西。

public class DoSomethingFacade { 
    private static readonly DoSomethingFactory _doSomethingFactory = new DoSomethingFactory(); 

    public static IList<T> GetList<T>() { 
     using(IDbConnection connection = OpenConnection("string...")) 
      return _doSomethingFactory.GetList<T>(connection); 
    } 

    public static IDbConnection OpenConnection(string connectionString) { 
     IDbConnection openedConnection = new SqlConnection(connectionString); 
     openedConnection.Open(); 
     return openedConnection; 
    } 
} 

internal class DoSomethingFactory { 
    internal DoSomethingFactory() { } 

    internal IList<T> GetList<T>(IDbConnection connection) { 
     IList<T> results = new List<T>(); 

     // use connection here without caring about it, 
     // as it should be provided as an opened available connection. 

     return results; 
    } 
} 
相关问题