【问题标题】:Handling a dynamic Connection String with DAAB使用 DAAB 处理动态连接字符串
【发布时间】:2010-10-24 08:34:25
【问题描述】:

我正在为我们的 ASP.Net 2.0 Web 应用程序添加数据访问层,该应用程序几乎完全使用内联 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,它被多个用户用来实质上指定要连接到哪个数据库。

【问题讨论】:

    标签: asp.net enterprise-library data-access-layer daab


    【解决方案1】:

    编辑:

    对于您的最新更新,我仍然建议使用 DAAB 查看配置 http://davidhayden.com/blog/dave/archive/2006/01/23/2744.aspx

    我很难找到/打开 Ent Lib 文档,但我想看看它是否具有 SqlConnection 对象的 ChangeDatabase 方法的等效项。 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.changedatabase.aspx

    这是一种方法。由于我认为您的 DAL 不应该了解您的切换数据库要求,因此我将使用 ConnectionString 作为构造函数的参数来设置您的 DAL。使用包装方法/属性来隐藏/封装该要求并获取您想在应用中使用的 DAL 实例。

    (请原谅c#)

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

    希望对您有所帮助,祝您好运!并且要非常小心放入 cookie 中的内容。 ;)

    【讨论】:

    • 谢谢。这并不是我最终解决问题的方式,但它仍然说明了我使用的基本概念。 cookie 中不再存储连接字符串!
    猜你喜欢
    • 2011-12-11
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    相关资源
    最近更新 更多