XCodeFactory2.0完全手册(上)

本文介绍了XCodeFactory工具,它使用简单,生成的数据层代码易使用。支持三种数据访问接口、SQL Server和OLE数据库等多种功能。其设计思想是让开发人员从数据层解脱,通过维护cfp文件自动生成数据库表、数据对象和访问类,还举例说明了使用方式。

如果想要很好的使用一件兵器,你必须了解它的秉性、它的优势劣势,掌握它的精神,从而扬长避短。使用XCodeFactory也是一样,要想它成为你的得力助手,你需要花一点时间来了解它。我可以向你保证,它一定不会让你失望的!

Hibernate/NHibernate虽然功能强大,但是使用困难度却比XCodeFactory大N倍。XCodeFactory使用简单,而且生成的数据层代码也很容易使用,但这并不就是说XCodeFactory的功能不够强,相反,对于绝大多数应用来说,XCodeFactory生成的代码足以满足我们的需要。XCodeFactory生成的数据层代码目前支持以下主要功能:

(1)支持三种数据访问接口。你对数据库表的所有操作基本上都包含于这三个接口中。

三种接口分别是查询接口(基于对象操作)、命令接口(添加/删除/修改,基于对象操作)、关系型接口(DataSet、DataReader ,基于关系操作)。另外还支持自动分页。

(2)支持SQL Server数据库和OLE数据库(如Access)。生成的数据库表访问类是两个(如StudentSqlDealer ,StudentOleDealer),一个用于Sql Server数据库,另一个用于Ole数据库。而数据库之间的相互切换只需要改变配置文件中的一个枚举的选择即可。

(3)支持自动增长的主键字段。

(4)支持Blob字段,并支持延迟加载Blob字段。也就是说你在从数据库取出一个对象时,可以先不取出其Blob字段(GetObjectsWithoutBlob方法),等到需要用到Blob字段时,在加载它(FillBlobData方法)。

(5)支持事物。命令接口中的所有方法都对事物提供支持。

(6)使用DataEntrance静态类,能进一步简化对自动生成的数据层的代码的使用。

数据层的主要功能就这么多,接下来说说XCodeFactory的设计思想。XCodeFactory的主要目标是使开发人员从SQL语句、从数据层解脱出来,也就是说,使用XCodeFactory之后,开发人员可以不用关心数据层的任何东西,而所要做的仅仅是维护cfp文件--XCodeFactory的项目文件,一个cfp文件对应数据库中的一个表。只要有cfp文件在手,我就可以使用XCodeFactory自动生成数据库中的表、对应的数据对象和对应的数据访问类。所以当需要修改某个数据库表的结构时,只需要XCodeFactory打开对应的cfp文件,修改其内容,点击生成按钮,然后重新编译你的VS项目。

你也许已经了解一些了,是的,思想是这样的,数据库中的一个表对应着一个cfp文件,也对应着一个数据对象,还对应着一个数据访问类(如果要区分数据库类型的话,目前对应的是两个访问类,一个针对SqlServer,另一个针对Ole数据库)。即

数据库表 《==》cfp文件 《==》数据对象类 《==》数据访问类(s)

所谓数据对象类,可以说是一个简单的数据结构,它的所有属性都与对应的数据库表中的字段一一对应,注意,是“一一对应”,而数据库类型也转换为对应的C#类型,如NVarChar转换为string、image转换为byte数组等等。

而一个对象(即一个数据对象类的实例)对应着数据库表中的一条记录。接下来举个例子。假设我们的系统中需要一个数据库表来保存教师Teacher的信息,表结构如下(该描述文件也是由XCodeFactory自动生成):

其中VideoInfo是对该教师的视频录像,是一个Blob。

对应的XCodeFactory的cfp项目操作界面如下:

点击生成按钮后,生成的数据对象类(即对应上图的“属性类文件”CheckBox)的代码如下:

