日期:2014-05-19  浏览次数:20928 次

问一个USING的问题
using   (OracleDataReader   rdr   =   OracleHelper.ExecuteReader())
{
    while   (rdr.Read())   {
              ProductInfo   product   =   new   ProductInfo(rdr.GetString(0),       rdr.GetString(2),   rdr.GetString(3),   rdr.GetString(4));
                                        productsByCategory.Add(product);
                                }
}

跟直接
OracleDataReader   rdr   =   OracleHelper.ExecuteReader()
    while   (rdr.Read())   {
              ProductInfo   product   =   new   ProductInfo(rdr.GetString(0),       rdr.GetString(2),   rdr.GetString(3),   rdr.GetString(4));
                                        productsByCategory.Add(product);
                                }
有什么区别

------解决方案--------------------
用using在using的结尾出会调用OracleDataReader 的Dispose函数来自动回收资源。

如果直接写就只能等待.net来定时回收了
------解决方案--------------------
1。
using 语句允许程序员指定使用资源的对象应当何时释放资源(实际上,离开using(someInstance) { } 时,即释放 someInstance 所占用的资源)。

为 using 语句提供的对象必须实现 IDisposable 接口。

接口提供了 Dispose 方法,该方法将释放此对象的资源。


2。详细参考
using 语句(C# 参考)
http://msdn2.microsoft.com/zh-cn/library/yh598w02(VS.80).aspx

3。
对于 xxxDataReader 使用 using 需要注意的是,

假如你无法控制/访问 此 DataReader 底层使用的 xxxConnection 对象(通常此 DataReader 最为返回值返回,内部实例化 Connection,并 open。因此,你无法调用 Connection.Close() 关闭连接),那么即使你通过 using 关闭了 DataReader ,Connection 依然没有 close,

所以,你的 OracleHelper.ExecuteReader() 内部在调用 Commmand.ExecuteReader 的时候,需
要指定一个选项参数,告诉返回的 DataReader,当关闭 DataReader 的时候,自动关闭 使用的 Connection。 (一个 Connection 同时只能给一个 DataReader 使用)

此参数值为,CommandBehavior.CloseConnection 枚举。


Hope helpful!