如何高效地使用XCodeFactory自动生成的数据层代码(一)

自从将XCodeFactory开放给大家以后,有不少朋友email来问如何使用或如何更好的使用自动生成的数据层代码的问题。在此分两期给出一个详细的答复,但愿XCodeFactory能很好地协助大家。

大家可以看到,所有自动生成的数据访问类,都继承自IDBAccesser接口,IDBAccesser接口规范了所有的数据访问操作。IDBAccesser定义于EnterpiseServerBase类库中,其外形如下:

// IDBAccesser 即数据库访问基础接口,IDBAccesser提供了对ADO.NET事务的支持

public interface IDBAccesser :IDBAccesserQuery ,IDBAccesserOrder ,IDBAccesserRelation

{

//property

string ConnectString{get ;}

string DbTableName {get ;}

DataBaseType DataBaseType{get ;}

//others

IDataPaginationManager GetPaginationMgr(string selectStr ,string complexID_Name ,int page_size) ;

}

可以看到IDBAccesser 的几个属性都很容易理解,而GetPaginationMgr方法是什么意思了,它返回的是一个分页管理器,此分页管理器可以实现对selectStr 获取的记录集合进行分页,这个将在后面介绍。

IDBAccesser从另外三个接口继承而来,我们来逐个看看这三个接口。

对数据库表的操作可分为两种类型――查询和命令,而IDBAccesserQuery就是查询接口。

public interface IDBAccesserQuery
{
bool ReviseAObject(string where_str ,object target ) ;//使用数据库内容来更新当前对象
object GetAObject(string where_str) ;//if there is no condition clause ,please input ""
object[] GetObjects(string where_str) ;
DataSet GetDataSet(string select_str) ;
}

public interface IDBAccesserQuery
{
bool ReviseAObject(string where_str ,object target ) ;//使用数据库内容来更新当前对象
object GetAObject(string where_str) ;//if there is no condition clause ,please input ""
object[] GetObjects(string where_str) ;
DataSet GetDataSet(string select_str) ;
}

IDBAccesserOrder对应的是命令接口。

public interface IDBAccesserOrder
{
//如果不需要事务,trans以null传入
void Insert(object obj ,IDbTransaction trans) ;
void Update(object obj ,IDbTransaction trans) ;
void Delete(object ID ,IDbTransaction trans) ; //ID一般为int或string类型
void InsertBatch(ArrayList objs ,IDbTransaction trans) ;//批插入
}

需要注意的是IDBAccesserOrder提供了对事物的支持,如果需要在几个命令之间维持一个事物,可以如下这样:

IDBAccesser dbAccesser = ……

ITransactionHelper transHelper = new SQLTransactionHelper(dbAccesser .ConnectString) ;

IDbTransaction trans = transHelper.StartTransaction() ;

try

{

dbAccesser.Insert(obj1 ,trans);

dbAccesser.Update(obj2,trans);

dbAccesser.Insert(obj3,trans);

transHelper.CommitTransaction(trans) ;

}

finally

{

transHelper.RollTransaction(trans) ;

}

ITransactionHelper 定义在EnterpiseServerBase类库中,用于简化事物处理。

可以看到IDBAccesserOrder仅仅提供了对同一数据库内部的事物支持,如果你的事物是跨数据库的,那么你可以使用COM+的事物处理。

还剩下IDBAccesserRelation接口,如果说上面的两个接口提供的是面向对象的操作,那么该接口提供关系型的操作。

public interface IDBAccesserRelation
{
//RelationAction
int GetRecordsCount() ;
object ExecuteScalar(string command) ;
IDataReader GetReader(string select_str) ; //IDataReader用完后要及时关闭
}

要注意的是GetReader方法,使用完该方法的返回的IDataReader后,要记得将其关闭。

在本文最后说一下分页管理器IDataPaginationManager(同样定义在EnterpiseServerBase类库中),当表中符合条件的数据记录很多时,用Apdater一次读出所有的数据即耗费时间又浪费内存,这时用分页是最好的时机。我们看看其接口就知道怎么使用它了。

public interface IDataPaginationManager
{
//complexIDName 如"ID"或"sta.ID"(用于复合查询)
//selectStr 中不允许包括Group By 和 Order By 等字段
//void Initialize(IDBAccesser accesser ,string selectStr ,string complexID_Name) ;

public interface IDataPaginationManager
{
//complexIDName 如"ID"或"sta.ID"(用于复合查询)
//selectStr 中不允许包括Group By 和 Order By 等字段
//void Initialize(IDBAccesser accesser ,string selectStr ,string complexID_Name) ;

int PageCount {get ;}
int CurrentPageIndex{get ;}
DataTable StartPage() ;
DataTable NextPage() ;
DataTable PrePage() ;
DataTable CurrentPage {get ;}
DataTable GetPage(int index) ;

int PageCount {get ;}
int CurrentPageIndex{get ;}
DataTable StartPage() ;
DataTable NextPage() ;
DataTable PrePage() ;
DataTable CurrentPage {get ;}
DataTable GetPage(int index) ;

event PageChanged CurrentPageIndexChanged ;
}

event PageChanged CurrentPageIndexChanged ;
}

注意,分页返回的是DataTable,你可以将返回的DataTable绑定到你的DataGrid直接显示分页的数据。

今天就先写到这里,在后面一篇文章中,我们将讨论更高级的用法,比如,如何缓存经常使用的数据?如何切换不同类型的数据库类型等等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值