首页 > 开发 > 综合 > 正文

使用属性和反射过渡从数据存取层到业务物件 - III

2024-07-21 02:23:12
字体:
来源:转载
供稿:网友
简介
本系列的最后一篇文章.第一部分如何描述,二部分如何取得描述.现在我们就要创建dal库来使我们的标题可行.

设计dal库
我想创建的类库支持sqlserver 和oledb.我把库分成了以下的部分:

utility classes
class dalquerybuilder
生成sql语句更新物件.

class dalparameter
生成参数保存在存储过程中.

class dalexception
继承于system.exception , 数据库有异常时将会提供更多的信息.

attribute classes
参见第一篇.

dal 本身
class dalengine
这个抽象的类用于数据库操作,是数据库程序更加简单.它的虚拟和抽象的方法有不同的实施.

class dalsqlengine


class daloledbengine
耧一眼dalengine 类
public abstract class dalengine : idisposable
{
//
// private data members
//
idbconnection conn = null;
string connectionstring = "";
arraylist parameters = new arraylist();
bool canclose = true;


// constructor
public dalengine(string connectionstring);

public bool canclose;
public string connectionstring;


protected idbconnection connection;
protected arraylist parameters;

public void close();
public void dispose();


//
// methods that must be override with a specific data provider
// implementation please see the implementation of dalsqlengine
// or daloledbengine
//
protected abstract idbconnection getconnection();
protected abstract idbcommand createcommand(string spname);
public abstract void execsp_dataset(string spname, dataset dataset,
string tablename);
public abstract void execquery_dataset(string query, dataset dataset,
string tablename);


//
// related to stored procedure parameters
//
public dalparameter getparameter(string name);
void updateoutputparameters(idbcommand cmd);
public void addparameter(dalparameter param);
public void clearparameters();


//
// for those that use stored procedures
//
public idatareader execsp_datareader(string spname);
public idatareader execsp_datareader(string spname,
commandbehavior behavior);
public object execsp_scalar(string spname);
public int execsp_nonquery(string spname);


//
// methods for those that use plain sql statements
//
public idatareader execquery_datareader(string query,
commandbehavior behavior);
public idatareader execquery_datareader(string query);
public object execquery_scalar(string query);
public int execquery_nonquery(string query);




//
// business objects methods
//
public static object createfromreader(idatareader reader, type objtype);
public object retrieveobject(object keyvalue, type objtype);
public int retrievechildobjects(object foreignkeyvalue, arraylist objects,
type childtype);
void updateobjectsql(object o, datatableattribute datatable);
void updateobjectstoredprocedure(object o, datatableattribute datatable);
public void updateobject(object o);
public void updateobjects(ienumerable enumobjects);
}

public class dal : dalsqlengine
{
const string conn_string = "server=localhost;uid=sa;pwd=;database=pubs";

public dal() : base(conn_string)
{

}

public arraylist getcustomerdependents(customer customer)
{
arraylist result = new arraylist();

retrievechildobjects(customer.id, result, typeof(customerdependent));

return result;
}

public void updatecustomerdependents(customer customer)
{
updateobjects(customer.dependents);
}
}
看个例子:

public static void main()
{

dal dal = new dal();

try
{

contact contact = new contact();
contact.name = "joao cardoso";
contact.age = 23;
contact.address = "av. rio branco, 202/121";
contact.address2 = "centro";
contact.postalcode = "09029-901";
contact.city = "sao paulo";
contact.state = "sp";
contact.country = "brazil";

dal.updateobject(contact);
console.writeline(contact);


contact joaocardoso = (contact)dal.retrieveobject(1, typeof(contact));
joaocardoso.age++;
console.writeline(joaocardoso);
console.writeline("");


customer customer = new customer();
customer.name = "paul noyter";
customer.age = 34;
customer.address = "all st, 2202/2121";
customer.address2 = "downville";
customer.postalcode = "90931";
customer.city = "los angeles";
customer.state = "ca";
customer.country = "united states";
customer.totalpurchased += 1900.87m;
customer.numberofpurchases++;

dal.updateobject(customer);


customer paul = (customer)dal.retrieveobject(1, typeof(customer));
console.writeline(paul);

paul.totalpurchased += 100m;
paul.numberofpurchases++;
dal.updateobject(paul);

if (paul.dependents.count == 0)
{
customerdependent dependent = paul.newdependent();
dependent.name = "marie noyter";
dependent.age = 31;
paul.dependents.add(dependent);


dependent = paul.newdependent();
dependent.name = "mark noyter";
dependent.age = 10;
paul.dependents.add(dependent);


dependent = paul.newdependent();
dependent.name = "claudia snorg";
dependent.age = 32;
dependent.relationship = customerrelationship.friend;
paul.dependents.add(dependent);

dal.updatecustomerdependents(paul);
}
else
{
console.writeline("dependents of {0}", paul.name);

foreach(customerdependent dependent in paul.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的理解研究和应用了,祝你好运.


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表