[英]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();
等等
您需要使用DbProviderFactory
和DbConnection
, 看看
這聽起來像您的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.