使用属性和反射过渡从数据存取层到业务物件 - III
2004-11-17 05:56
435 查看
简介
本系列的最后一篇文章.第一部分如何描述,二部分如何取得描述.现在我们就要创建DAL库来使我们的标题可行.设计DAL库
我想创建的类库支持Sqlserver和oledb.我把库分成了以下的部分:Utilityclasses
classDALQueryBuilder
生成sql语句更新物件.classDALParameter
生成参数保存在存储过程中.classDALException
继承于System.Exception,数据库有异常时将会提供更多的信息.
Attributeclasses
参见第一篇.DAL本身
classDALEngine
这个抽象的类用于数据库操作,是数据库程序更加简单.它的虚拟和抽象的方法有不同的实施.classDALSqlEngine
classDALOleDbEngine
耧一眼DALEngine类
publicabstractclassDALEngine:IDisposable
{
//
//privatedatamembers
//
IDbConnectionconn=null;
stringconnectionString="";
ArrayListparameters=newArrayList();
boolcanClose=true;
//constructor
publicDALEngine(stringconnectionString);
publicboolCanClose;
publicstringConnectionString;
protectedIDbConnectionConnection;
protectedArrayListParameters;
publicvoidClose();
publicvoidDispose();
//
//methodsthatmustbeoverridewithaspecificdataprovider
//implementationpleaseseetheimplementationofDALSqlEngine
//orDALOleDbEngine
//
protectedabstractIDbConnectionGetConnection();
protectedabstractIDbCommandCreateCommand(stringspName);
publicabstractvoidExecSP_DataSet(stringspName,DataSetdataSet,
stringtableName);
publicabstractvoidExecQuery_DataSet(stringquery,DataSetdataSet,
stringtableName);
//
//relatedtostoredprocedureparameters
//
publicDALParameterGetParameter(stringname);
voidUpdateOutputParameters(IDbCommandcmd);
publicvoidAddParameter(DALParameterparam);
publicvoidClearParameters();
//
//forthosethatusestoredprocedures
//
publicIDataReaderExecSP_DataReader(stringspName);
publicIDataReaderExecSP_DataReader(stringspName,
CommandBehaviorbehavior);
publicobjectExecSP_Scalar(stringspName);
publicintExecSP_NonQuery(stringspName);
//
//methodsforthosethatuseplainSQLstatements
//
publicIDataReaderExecQuery_DataReader(stringquery,
CommandBehaviorbehavior);
publicIDataReaderExecQuery_DataReader(stringquery);
publicobjectExecQuery_Scalar(stringquery);
publicintExecQuery_NonQuery(stringquery);
//
//Businessobjectsmethods
//
publicstaticobjectCreateFromReader(IDataReaderreader,TypeobjType);
publicobjectRetrieveObject(objectkeyValue,TypeobjType);
publicintRetrieveChildObjects(objectforeignKeyValue,ArrayListobjects,
TypechildType);
voidUpdateObjectSql(objecto,DataTableAttributedataTable);
voidUpdateObjectStoredProcedure(objecto,DataTableAttributedataTable);
publicvoidUpdateObject(objecto);
publicvoidUpdateObjects(IEnumerableenumObjects);
}
publicclassDAL:DALSqlEngine
{
conststringCONN_STRING="server=localhost;uid=sa;pwd=;database=pubs";
publicDAL():base(CONN_STRING)
{
}
publicArrayListGetCustomerDependents(Customercustomer)
{
ArrayListresult=newArrayList();
RetrieveChildObjects(customer.Id,result,typeof(CustomerDependent));
returnresult;
}
publicvoidUpdateCustomerDependents(Customercustomer)
{
UpdateObjects(customer.Dependents);
}
}
看个例子:
publicstaticvoidMain()
{
DALdal=newDAL();
try
{
Contactcontact=newContact();
contact.Name="JoaoCardoso";
contact.Age=23;
contact.Address="Av.RioBranco,202/121";
contact.Address2="Centro";
contact.PostalCode="09029-901";
contact.City="SaoPaulo";
contact.State="SP";
contact.Country="Brazil";
dal.UpdateObject(contact);
Console.WriteLine(contact);
ContactjoaoCardoso=(Contact)dal.RetrieveObject(1,typeof(Contact));
joaoCardoso.Age++;
Console.WriteLine(joaoCardoso);
Console.WriteLine("");
Customercustomer=newCustomer();
customer.Name="PaulNoyter";
customer.Age=34;
customer.Address="AllSt,2202/2121";
customer.Address2="Downville";
customer.PostalCode="90931";
customer.City="LosAngeles";
customer.State="CA";
customer.Country="UnitedStates";
customer.TotalPurchased+=1900.87M;
customer.NumberOfPurchases++;
dal.UpdateObject(customer);
Customerpaul=(Customer)dal.RetrieveObject(1,typeof(Customer));
Console.WriteLine(paul);
paul.TotalPurchased+=100M;
paul.NumberOfPurchases++;
dal.UpdateObject(paul);
if(paul.Dependents.Count==0)
{
CustomerDependentdependent=paul.NewDependent();
dependent.Name="MarieNoyter";
dependent.Age=31;
paul.Dependents.Add(dependent);
dependent=paul.NewDependent();
dependent.Name="MarkNoyter";
dependent.Age=10;
paul.Dependents.Add(dependent);
dependent=paul.NewDependent();
dependent.Name="ClaudiaSnorg";
dependent.Age=32;
dependent.Relationship=CustomerRelationship.Friend;
paul.Dependents.Add(dependent);
dal.UpdateCustomerDependents(paul);
}
else
{
Console.WriteLine("Dependentsof{0}",paul.Name);
foreach(CustomerDependentdependentinpaul.Dependents)
{
Console.WriteLine("<Dependent>{0}-{1}[{2}]",dependent.Id,
dependent.Name,dependent.Relationship);
dependent.Relationship=CustomerRelationship.Family;
}
dal.UpdateCustomerDependents(paul);
}
}
finally
{
dal.Dispose();
}
}
Conclusion
有老多局限性,需要我们去进一步实施思考,但是你理解了这些以后,我们就可以进行nhibernate的理解研究和应用了,祝你好运.相关文章推荐
- 使用属性和反射过渡从数据存取层到业务物件 - II
- 开源的DOS
- 打造安全的Windows 2003系统
- 不吃香海归如何就业 国内求职谨记五原则(转自sina)
- [转载] 警惕—安逸的工作引发职业危机
- 冬天要来了
- 利用临界区的多线程同步测试(转)
- 读者——写者问题(转载)
- 用vc实现生产者消费者问题(转载)
- ejbca的汉化和修改完成了
- Jmail的主要参数列表:
- 好几天没有写了!
- 哇! 我没看错吧? J2SE 6.0!!!!!!
- 关于线程池的感想(原创)
- 游戏开发的一些建议
- 换个角度做设计:基于schema的全局业务数据定义。
- 还好吗?
- 关键字params使用
- 是软件问题还是网络问题
- 对IO有兴趣了