Asp.net 使用DAAB处理动态连接字符串

Asp.net 使用DAAB处理动态连接字符串,asp.net,enterprise-library,data-access-layer,daab,Asp.net,Enterprise Library,Data Access Layer,Daab,我正在为我们的ASP.NET2.0Web应用程序添加一个数据访问层,该应用程序几乎完全使用内嵌SQL调用和大量使用复制/粘贴来编写。由于业务方面的考虑,我一次只能重新考虑应用程序的一小部分(无法适应并进行大规模的重新设计),因此我不得不接受某些设计决策,直到事情松散耦合到足以进行重大更改并正确测试它们为止 我已经决定使用企业库数据访问应用程序块作为未来数据访问层的管道,以前的一个设计决策给我带来了问题。目前,我们根据用户提供的帐户id从管理数据库获取应用程序的“主”连接字符串,这样我们就可以允许

我正在为我们的ASP.NET2.0Web应用程序添加一个数据访问层,该应用程序几乎完全使用内嵌SQL调用和大量使用复制/粘贴来编写。由于业务方面的考虑,我一次只能重新考虑应用程序的一小部分(无法适应并进行大规模的重新设计),因此我不得不接受某些设计决策,直到事情松散耦合到足以进行重大更改并正确测试它们为止

我已经决定使用企业库数据访问应用程序块作为未来数据访问层的管道,以前的一个设计决策给我带来了问题。目前,我们根据用户提供的帐户id从管理数据库获取应用程序的“主”连接字符串,这样我们就可以允许应用程序的一次安装访问多个数据库。我的问题是试图找出将连接字符串(或帐户id)获取到DAL的最佳实践方法

以前的实现是将加密的连接字符串存储在cookie中,因此我当前的黑客方法是从那里获取连接字符串,然后以以下方式使用DAAB:

Public Shared Function GetResultsByKeywords(ByVal key1 As String, ByVal key2 As String, ByVal key3 As String, ByVal key4 As String) As DataTable
    Dim db As SqlDatabase = New SqlDatabase(Connection.GetConnectString())
    Dim dt As DataTable = New DataTable

    Using dr As IDataReader = db.ExecuteReader("sel_eHELP_ITEMS", key1, key2, key3, key4)
        dt.Load(dr)
    End Using

    Return dt
End Function
其中Connection.GetConnectString()正在从cookie获取连接字符串

我知道这远不是最好的方法,我需要修复它,但我正在努力用“正确”的方法来完成它。也许可以创建一个基类,我可以用连接字符串初始化它,并从中继承所有其他类,但我不确定这会是什么样子,也不确定我首先在哪里初始化该类的实例。在访问任何DAL函数之前,是否在每一页上

任何指导都将不胜感激。多谢各位

更新

让我澄清一下。一个安装最多有3或4个不同的连接字符串。“帐户id”不是用户id,多个用户使用它来指定要连接到哪个数据库。

编辑:

对于您的最新更新,我仍然建议您使用DAAB查看配置

我很难找到/打开entlib文档,但我想看看它是否具有与SqlConnection对象的ChangeDatabase方法等效的方法

这里有一种方法。。由于我认为您的DAL不应该知道您的切换DB需求,所以我将使用ConnectionString作为构造函数的参数来设置您的DAL。使用包装器方法/属性隐藏/封装该需求,并获取要在应用程序中使用的DAL实例

(请原谅这个错误)

公共类MyDAL
{
私有字符串_connectionString;
公共MyDAL(字符串连接字符串)
{
_connectionString=connectionString;
}
公共int MyDatabaseCall()
{
使用(SqlConnection conn=newsqlconnection(_connectionString))
{
使用(SqlCommand cmd=newsqlcommand(“mysql”,conn))
{
conn.Open();
使用(SqlDataReader=cmd.ExecuteReader())
{
//…数据访问
返回0;
}
}
}
}
}
公共类MyApp
{
公共静态字典myDatabases=新字典();
公共字符串GetConnectionString(字符串数据库)
{
返回System.Configuration.ConfigurationManager.ConnectionString[数据库].ConnectionString;
}
public void StartUp()//Global.asax应用程序\u启动?
{
添加(“数据库1”,新的MyDAL(GetConnectionString(“数据库1”));
添加(“数据库2”,新的MyDAL(GetConnectionString(“数据库2”));
添加(“数据库3”,新的MyDAL(GetConnectionString(“数据库3”));
}
公共MyDAL数据访问层
{
得到
{
字符串usersDB=figureOutUserDatabase();
返回myDatabases[usersDB];
}
}
public void UseSomeData()
{
var myData=dataAccessLayer.MyDatabaseCall();
//做事
}
}

希望有帮助,祝你好运!而且要非常小心你放在饼干里的东西

多谢各位。这并不是我最终解决问题的方式,但它仍然说明了我使用的基本概念。Cookie中不再存储连接字符串!
public class MyDAL
{
    private string _connectionString;

    public MyDAL(string connectionString)
    {
        _connectionString = connectionString;
    }

    public int MyDatabaseCall()
    {
        using (SqlConnection conn = new SqlConnection(_connectionString))
        {
            using (SqlCommand cmd = new SqlCommand("my sql", conn))
            {
                conn.Open();
                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    //...data access
                    return 0;
                }
            }
        }
    }
}

public class MyApp
{
    public static Dictionary<string, MyDAL> myDatabases = new Dictionary<string, MyDAL>();

    public string GetConnectionString(string database)
    {
        return System.Configuration.ConfigurationManager.ConnectionStrings[database].ConnectionString;
    }

    public void StartUp() // Global.asax Application_Start ?
    {
        myDatabases.Add("Database1", new MyDAL(GetConnectionString("Database1")));
        myDatabases.Add("Database2", new MyDAL(GetConnectionString("Database2")));
        myDatabases.Add("Database3", new MyDAL(GetConnectionString("Database3")));
    }

    public MyDAL DataAcccessLayer
    {
        get
        {
            string usersDB = FigureOutUsersDatabase();
            return myDatabases[usersDB];
        }
    }

    public void UseSomeData()
    {
        var myData = DataAcccessLayer.MyDatabaseCall();
        //Do Stuff
    }
}