分享
 
 
 

使用反映实现前端WEB窗口控件与后台数据库类对象的动态绑定

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

以前做开发时,在最后阶段会发生数据库字段部分的变化,如果在某表中增加了一些字段,那可真是一场恶梦,前几天在微软的MSDN上看到一篇关于前台窗口控件与事务逻辑动态绑定的例子(http://www.microsoft.com/china/msdn/library/webservices/asp.net/aspformbinding.mspx),使用了反射,我在使用时做了一下测试,发现效率还可以接受,但由于代码中未提供事务逻辑与数据库类字段的接口,多少有点遗憾,所以我把我加的这部分代码在这里解释一下,请各位大侠多多指教。(代码发布在http://mxjlb.ccwb.net/dbservice.rar

using System;

using System.Data;

using System.Reflection;

using System.Configuration;

namespace DbService

{

/// <summary>

/// DataObjBinding 的摘要说明。

/// </summary>

public class DataObjBinding

{

public DataObjBinding()

{

//

// TODO: 在此处添加构造函数逻辑

//

}

public static string [] GetTableColum(string tablename) //在WEB.config中写入表的字段信息。

{

string [] strColumn=ConfigurationSettings.AppSettings[tablename].ToLower().Split(',');

return strColumn;

}

/// <summary>

/// BindDataToClassProperty 的摘要说明。

/// 数据库表对象到相应的类对象的属性捆定,并将数据记录赋值于相应对象

/// obj 是前台类对象

/// TableName 要查询的表名

/// Condition 要查询的条件

/// </summary>

public static void BindDataToClassProperty(object obj,string TableName, string Condition)

{

Type objType =obj.GetType(); //反射当前类的所有属性

PropertyInfo[] objPropertiesArray = objType.GetProperties();

string RowData="";//用于获得数据库的常量

DataRow daiRow=DbAccess.Select(TableName,GetTableColum(TableName),Condition).Tables[0].Rows[0];

foreach(DataColumn c in DbAccess.Select(TableName,GetTableColum(TableName),Condition).Tables[0].Columns)

{

RowData=daiRow[c.ToString()].ToString();

foreach (PropertyInfo objProperty in objPropertiesArray)

{

// 检查匹配的名称和类型

if (objProperty.Name.ToUpper() == c.ToString().ToUpper())

{

// 将控件的属性设置为业务对象属性值

try

{

if (RowData=="True") RowData="1"; //如果是真假类型

if (RowData=="False") RowData="0";

objProperty.SetValue(obj, RowData , null);

//return true;

}

catch

{

//return false;

}

}

}

//return false;

}

// return false;

}

/// <summary>

/// BindClassPropertyToData 的摘要说明。

/// 相应的类对象的属性捆定到数据库表对象,并将数据记录赋值于相应对象

/// obj 是前台类对象

/// TableName 要查询的表名

/// Condition 要查询的条件

/// </summary>

public static void BindClassPropertyToData(object obj,string TableName, string Condition)

{

Type objType =obj.GetType(); //反射当前类的所有属性

PropertyInfo[] objPropertiesArray = objType.GetProperties();

int ColumnNum=0; //当前列的序列号

object[] strValue=new object[GetTableColum(TableName).Length] ; // 初始化要返回的对象 字符串在webconfig中

foreach(string c in GetTableColum(TableName))

{

foreach (PropertyInfo objProperty in objPropertiesArray)

{

// 检查匹配的名称和类型

if (objProperty.Name.ToUpper() == c.ToString().ToUpper())

{

// 将控件的属性设置为业务对象属性值

try

{

strValue[ColumnNum]= objProperty.GetValue(obj, null).ToString();

//return true;

}

catch

{

//return false;

}

}

}

ColumnNum++;

//return false;

}

DbAccess.Update(TableName,GetTableColum(TableName),strValue,Condition);

}

/// <summary>

/// BindClassPropertyToData 的摘要说明。

/// 相应的类对象的属性捆定到数据库表对象,并将数据记录赋值于相应对象

/// obj 是前台类对象

/// TableName 要查询的表名

/// Opera 操作的类型 0:为插入

/// </summary>

///

public static void BindClassPropertyToData(object obj,string TableName, int Opera)

{

Type objType =obj.GetType(); //反射当前类的所有属性

PropertyInfo[] objPropertiesArray = objType.GetProperties();

int ColumnNum=0; //当前列的序列号

object[] strValue=new object[GetTableColum(TableName).Length] ; // 初始化要返回的对象 字符串在webconfig中

foreach(string c in GetTableColum(TableName))

{

foreach (PropertyInfo objProperty in objPropertiesArray)

{

// 检查匹配的名称和类型

if (objProperty.Name.ToUpper() == c.ToString().ToUpper())

{

// 将控件的属性设置为业务对象属性值

try

{

strValue[ColumnNum]= objProperty.GetValue(obj, null).ToString();

//return true;

}

catch

{

//return false;

}

}

}

ColumnNum++;

//return false;

}

if (Opera==0)

{

strValue[0]=DbAccess.SelectMaxID(TableName,TableName+"ID");

DbAccess.Insert(TableName,GetTableColum(TableName),strValue);

}

}

}

}

这样将来如果改了数据库,只要使用webconfig中的指定关键字的值,并修改相应的数据库类代码就OK了,不再需要去做别的修改了

。我的例子的数据库连接类采用了抽象类工厂的设计模式,它的好处相信各位早就知道了。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有