国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

使用屬性和反射過渡從數據存取層到業務物件 - 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的理解研究和應用了,祝你好運.


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 九龙坡区| 朝阳县| 永泰县| 广水市| 金川县| 阿图什市| 筠连县| 壤塘县| 牙克石市| 耒阳市| 文山县| 襄城县| 祁东县| 洛阳市| 新邵县| 凤山县| 博客| 礼泉县| 汝南县| 年辖:市辖区| 拜泉县| 南靖县| 稷山县| 仁化县| 商水县| 泾阳县| 曲沃县| 富顺县| 陆良县| 杭锦旗| 金乡县| 广宁县| 东海县| 鄂托克旗| 阿拉善左旗| 常山县| 兰州市| 鄂州市| 泸溪县| 湖北省| 安义县|