首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DAAB处理动态连接字符串

使用DAAB处理动态连接字符串
EN

Stack Overflow用户
提问于 2009-05-06 23:51:02
回答 1查看 2.5K关注 0票数 0

我正在为我们的ASP.Net 2.0 web应用程序添加一个数据访问层,它几乎完全是使用内联的SQL调用和大量使用复制/粘贴来编写的。由于业务考虑,我一次只能重新考虑应用程序的小部分(不能适应并进行大规模的重新设计),所以我必须接受某些设计决策,直到事情松散地耦合到足以进行大的更改并进行适当的测试为止。

我决定使用Enterprise数据访问应用程序块作为数据访问层的管道,而以前的设计决定给我带来了麻烦。目前,我们根据用户提供的帐户id从管理数据库中获取应用程序的“主”连接字符串,以便允许应用程序的单个安装访问多个数据库。我的问题是试图找出将连接字符串(或帐户id)连接到DAL的最佳实践方法。

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

代码语言:javascript
复制
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,多个用户使用它来指定要连接到的数据库。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-05-06 23:53:35

编辑:

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

我在查找/打开Ent文档时遇到了困难,但我想看看它是否具有与ChangeDatabase对象相同的SqlConnection方法。http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.changedatabase.aspx

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

(请原谅c#)

代码语言:javascript
复制
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
    }
}

希望这有帮助,祝你好运!,非常小心,,你在饼干里放了什么。;)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/832325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档