我知道创建自定义数据访问层并不是一个好主意,除非你: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的连接。我这个想法是否正确?
答案 0 :(得分:0)
是的,它肯定会节省您的时间,但您需要支付性能和灵活性。
因此,创建自定义DataLayer
也是获得性能和灵活性的好主意。
考虑到您正在讨论遗留代码,我认为这样做有效,我不会将其更改为现代(但性能较差)仅用于在代码中添加新内容。
坚固,可行DataLayer
是您应该在遗留代码中实施的任何其他新技术的最佳选择。
简而言之,只有当真的序列有理由这样做时才更改它。我理解你愿意改变这些东西,因为总是很难理解别人写的代码,但是相信我,经常不改变旧的遗留代码是项目的最佳选择。
祝你好运。答案 1 :(得分:0)
我过去使用过Enterprise Library非常成功,而Enterprise Library会隐藏一些乱七八糟的细节,但实际上它会在内部使用与您的示例中演示的相同的代码。
正如@tigran所说,我不建议尝试更改现有的代码库,除非它存在根本问题。
答案 2 :(得分:0)
是的,默认情况下连接池将打开。应用程序域基本上维护一个连接列表,当您发出调用以创建连接时,它会从池中返回一个未使用的连接(如果存在)或者如果不存在则创建一个连接。
因此,当您的连接cn超出范围时,使用语句并获取处理,实际发生的是它返回到池中,准备好下一个请求并根据各种优化参数在那里闲逛。
谷歌ADO连接池有更多细节,那里有很多。