您的位置:首页 > 编程语言

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

2005-07-02 14:32 1111 查看
自从将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直接显示分页的数据。




今天就先写到这里,在后面一篇文章中,我们将讨论更高级的用法,比如,如何缓存经常使用的数据?如何切换不同类型的数据库类型等等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: