C# 静态数据访问方法

C# 静态数据访问方法,c#,ado.net,data-access-layer,C#,Ado.net,Data Access Layer,我知道创建自定义数据访问层不是一个好主意,除非您:1)确切知道自己在做什么,和/或2)有非常具体的需求。但是,我正在维护一些使用自定义数据访问层的遗留代码,其中每个方法如下所示: using (SqlConnection cn = new SqlConnection(connectionString)) { using (SqlDataAdapter da = new SqlDataAdapter("sp_select_details", cn)) { u

我知道创建自定义数据访问层不是一个好主意,除非您: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
    }
}
因此,用法如下所示:

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

我在想,使用微软的企业库可以使我免于建立和破坏与SQLServer的连接,即每次方法调用。我的想法正确吗?

是的,这肯定会节省您的时间,但您将在性能和灵活性方面付出代价

因此,创建一个定制的
数据层
也是一个获得性能和灵活性的好主意

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

可靠、可行的
数据层
是您在遗留代码中实现的任何其他新技术中的最佳选择

简言之,只有当你有足够的理由这样做时才改变它。我理解您愿意更改这些内容,因为理解其他人编写的代码总是很困难,但是相信我,通常不更改旧的遗留代码是项目的最佳选择


祝你好运。

我过去非常成功地使用了企业库,企业库会对你隐藏一些混乱的细节,但本质上它会在内部使用与你的示例中演示的相同的代码


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

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

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


谷歌ADO连接池更多详情,这里有很多。

自定义数据访问层绝对没有问题。非自定义访问层是由那些不知道自己在做什么,也不知道自己需要什么的人编写的,现在taht有很多错误。主要是我想使用以前打开的连接,而不是使用数据读取器的数据集。在我编写代码的过程中,我还注意到,在调用方法中,有大量的实例反复重新实例化了数据访问类。从我被教导的方式来看,这是关于数据集的一个禁忌。我总是使用DataReader并转换为type.OK。谢谢那么,与上面提到的相比,使用Microsoft企业库进行数据访问有什么好处呢。我更喜欢使用ORM,因为我们的数据库模式已经非常明确了,但这是不可能的。连接池在使用ADO.net的任何一种模式之下,因此它对DAL的架构选择没有影响