您的位置:首页 > 其它

使用属性和反射过渡从数据存取层到业务物件 - 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的理解研究和应用了,祝你好运.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: