C#数据库包装器设计

Dre*_*teh 3 c# database design-patterns wrapper

我正在为C#设计数据库包装器.以下是我的两个选项:

选项A:

class DBWrapper:IDisposable
{
     private SqlConnection sqlConn;

     public DBWrapper()
     {
            sqlConn = new SqlConnection("my connection string");
            sqlConn.Open();
     }

     public DataTable RunQuery(string Sql)
     {
              implementation......
     }

     public Dispose()
     {
            if(sqlConn != null)
                   sqlConn.Close();
     }
}
Run Code Online (Sandbox Code Playgroud)

选项B:

class DBWrapper
{
     public DBWrapper()
     {            
     }

     public DataTable RunQuery(string Sql)
     {
             SqlConnection sqlConn = new SqlConnection("my connection string");
             .....implementation......
             sqlConn.Close();               
     }   
}
Run Code Online (Sandbox Code Playgroud)

对于选项,在实例化类时打开连接.因此,无论调用者调用RunQuery多少次,连接始终都准备就绪.但是如果应用程序在应用程序的早期实例化DBWrapper,那么在应用程序完成之前,连接将被打开并且什么都不做.此外,它可以在执行期间实例化许多DBWrapper.所以,这有点浪费资源.

对于选项B,它没有选项A具有的问题,但每次调用者调用RunQuery时都必须打开和关闭新连接.我不确定它会对性能有多大影响.

请分享您的专长.谢谢你的阅读.

Phi*_*ipp 6

出于性能原因,你肯定不想选择B(至少在我遇到的情况下).让我建议选项C:

class DBWrapper:IDisposable { private SqlConnection sqlConn;

public void EnsureConnectionIsOpen()
{
    if (sqlConn == null)
    {
      sqlConn = new SqlConnection("my connection string");
      sqlConn.Open();
    }

}

public DataTable RunQuery(string Sql)
{
    EnsureConnectionIsOpen();
    implementation......
}

public Dispose()
{
   if(sqlConn != null)
              sqlConn.Close();
}

} 
Run Code Online (Sandbox Code Playgroud)

您可以考虑使用单例模式来确保只有一个DBWrapper实例.