帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统
栏 目:
 
您的位置:首页 > 技术文档 > ASP.NET编程 >
漫谈.Net PetShop和Duwamish ADO.NET数据库编程(2)
作者:卢彦 发布时间:2005-03-12 来源:ASPCOOL
     Duwamish数据访问剖析
  
    首先,我们来看看Duwamish书店,它采用的是DataAdapter和DataSet配合的数据存储模式,所不同的是,它对DataSet进行子类化扩展作为数据载体,也就是采用定制的DataSet来进行层间的数据传输,下面是一个定制的DataSet示例:
  
  
  public class BookData : DataSet
   {
  public BookData()
   {
   //
   // Create the tables in the dataset
   //
   BuildDataTables();
   }
   private void BuildDataTables()
   {
   //
   // Create the Books table
   //
   DataTable table = new DataTable(BOOKS_TABLE);
   DataColumnCollection columns = table.Columns;
  
   columns.Add(PKID_FIELD, typeof(System.Int32));
   columns.Add(TYPE_ID_FIELD, typeof(System.Int32));
   columns.Add(PUBLISHER_ID_FIELD, typeof(System.Int32));
   columns.Add(PUBLICATION_YEAR_FIELD, typeof(System.Int16));
   columns.Add(ISBN_FIELD, typeof(System.String));
   columns.Add(IMAGE_FILE_SPEC_FIELD, typeof(System.String));
   columns.Add(TITLE_FIELD, typeof(System.String));
   columns.Add(DESCRIPTION_FIELD, typeof(System.String));
   columns.Add(UNIT_PRICE_FIELD, typeof(System.Decimal));
   columns.Add(UNIT_COST_FIELD, typeof(System.Decimal));
   columns.Add(ITEM_TYPE_FIELD, typeof(System.String));
   columns.Add(PUBLISHER_NAME_FIELD, typeof(System.String));
  
   this.Tables.Add(table);
   }
  ………
  }
  
    我们可以看到它有一个BuildDataTables方法,并且在构造函数中调用,这样,定制的Books表就和这个DataSet捆绑在一起了,省得以后还要进行Column Mapping,这真是个好主意,我怎么就没有想到呢? :)
  
    解决了数据结构,接下来看看数据层的代码实现,在Duwamish中,数据层中有5个类,分别是Books,Categories,Customers和Orders,每个类分别只负责有关数据的存取。下面是其中一个类的示例代码:
  
  
  private SqlDataAdapter dsCommand;
  public BookData GetBookById(int bookId)
  {
   return FillBookData("GetBookById", "@BookId", bookId.ToString());
  }
  private BookData FillBookData(String commandText, String paramName, String paramValue)
  {
   if (dsCommand == null )
   {
   throw new System.ObjectDisposedException( GetType().FullName );
   }
   BookData data = new BookData();
   SqlCommand command = dsCommand.SelectCommand;
  
   command.CommandText = commandText;
   command.CommandType = CommandType.StoredProcedure; // use stored proc for perf
   SqlParameter param = new SqlParameter(paramName, SqlDbType.NVarChar, 255);
   param.Value = paramValue;
   command.Parameters.Add(param);
  
   dsCommand.Fill(data);
   return data;
  }
  
    这里就是数据层的代码了,我们在这里可以看到Duwamish采用了DataAdapter来将数据填充到定制的DataSet中,然后返回该DataSet。我感到很奇怪的是在数据存取层中竟然可以看到GetBookById这样具体的数据存取方法,虽然最后还是有一个抽象出来的FillBookData方法,但是上面还有三层啊,底层都做到这份上了,那上层都做些什么呢?答案是数据检查,上层基本上都在做一些很严密的数据合法性校验(当然也会包括一些比较复杂的事务逻辑,但是并不多),示例代码如下:
  
  
  public CustomerData GetCustomerByEmail(String emailAddress, String password)
   {
   //
   // Check preconditions
   //
   ApplicationAssert.CheckCondition(emailAddress != String.Empty, "Email address is required",
  ApplicationAssert.LineNumber);
   ApplicationAssert.CheckCondition(password != String.Empty, "Password is required",
  ApplicationAssert.LineNumber);
   //
   // Get the customer dataSet
   //
   CustomerData dataSet;
   using (DataAccess.Customers customersDataAccess = new DataAccess.Customers())
   {
   dataSet = customersDataAccess.LoadCustomerByEmail(emailAddress);
   }
   //
   // Verify the customer's password
   //
   DataRowCollection rows = dataSet.Tables[CustomerData.CUSTOMERS_TABLE].Rows;
  
   if ( ( rows.Count == 1 ) && rows[0][CustomerData.PASSWORD_FIELD].Equals(password) )
   {
   return dataSet;
   }
   else
   {
   return null;
   }
   }
  
    在这个方法中,真正进行数据存取的实际上只有
  
    dataSet = customersDataAccess.LoadCustomerByEmail(emailAddress);
  
    这么一句,是直接调用的数据层。其它都是在进行合法性校验,我们可以感悟到,进行一个真正的企业级开发需要考虑的系统健壮性有多么重要。
  
  

  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·漫谈.Net PetShop和Duwamish ADO  (2005-03-12)
 ·漫谈EJB  (2005-03-12)

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·放眼未来 帝国近期将有重大举措!
·PHPWind6.3.2版通行证发布
·帝国备份王2008版正式发布
·帝国备份王2008版发布
·phpcms2007转帝国CMS5.0程序发布
·dedecms5.1转帝国CMS5.0程序发布
·帝国网站管理系统V5.0商业购买说明
   类别最新
·ASP.NET中为DataGrid添加合计字段
·.text urlRewrite介绍
·利用 ASP.NET 的内置功能抵御 Web
·ASP.NET Cache
·用 WebClient.UploadData 方法 上载
·ASP.NET 程序设计-序
·什么是客户端/伺服端(Client/Serve
·因特网应用程序的开发
·网页的种类
·.NET Framework-Microsoft Visual
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统