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);
这么一句,是直接调用的数据层。其它都是在进行合法性校验,我们可以感悟到,进行一个真正的企业级开发需要考虑的系统健壮性有多么重要。
漫谈.Net PetShop和Duwamish ADO.NET数据库编程(2)-.NET教程,Asp.Net开发
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 漫谈.Net PetShop和Duwamish ADO.NET数据库编程(2)-.NET教程,Asp.Net开发
相关推荐
-      DataGrid中的按钮反选事件与NamingContainer(命名容器)-downmoon-ASP教程,数据库相关
-      根据数据表中数据,生成Powerpoint幻灯片-ASP教程,数据库相关
-      使用用VB处理MYSQL数据库中二进制数据问题-.NET教程,VB.Net语言
-      关于DataGridView中如何接收处于编辑状态下的当前信息-ASP教程,数据库相关
-      ActiveMQ4.1+Spring2.0的POJO JMS方案(上)-.NET教程,数据库应用
-      ASP.NET 2.0中直接将Access数据库导入到Excel文件中-.NET教程,Asp.Net开发
-      DataGrid的多行提交-.NET教程,数据库应用
-      一个简单的asp数据库操作类-ASP教程,数据库相关