【问题标题】:work with an already open database connection使用已经打开的数据库连接
【发布时间】:2010-10-22 15:15:00
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# sql-server visual-studio-2010 database-connection sqlconnection


    【解决方案1】:

    如果您知道连接字符串,那么获取新的可用 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
    }
    

    【讨论】:

    • 感谢克拉根。我担心打开一个已经打开的连接。我不知道 .NET 的“重用”属性。
    • 非常有用的答案,我不知道什么是连接池,而是要自己创建一个机制!
    【解决方案2】:

    您查看过 SqlConnection 的文档吗?

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

    我相信“State”属性会告诉你你想要什么。

    如果您更一般地询问如何使用连接池中的现有连接,这将在您创建具有与活动连接相同的连接字符串的新 SqlConnection 时自动完成。

    如果您只是想避免编写冗余代码,那么请将其放入一个类中并重用它。

    【讨论】:

      【解决方案3】:

      虽然您可能只是使用 SQL Server,但熟悉 System.Data 中的所有核心接口可能是一个好习惯,因为所有数据提供者都实现了它们。我相信IDbConnection 上的State 属性会返回您要求的信息(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 之类的东西来为您管理连接和所有这些东西。虽然如果项目很小,这并不总是值得付出努力。

      编辑:使代码更加明确

      【讨论】:

      • 谢谢。在这里我应该用我的 connectionstringName 替换 conn 对吗?
      • 哦,我实际上是使用conn 作为 IDbConnection 变量。我将更新变量名称。我试图表明,也许您在此方法知道的某个单例或缓存中可能存在实时连接。这样,您的所有代码都可以仅使用此方法,并且可以进行检查并可能建立/打开连接。
      • 我得到了答案。不过感谢分享这个:)
      • 这样做的目的是允许某人全局使用连接对象吗?这不是一个好的做法,因为它会导致应用程序一直保持连接打开,甚至可能在实践中导致稳定性问题。您应该为针对服务器的每个操作打开和关闭连接。只要您没有竭尽全力禁用连接池,这样做就不会低效。
      • 这真的取决于你在做什么以及你如何管理交易。理想情况下是的,您将利用连接池并每次都关闭连接,但如果代码中的多个位置需要在单个事务中工作,您将希望能够访问当前的活动连接。尽管这可能是让 NHibernate 之类的东西为您担心所有这些事情变得值得疯狂的地方。
      【解决方案4】:

      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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-26
        • 2012-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多