惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
Stack Overflow Blog
Stack Overflow Blog
P
Proofpoint News Feed
L
LangChain Blog
C
Check Point Blog
F
Fortinet All Blogs
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Blog — PlanetScale
Blog — PlanetScale
腾讯CDC
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
Recent Announcements
Recent Announcements
雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
N
Netflix TechBlog - Medium
博客园 - 【当耐特】
Hugging Face - Blog
Hugging Face - Blog
Microsoft Azure Blog
Microsoft Azure Blog
U
Unit 42
The Cloudflare Blog
月光博客
月光博客
有赞技术团队
有赞技术团队
G
Google Developers Blog
Vercel News
Vercel News

博客园 - hzwang

Administering your Windows Internal Database (MICROSOFT##SSEE) instance(转) VS 2008如何连接TFS 2010 learning F#(1):编程环境 learning F#: 开篇 Tip for using Fiddler on localhost (转载)ASP.NET MVC – Add CSS class Attribute I will write at least one blog every week 使用位逻辑运算来实现位向量 对象判等 sql bcp Utility工具使用 C# 3.0 —— 扩展方法 visitor(访问者)模式 - hzwang - 博客园 抽象类与接口(转) 在 C# 中实现 Singleton (转) 设置VSS2005使支持通过Internet访问 VSS使用手册 ASP.NET Forms 身份验证控制流 Cookie使用总结 不断努力,不断学习
读代码随笔(一):using语句的使用
hzwang · 2007-10-29 · via 博客园 - hzwang

using(SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_ITEMS_BY_PRODUCT, parm)) {
                
// Scroll through the results
                while (rdr.Read()) {
                    ItemInfo item 
= new ItemInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetInt32(2), rdr.GetDecimal(3), rdr.GetString(4), rdr.GetString(5), rdr.GetString(6), rdr.GetString(7));
                    
//Add each item to the arraylist
                    itemsByProduct.Add(item);
                }

            }

        public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
            SqlCommand cmd 
= new SqlCommand();
            SqlConnection conn 
= new SqlConnection(connectionString);

            
// we use a try/catch here because if the method throws an exception we want to 
            
// close the connection throw code, because no datareader will exist, hence the 
            
// commandBehaviour.CloseConnection will not work
            try {
                PrepareCommand(cmd, conn, 
null, cmdType, cmdText, commandParameters);
                SqlDataReader rdr 
= cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
                
return rdr;
            }

            
catch {
                conn.Close();
                
throw;
            }

        }

首先在using语句中初始化一个对象,并将其引用保存在一个变量中.然后在和using语句匹配的大括号内访问该变量.编译这段代码时,编译器会自动产生一个try块和一个finally块.在finally块中,编译器会产生代码将变量转型为一个IDisposable接口,并调用该接口上的Dispose方法.很明显,using语句只能用于那些实现了IDisposable接口的类型.
前面代码在using语句中初始化了一个SqlDataReader对象,该对象由ExecuteReader()方法返回得到,该方法中有这么一句CommandBehavior.CloseConnection,在没有异常的情况下并不会关闭conn,但是当using语句执行完之后,会自动调用SqlDataReader的Dispose()方法在该方法中会关闭SqlDataReader,当SqlDataReader关闭的时候,由于CommandBehavior.CloseConnection,相应的conn也会关闭,不会造成资源的浪费.