publicclassTeacher
{
publicTeacher()
{
}


ID#regionID
privatestringiD="";
/**////<summary>
///编号
///</summary>

publicstringID
{
get
{
returnthis.iD;
}

set
{
this.iD=value;
}

}

#endregion


Name#regionName
privatestringname="";
/**////<summary>
///姓名
///</summary>

publicstringName
{
get
{
returnthis.name;
}

set
{
this.name=value;
}

}

#endregion


Age#regionAge
privateintage=0;
/**////<summary>
///年龄
///</summary>

publicintAge
{
get
{
returnthis.age;
}

set
{
this.age=value;
}

}

#endregion


Description#regionDescription
privatestringdescription="";
/**////<summary>
///说明
///</summary>

publicstringDescription
{
get
{
returnthis.description;
}

set
{
this.description=value;
}

}

#endregion


VideoInfo#regionVideoInfo
privatebyte[]videoInfo=null;
/**////<summary>
///视频资料
///</summary>

publicbyte[]VideoInfo
{
get
{
returnthis.videoInfo;
}

set
{
this.videoInfo=value;
}

}

#endregion


ToString#regionToString
publicoverridestringToString()
{
returnthis.ID.ToString()+""+this.Name.ToString();
}

#endregion

}

生成的访问类TeacherSqlDealer ,TeacherOleDealer ,它们的代码就很复杂了,下面仅仅将访问类的接口列出:

/**////<summary>
///IDBAccesser是最基本的数据服务对象--即数据库访问类,IDBAccesser提供了对ADO.NET事务的支持。
///作者:朱伟sky.zhuwei@163.com
///</summary>

publicinterfaceIDBAccesser:IDBAccesserQuery,IDBAccesserOrder,IDBAccesserRelation
{
//property
stringConnectString{get;}
stringDbTableName{get;}
DataBaseTypeDataBaseType
{get;}

//others
IDataPaginationManagerGetPaginationMgr(stringselectStr,stringcomplexID_Name,intpage_size);
}


/**////<summary>
///IDBAccesserRelation为执行sql关系型接口
///</summary>

publicinterfaceIDBAccesserRelation
{
//RelationAction
intGetRecordsCount();
objectExecuteScalar(stringcommand);
IDataReaderGetReader(
stringselect_str);//IDataReader用完后要及时关闭
}


/**////<summary>
///IDBAccesserQuery为执行sql查询接口
///</summary>

publicinterfaceIDBAccesserQuery
{
boolReviseAObject(stringwhere_str,objecttarget);//使用数据库内容来更新当前对象
objectGetAObject(stringwhere_str);//ifthereisnoconditionclause,pleaseinput""
object[]GetObjects(stringwhere_str);
object[]GetObjectsWithoutBlob(stringwhere_str);//获取的对象中凡是Blob字段都未填充
boolFillBlobData(objectobj);//填充某个对象的所有Blob字段
DataSetGetDataSet(stringselect_str);
}


/**////<summary>
///IDBAccesserOrder为执行sql命令接口
///</summary>

publicinterfaceIDBAccesserOrder
{
//如果不需要事务,trans以null传入
voidInsert(objectobj,IDbTransactiontrans);
voidUpdate(objectobj,IDbTransactiontrans);
voidDelete(objectID,IDbTransactiontrans);//ID一般为int或string类型
voidInsertBatch(ArrayListobjs,IDbTransactiontrans);//批插入

//插入对象并返回自动编号标志
objectInsertReturnIdentity(objectobj,IDbTransactiontrans);
}


该接口与数据库类型无关,XCodeFactory自动生成的所有访问类都支持IDBAccesser接口。下面就让我们来看看如何的使用数据访问类:

//IDBAccesserdeal_Teacher=CommonInformation.DBFactory.CreateDBAccesser(typeof(Teacher));
IDBAccesserdeal_Teacher=newTeacherSqlDealer(connStr);
//取出所有年龄大于45岁的教师,并且暂时不需要视频资料(Blob)
Teacher[]teachers=(Teacher[])deal_Teacher.GetObjectsWithoutBlob("WhereAge>'45'");
//对teachers处理

//当需要获得第五个教师的视频资料时
deal_Teacher.FillBlobData(teachers[4]);

//播放视频
DisplayVideo(teachers[4].VideoInfo);

//修改描述信息,更新数据库中该教师的信息
teachers[4].Description="";
deal_Teacher.Update(teachers[
4]);

是不是很容易使用了。上面的代码只是使用自动生成的数据层代码的一种方式,使用DataEntrance,我们能更加简洁地完成上述任务。这个我们将会在后续的文章中提到。

已经晚了,就先写到这里吧。 如果对前面的讲述还有什么不明白的地方,请留言。也欢迎提出建议!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值