重载数据库连接类?

问题描述:

我在下面的代码中使用下面的类来连接到我的数据库。我将如何(重载?)此类在多个连接字符串(数据库)之间进行选择?重载数据库连接类?

或者我应该为每个连接都有一个单独的类?

public class DataClass 
{ 
    SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["DatabaseName"].ToString()); 

    public DataClass() 
    { 

    } 

    public DataSet ds(SqlCommand cmd) 
    { 
    cmd.Connection = cn; 
    SqlDataAdapter da = new SqlDataAdapter(cmd); 
    DataSet ds = new DataSet(); 
    da.Fill(ds); 
    return ds; 
    } 

//等

谢谢您的输入。

+0

你可能想使用类似http://abstractsql.codeplex.com,以避免编写重复的代码全部 – BlackTigerX 2011-03-09 18:15:26

使用DbProviderFactory,并从web.config中获取提供程序字符串。

一段时间,因为我“已经使用他们(我使用EF或NHibernate的大部分时间现在),但IIRC它是这样的:

string providerName = ConfigurationManager.ConnectionStrings["myconnectionname"].ProviderName; 
DbProviderFactory provider = 
    DbProviderFactories.GetFactory(providerName); 

IDbConnection conn = provider.CreateConnection(); 
IDbCommand command = provider.CreateCommand(); 

您需要使用DbProviderFactoryDbConnectionhave a look into

这听起来像是你DataClass应该承担的IDbConnection

的依赖

为您的数据类的构造函数添加一个IDbConnection参数,并传入您的方法应该访问的数据库的适当连接对象。

你的新代码可能看起来像:

public class DataClass { 

     private IDbConnection cn; 

     public DataClass() 
      : this(new SqlConnection(ConfigurationManager.ConnectionStrings["DatabaseName"].ToString()) {} 

     public DataClass(IDbConnection conn) { 
      cn = conn; 
     } 


     public DataSet ds(SqlCommand cmd) 
     { 
     cmd.Connection = cn; 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     DataSet ds = new DataSet(); 
     da.Fill(ds); 
     return ds; 
     } 
    } 

您可以创建DataFactory类,在这里你将有枚举数据存储和GetConenctionString方法。我正在使用Enterprice库连接到数据库。

public class DataFactory 
{ 
    public enum DataStores 
    { 
     ReadOnly=1, 
     ReadWrite=2, 
     ReadWriteProTest=3 

    } 
    public static string GetConnectionString(DataStores dataStore) 
    { 
     Database currentDatabase = null; 
     switch (dataStore) 
     { 
      case (DataStores.ReadOnly): 
       currentDatabase = DatabaseFactory.CreateDatabase("ReadOnlyDB"); 
       break; 
      case (DataStores.ReadWrite): 
       currentDatabase = DatabaseFactory.CreateDatabase("ReadWriteDB"); 
       break; 
      case (DataStores.ReadWriteProTest): 
       currentDatabase = DatabaseFactory.CreateDatabase("ReadWriteProdTest"); 
       break; 
      default: 
       currentDatabase = DatabaseFactory.CreateDatabase("ReadOnlyDB"); 
       break; 

     } 

     return currentDatabase.ConnectionString; 
    } 
} 

在你的web.config您不同的连接字符串的值:

<connectionStrings> 
    <add name="ReadWriteDB" connectionString="Your connection string"/> 
       <add name="ReadWriteProdTest" connectionString="Your connection string"/> 
       <add name="ReadOnlyDB" connectionString="Your connection string"/> 

我这样做是对我工作的小东西,他们仍然使用ADO.Net我们基本上要删除它,但我们正在慢慢转换应用程序,并作为一个小的解决方法,让事情更顺畅,同时将它抽象出来(我意识到它不是非常干燥,但它现在的工作非常好)。 ConnectionConstant是可能的连接字符串的枚举和ConnectionstringManager使用开关的情况下得到适当的ConnectionString

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Web; 
using System.Data.SqlClient; 

namespace xxx.Data { 
    public static class SqlConnectionManager 
    { 
     public static int ExecuteNonQuery(ConnectionConstant connectionConstant, string sql, params SqlParam[] sqlParameters) 
     { 
      try 
      { 
       var connectionString = ConnectionStringManager.GetConnectionString(connectionConstant); 

       int result; 
      using (var sqlConnection = new SqlConnection(connectionString)) 
      { 
       using (var sqlCommand = new SqlCommand()) 
       { 
        sqlCommand.Connection = sqlConnection; 
        sqlCommand.CommandText = sql; 
        foreach (var parameter in sqlParameters) 
        { 
         sqlCommand.Parameters.Add(parameter.ParameterName, parameter.SqlDbType).Value = (parameter.Value).ToString() == "" ? DBNull.Value : parameter.Value; 
        } 

        sqlConnection.Open(); 

        result = sqlCommand.ExecuteNonQuery(); 
       } 
      } 

      return result; 
     } 
     catch (SqlException sqlException) 
     { 
      throw; 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
    } 

    public static DataTable ExecuteReader(ConnectionConstant connectionConstant, string sql, params SqlParam[] sqlParameters) 
    { 
     try 
     { 
      var connectionString = ConnectionStringManager.GetConnectionString(connectionConstant); 

      var result = new DataTable(); 
      using (var sqlConnection = new SqlConnection(connectionString)) 
      { 
       using (var sqlCommand = new SqlCommand()) 
       { 
        sqlCommand.Connection = sqlConnection; 
        sqlCommand.CommandText = sql; 
        foreach (var parameter in sqlParameters) 
        { 
         sqlCommand.Parameters.Add(parameter.ParameterName, parameter.SqlDbType).Value = (parameter.Value).ToString() == "" ? DBNull.Value : parameter.Value; 
        } 

        sqlConnection.Open(); 

        using(var dataReader = sqlCommand.ExecuteReader(CommandBehavior.CloseConnection)) 
        { 
         result.Load(dataReader); 
        } 
       } 
      } 
      return result; 
     } 
     catch (SqlException sqlException) 
     { 
      throw; 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
    } 

    public static string ExecuteScalar(ConnectionConstant connectionConstant, string sql, params SqlParam[] sqlParameters) 
    { 
     try 
     { 
      var connectionString = ConnectionStringManager.GetConnectionString(connectionConstant); 

      object result = null; 
      using (var sqlConnection = new SqlConnection(connectionString)) 
      { 
       using (var sqlCommand = new SqlCommand()) 
       { 
        sqlCommand.Connection = sqlConnection; 
        sqlCommand.CommandText = sql; 
        foreach (var parameter in sqlParameters) 
        { 
         sqlCommand.Parameters.Add(parameter.ParameterName, parameter.SqlDbType).Value = (parameter.Value).ToString() == "" ? DBNull.Value : parameter.Value; 
        } 

        sqlConnection.Open(); 

        result = sqlCommand.ExecuteScalar(); 
       } 
      } 
      if (result != null) 
       return result.ToString(); 
      else 
       return string.Empty; 
     } 
     catch (SqlException sqlException) 
     { 
      throw; 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
    } 
} 
}