PetShop分析系列2-在数据访问层1

打开PETSHOP的项目文件,突然一阵迷茫。算了,还是从数据访问层入手吧。我看在数据访问层也要迷路一段实践了。好了我们一步步来。随便打开在文件夹SQLServerDAL里面的Item.cs文件。嗯~~~迷糊中。

老东西映入眼帘
using System;
using System.Data;
using System.Data.SqlClient;//连数据库必备,证明这里是实现数据库连接的最终的地方
using PetShop.Model;//PetShop的实体类
using PetShop.IDAL;//那个PetShop的数据访问层定义的接口。
using System.Collections.Generic;//有它就证明又用范型了!!!
using PetShop.DBUtility;//用来实现数据库操作的一些辅助类

public class Item : IItem {//继承了IItem接口

然后就奇怪地看到,居然把数据库的查询语句和语句中传递参数的定义写到了类的属性里面。
private const string SQL_SELECT_ITEMS_BY_PRODUCT = "SELECT Item.ItemId, ....";        
private const string SQL_SELECT_ITEM = "SELECT Item.ItemId, Item.Name,..WHERE Item.ItemId = @ItemId";
 private const string PARM_PRODUCT_ID = "@ProductId";
 private const string PARM_ITEM_ID = "@ItemId";
 
const的意思是常量。const常量的值必定在编译时就已明确并且恒定的。
const和readonly的对
比:http://blog.csdn.net/allenlooplee/archive/2004/10/21/146129.aspx

public IList<ItemInfo> GetItemsByProduct(string productId)
{
    
       IList<ItemInfo> itemsByProduct = new List<ItemInfo>();  
            SqlParameter parm = new SqlParameter(PARM_PRODUCT_ID, SqlDbType.VarChar, 10);
            parm.Value = productId;

            //Execute the query against the database
            using(SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_ITEMS_BY_PRODUCT, parm)) //使用using会自动调用MyObject的Dispose方法,并且使用了SqlHelper.SqlHelper.ConnectionStringLocalTransaction实质是调用了
public static readonly string ConnectionStringLocalTransaction = ConfigurationManager.ConnectionStrings["SQLConnString1"].ConnectionString;
      
              
{
                // 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);
                }
            }
            return itemsByProduct;
        }

using使用的例子
# MyObject.cs

using System;
namespace MyProjects
{
   public class MyObject : IDisposable
   {
   public MyObject()
   {
}

public void Dispose ( )
{
    // Dispose
    Console.WriteLine ( "Disposed" ) ;
    // ...
}
}
}

# Class1.cs
using System;
namespace MyProjects
{
   public class Class1
   {
   public Class1()
   {
}

public static void Main ( string[] args )
{
    using ( MyObject myObject = new MyObject ( ) )
    {
    Console.WriteLine ( "quit" ) ;
    }
    }
  }
}


使用using会自动调用MyObject的Dispose方法.
如果MyObject未实现IDispose接口,则编译时会出错:无法将类型“MyProjects. MyObject”隐式转换为“System.IDisposable”
这种写法可替代
try
{ //... }
catch
{ }
finnaly
{ MyObject.Dispose ( ) ; }

posted @ 2006-11-09 09:32  天天爱晴天  阅读(490)  评论(0)    收藏  举报