簡體   English   中英

重載數據庫連接類?

[英]Overload Database Connection Class?

我在后台代碼中使用下面的類連接到數據庫。 我如何(超載?)這個類在多個連接字符串(數據庫)之間進行選擇?

還是應該為每個連接單獨設置一個類?

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

//等

謝謝您的意見。

利用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();

等等

您需要使用DbProviderFactoryDbConnection看看

這聽起來像您的DataClass應該依賴於IDbConnection的依賴DataClass

將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類,在該類中將具有枚舉DataStores和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使用開關大小寫來獲取適當的連接字符串

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM