public OrderInfo GetOrder(int orderId) {

//Create a parameter
SqlParameter parm = new SqlParameter(PARM_ORDER_ID, SqlDbType.Int);
parm.Value = orderId; //Execute a query to read the order
using (SqlDataReader rdr = SQLHelper.ExecuteReader(SQLHelper.CONN_STRING_DTC_ORDERS, CommandType.Text, SQL_SELECT_ORDER, parm)) {

if (rdr.Read()) { //Generate an order header from the first row
CreditCardInfo creditCard = new CreditCardInfo(rdr.GetString(2), rdr.GetString(3), rdr.GetString(4));
AddressInfo billingAddress = new AddressInfo(rdr.GetString(5), rdr.GetString(6), rdr.GetString(7), rdr.GetString(8), rdr.GetString(9), rdr.GetString(10), rdr.GetString(11), rdr.GetString(12), null);
AddressInfo shippingAddress = new AddressInfo(rdr.GetString(13), rdr.GetString(14), rdr.GetString(15), rdr.GetString(16), rdr.GetString(17), rdr.GetString(18), rdr.GetString(19), rdr.GetString(20), null); OrderInfo order = new OrderInfo(orderId, rdr.GetDateTime(0), rdr.GetString(1), creditCard, billingAddress, shippingAddress, rdr.GetDecimal(21)); ArrayList lineItems = new ArrayList();
LineItemInfo item = null; 

//Create the lineitems from the first row and subsequent rows
do{
item = new LineItemInfo(rdr.GetString(22), string.Empty, rdr.GetInt32(23), rdr.GetInt32(24), rdr.GetDecimal(25));
lineItems.Add(item);
}while(rdr.Read()); order.LineItems = (LineItemInfo[])lineItems.ToArray(typeof(LineItemInfo)); return order;
}
} return null;
}
我不明白的是,在这个方法中,为什么没有出现rdr.Close()呢?
难道SqlDataReader读完后自己就关了?
这样的情况在PetShop中还发现了好多,有些方法中,连SqlConnection创建完后都没有用代码显示关闭,这样做的话效率岂不是很低吗?望达人指点

解决方案 »

  1.   

    完成对 Connection 或 DataReader 对象的使用后,总是最好显式地关闭它们。对于 C# 程序员来说,确保始终关闭 Connection 和 DataReader 对象的一个方便的方法就是使用 using 语句。using 语句在离开自己的作用范围时,会自动调用被“使用”的对象的Dispose。
    Using 语句不能用于 Microsoft庐 Visual Basic.NET更多ADO.NET技巧参见MSDN上的文章
    数据访问:使用 ADO.NET 的最佳实践(ADO.NET 技术文档)
    连接一时没找到,呵呵,自己搜一下吧
      

  2.   

    其实仔细看下代码,就会发现
    using (SqlDataReader rdr =)这句会和自己编码方式的不同的,然后在找找就会找到其中的小技巧的啦
    楼主看代码的时候还是用了心思的啦