标签:net-4-5 asp-net c net sql-server
我了解从您的应用程序与sql server建立连接时使用using块的概念,因为一旦超出范围,它将立即关闭连接,并节省了我们编写try catch catch块的时间.
但是我的问题是,通常在初始化SqlCommand时使用使用有什么好处吗?
string cs = ConfigurationManager.ConnectionStrings["CS1"].ConnectionString;
using(SqlConnection con = new SqlConnection(cs))
{
SqlCommand cmd = new SqlCommand("SELECT * FROM dbo.City", con);
con.Open();
DropDownList1.DataSource = cmd.ExecuteReader();
DropDownList1.DataTextField = "City";
DropDownList1.DataValueField = "ID";
DropDownList1.DataBind();
}
但是,将SqlCommand初始化放在using块中可以获得什么可能的好处?
string cs = ConfigurationManager.ConnectionStrings["CS1"].ConnectionString;
using(SqlConnection con = new SqlConnection(cs))
{
using(SqlCommand cmd = new SqlCommand("SELECT * FROM dbo.City", con))
{
con.Open();
DropDownList1.DataSource = cmd.ExecuteReader();
DropDownList1.DataTextField = "City";
DropDownList1.DataValueField = "ID";
DropDownList1.DataBind();
}
}
我在网上搜索过的所有材料都谈到连接一旦超出范围就会立即关闭,是的,我知道,但是将SqlCommand放在using块中会使其变得更有效率吗?
非常感谢任何建议或指示.
解决方法:
在查看源代码时,您可以清楚地看到这一点.
这是SqlCommand.Dispose
的实现:
override protected void Dispose(bool disposing)
{
if (disposing)
{
_cachedMetaData = null;
}
base.Dispose(disposing);
}
如您所见,这并没有太大作用.但是,当查看base.Dispose
时:
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
SqlCommand从DbCommand继承,而DbCommand又从Component继承.组件实现了finalizer,这意味着一旦没有人引用该对象,该对象将不会被处置,因为它仍然具有对finalizer queue的引用.
当使用using语句包装SqlCommand时,其中最重要的部分是其基类(组件)调用GC.SupressFinialize
,这将删除对终结器队列的引用,并在GC启动后收集该对象.
这就是SqlCommand实现IDisposable的原因,应该对其进行处置.
标签:net-4-5,asp-net,c,net,sql-server 来源: https://codeday.me/bug/20191028/1955349.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。