【问题标题】:Static Data Access Methods静态数据访问方法
【发布时间】:2012-04-19 15:08:15
【问题描述】:

我知道创建自定义数据访问层并不是一个好主意,除非您:1) 确切地知道自己在做什么,和/或 2) 有非常具体的需求。但是,我正在维护一些使用自定义数据访问层的遗留代码,其中每个方法看起来像这样:

    using (SqlConnection cn = new SqlConnection(connectionString))
{
    using (SqlDataAdapter da = new SqlDataAdapter("sp_select_details", cn))
    {
        using (DataSet ds = new DataSet())
        {
            da.SelectCommand.Parameters.Add("@blind", SqlDbType.Bit).Value = blind;
            da.SelectCommand.CommandType = CommandType.StoredProcedure;
            da.SelectCommand.CommandTimeout = CommandTimeout;
            da.Fill(ds, "sp_select_details");
            return ds;
        }
    }
}

因此,用法如下所示:

    protected void Page_Load(object sender, EventArgs e) {
    using (Data da = new Data ("SQL Server connection string")) {
        DataSet ds = da.sp_select_blind_options(Session.SessionID); //opens a connection
        Boolean result = da.sp_select_login_exists("someone");//opens another connection
    }
}

我认为使用 Microsoft 的企业库可以让我免于设置和拆除,即每次方法调用都连接到 SQL Server。我的这个想法对吗?

【问题讨论】:

  • 自定义数据访问层绝对没有问题。非自定义访问层由不知道自己在做什么也不知道自己需要什么的人编写,现在 taht 有很多问题。

标签: c# ado.net data-access-layer


【解决方案1】:

是的,默认情况下连接池将打开。应用程序域基本上维护了一个连接列表,当您发出创建连接的调用时,它会从池中返回一个未使用的连接,如果存在,则创建一个。

因此,当您的连接 cn 在 using 语句中超出范围并被释放时,实际发生的情况是它会返回池中,为下一个请求做好准备,并根据各种优化参数在那里徘徊。

有关更多详细信息的 Google ADO 连接池,其中有很多内容。

【讨论】:

  • 好的。谢谢。那么,我从使用 Microsoft Enterprise Library 之类的数据访问中获得了什么好处,在上面。我更喜欢使用 ORM,因为我们的数据库架构几乎已经确定,但从权力来看,这是不可能的。
  • 连接池位于任何一个给定的 ADO.net 正在使用的下面,因此它不会影响为 DAL 选择架构
【解决方案2】:

是的,它肯定会节省您的时间,但您会为性能灵活性付出代价。

因此,创建自定义 DataLayer 也是获得性能和灵活性的好主意。

考虑到您说的是遗留代码,我想它是可行的,我不会将其更改为现代(但性能较差)只是因为我的代码中有一些新鲜的东西

可靠、可行的DataLayer 是您应该在遗留代码中实现的任何其他新技术的最佳选择。

简而言之,只有在您有真正真正理由这样做时才进行更改。我理解你愿意改变这些东西,因为总是很难理解别人编写的代码,但相信我,通常不改变旧的遗留代码是项目的最佳选择。 p>

祝你好运。

【讨论】:

    【解决方案3】:

    我过去非常成功地使用了 Enterprise Library,Enterprise Library 会向您隐藏一些混乱的细节,但本质上它会在内部使用与您的示例中演示的代码相同的代码。

    正如@tigran 所说,除非存在根本问题,否则我不建议尝试更改现有代码库。

    【讨论】:

    • 主要是我想使用以前打开的连接,而不是使用数据读取器的数据集。当我通过代码工作时,我还注意到有很多实例在调用方法中一遍又一遍地重新实例化数据访问类。从我被教​​导的方式来看,这是一个禁忌。
    • 啊,关于数据集的好点。我一直使用 DataReader 并转换为类型。
    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 2015-07-22
    • 2012-06-29
    • 1970-01-01
    相关资源
    最近更新 更多