欢迎光临
我们一直在努力

使用属性和反射过渡从数据存取层到业务物件 – III-.NET教程,数据库应用

建站超值云服务器,限时71元/月

简介

本系列的最后一篇文章.第一部分如何描述,二部分如何取得描述.现在我们就要创建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的理解研究和应用了,祝你好运.

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 使用属性和反射过渡从数据存取层到业务物件 – III-.NET教程,数据库应用
分享到: 更多 (0)

相关推荐

  • 暂无文章