欢迎光临
我们一直在努力

漫谈.Net PetShop和Duwamish ADO.NET数据库编程(2)-.NET教程,Asp.Net开发

建站超值云服务器,限时71元/月

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 customers 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);
  
    这么一句,是直接调用的数据层。其它都是在进行合法性校验,我们可以感悟到,进行一个真正的企业级开发需要考虑的系统健壮性有多么重要。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 漫谈.Net PetShop和Duwamish ADO.NET数据库编程(2)-.NET教程,Asp.Net开发
分享到: 更多 (0)