网站首页 > 网络编程教程 > ASP.NET教程 > Object/DataSet Relational Mapping(对象/数据集关系映射)

Object/DataSet Relational Mapping(对象/数据集关系映射)

  • 作者:互联网
  • 时间:2009-07-01 16:14:47

在.Net的开发领域,您和您的公司是不是在为以下问题所困扰

1.***aSet中DataRow只能以DataTable[0].Rows[0][“Name”]的方式获取数据

2.Sql配置的不动态,不清晰的Sql拼凑

3.使用JAVA 的ORM设计.Net,使用对象层,每一次修改都将影响反射的对象。

那么请继续看下面的文章

Object/DataSet Relational Mapping

(对象/数据集关系映射)

Ni***ee.ODRM模式可以很好的解决以上问题

1.***aSet中DataRow只能以DataTable[0].Rows[0][“Name”]的方式获取数据

方案:DataRow转化为序列化对象,但序列化对象只作为清晰的对象操作实体处理业务判断和数据

2.Sql配置的不动态,不清晰的Sql拼凑

方案:采用IBatisNet数据层构架,采用IBatisNet动态的SQL语法,但返回DataSet

3.使用JAVA 的ORM设计.Net,使用对象层,每一次修改都将影响反射的对象。

方案:清晰的O(对象层),无反射机制,避免每一次修改对对象层的改动。

下面做详细的说明

       以下代码演示将包含在Ni***ee.Framework.2.0.1.2以上版本中,当然,我们只是提供一种思想,灵活的方案,仅代表TheFallAngel团队的思想。

       必须引用的dll

       IBatisNet(Version 1.5及其以后) with Ni***ee.Framework修改版本

       Ni***ee.Web.UI(Version 2006.2.1447及其以后版本)

1.      cX***User.cs

using System;

using Sy***m.Data;

using Sy***m.Configuration;

using Sy***m.Web;

using Sy***m.Web.Security;

using Sy***m.Web.UI;

using Sy***m.Web.UI.WebControls;

using Sy***m.Web.UI.WebControls.WebParts;

using Sy***m.Web.UI.HtmlControls;

 

///

/// cXTM_User.序列化

///

[Serializable]

public class cXTM_User

{

    private int _dID;

    private string _userName;

    public cXTM_User()

    {

        //

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

        //

    }

    public int DID

    {

        get

        {

            return _dID;

        }

        set

        {

            _dID = value;

        }

    }

    public string UserName

    {

        get

        {

            return _userName;

        }

        set

        {

            _userName = value;

        }

    }

    ///

    /// Propertylist中数组请定义该类中属性,并确保名称唯一性

    /// 以及与XTM_User中SelectXTM_UserByKey_Test中查询名称统一

    ///

    public string[] Propertylist

    {

        get

        {

            return new string[] { "UserName", "DID" };

        }

    }

}

2.      XT***ser.xml

http://ib***.apache.org/mapping">http://ib***.apache.org/mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

        

 

3.      te***aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="te***aspx.cs" Inherits="ODRM_test" %>

<%@ Register Assembly="Ni***ee.Web.UI" Namespace="Ni***ee.Web.UI" TagPrefix="NickLee" %>

http://ww***.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http://ww***.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

http://ww***.org/1999/xhtml">http://ww***.org/1999/xhtml" >

    Object/DataSet Relational Mapping(对象/数据集关系映射)

   

   

       

       

   

4.      te***aspx.cs

using System;

using Sy***m.Data;

using Sy***m.Configuration;

using Sy***m.Collections;

using Sy***m.Web;

using Sy***m.Web.Security;

using Sy***m.Web.UI;

using Sy***m.Web.UI.WebControls;

using Sy***m.Web.UI.WebControls.WebParts;

using Sy***m.Web.UI.HtmlControls;

 

using IB***sNet.DataMapper;

using Sy***m.Reflection;

 

public partial class ODRM_test : PageBase

{

    protected void Page_Load(object sender, EventArgs e)

    {

        if (!IsPostBack)

        {

            DataSet set11 = Ma***r.Instance().QueryForDataSet("SelectXTM_UserByKey_Test",UIhashtable);

            DataTable table1 = ConvertDataTable(set11, "");

            //这里为自己定义的序列化类

            cXTM_User[] objModel = new cXTM_User[ta***1.Rows.Count];

            //DataTable转化为序列化类数组

            for (int y = 0; y < ta***1.Rows.Count; y++)

            {

                objModel[y] = new cXTM_User();

                DataTableReturnOO(ta***1.Rows[y], objModel[y]);

            }

            //以DataSet模式绑定

            Ex***aGrid1.DataSource = table1;

            //以序列化对象模式绑定

            //Ex***aGrid1.DataSource = objModel;

            Ex***aGrid1.DataBind();

        }

    }

 

    protected void ExDataGrid1_ItemDataBound(object sender, DataGridItemEventArgs e)

    {

        /*

         * 该部分应用范围

         * 查询一条数据的修改,可以用ob***del.UserName

         * 而不必再使用DataTable[0].Rows[0]["UserName"]的模式

         * 提高面向对象的程度,并减少业务流程部分编码

         */

 

        if (e.***m.ItemIndex != -1)

        {

            cXTM_User objModel = new cXTM_User();

           

            //如果为DataSet填充的DataGrid

            if (e.***m.DataItem.GetType().FullName == "Sy***m.Data.DataRowView")

            {

                DataTableReturnOO((DataRow)((DataRowView)e.***m.DataItem).Row, objModel);     

            }

            //否则认为为序列化对象填充

            else

            {

                objModel = (cXTM_User)e.***m.DataItem;

                  

            }

        }

    }

 

    ///

    /// DataSet转化为序列化类函数,类定义参考cXTM_User

    ///

    private void DataTableReturnOO(DataRow row, cXTM_User objModel)

    {

        Hashtable hTable = new Hashtable();

        hTable = ReturnHashtable(row);

 

        Type entitytype = Ty***GetType(ob***del.GetType().AssemblyQualifiedName);

 

        for (int j = 0; j < ob***del.Propertylist.Length; j++)

        {

            PropertyInfo propertyinfo = en***ytype.GetProperty(ob***del.Propertylist[j]);

            pr***rtyinfo.SetValue(objModel, hTable[ob***del.Propertylist[j]], null);

        }

 

    }

 

    ///

    /// 转换为DataTable

    ///

    /// 数据源

    /// 数据表名称

    public static DataTable ConvertDataTable(object Source, string DataMember)

    {

        DataTable baseTable = new DataTable();

        if (Source is DataTable)

        {

            baseTable = (DataTable)Source;

            return baseTable;

        }

        if (Source is DataSet)

        {

 

            DataSet set1 = (DataSet)Source;

            if ((se***Tables.Count > 1) && ((DataMember == null) || (DataMember == "")))

            {

                throw new Exception("If there is more than one table in your dataset, you must define the DataMember property to specify which table to use.");

            }

            if (se***Tables.Count < 1)

            {

                throw new Exception("There are no tables in the datasource.");

            }

            if ((DataMember != null) && (DataMember != ""))

            {

                baseTable = se***Tables[DataMember];

                return baseTable;

            }

            else

            {

                baseTable = se***Tables[0];

                return baseTable;

            }

          

        }

        return baseTable;

    }

 

    ///

    /// 返回DataTable为哈希表键值对

    ///

    /// 数据行对象

    ///

    public static Hashtable ReturnHashtable(DataRow SourceRow)

    {

        Hashtable hTable = new Hashtable();

        IList list = So***eRow.ItemArray;

        object[] tObj = new object[So***eRow.Table.Columns.Count];

 

        for (int i = 0; i < So***eRow.Table.Columns.Count; i++)

        {

            tObj[So***eRow.Table.Columns.IndexOf(So***eRow.Table.Columns[i].ColumnName)] = So***eRow.Table.Columns[i].ColumnName;

        }

 

        for (int x = 0; x < li***Count; x++)

        {

            hT***e.Add(tObj[x].ToString(), list[x]);

        }

        return hTable;

    }

 

}

5.      Pa***ase.cs

using System;

using Sy***m.Data;

using Sy***m.Configuration;

using Sy***m.Web;

using Sy***m.Web.Security;

using Sy***m.Web.UI;

using Sy***m.Web.UI.WebControls;

using Sy***m.Web.UI.WebControls.WebParts;

using Sy***m.Web.UI.HtmlControls;

 

using Sy***m.Reflection;

using Sy***m.Text;

using Sy***m.Collections;

 

//namespace可要可不要

//namespace Fr***work.Web.UIProcess

//{

///

/// PageBase 的摘要说明

///

///

/// 页面层(表示层)基类,所有页面继承该页面

///

    public class PageBase : Sy***m.Web.UI.Page

    {

 

 

        #region 整个系统存在部分

        private string _baseselect;

        ///

        /// 查询字段

        ///

        protected string baseselect

        {

            get

            {

                // TODO: 添加 Ba***ule.OperationCode getter 实现

                return _baseselect;

            }

            set

            {

                // TODO: 添加 Ba***ule.OperationCode setter 实现

                _baseselect = value;

            }

        }

        ///

        /// 基类哈希表,在整个系统中存在

        ///

        protected Hashtable baseHashtable = new Hashtable();

        ///

        /// 界面哈希表,获取UI工厂获取的控件和控件值

        ///

        protected Hashtable UIhashtable = new Hashtable();

        ///

        /// 出错提示,默认值""

        ///

        protected string errMsg = "";

        ///

        /// 出错状态,默认值false

        ///

        protected bool errState = false;

        ///

        /// 私有变量_UISet

        ///

        private DataSet _UISet = new DataSet();

        ///

        /// 界面层数据集

        ///

        protected DataSet UISet

        {

            get

            {

                // TODO: 添加 Ba***ule.OperationCode getter 实现

                return _UISet;

            }

            set

            {

                // TODO: 添加 Ba***ule.OperationCode setter 实现

                _UISet = value;

            }

        }

        private DataTable _UITable = new DataTable();

        ///

        /// 界面层数据表

        ///

        protected DataTable UITable

        {

            get

            {

                // TODO: 添加 Ba***ule.OperationCode getter 实现

                return _UITable;

            }

            set

            {

                // TODO: 添加 Ba***ule.OperationCode setter 实现

                _UITable = value;

            }

        }

 

        private string _pageTitle = "";

        ///

        /// 页面标题

        ///

        protected string pageTitle

        {

            get

            {

                // TODO: 添加 Ba***ule.OperationCode getter 实现

                return _pageTitle;

            }

            set

            {

                // TODO: 添加 Ba***ule.OperationCode setter 实现

                _pageTitle = value;

            }

        }

        #endregion

 

        #region 查询页面存在部分

        ///

        /// List页面基类哈希表

        ///

        protected Hashtable baseListHashtable = new Hashtable();

        ///

        /// 页面总数.变量.1000w、10000w数据集使用

        ///

        protected int pageCount;

 

        ///

        /// 记录总数.变量.1000w、10000w数据集使用

        ///

        protected int recordCount;

        ///

        /// 记录总数.属性.1000w、10000w数据集使用

        ///

        protected int RecordCount

        {

            get

            {

                return recordCount;

            }

        }

        #endregion

 

        #region 编辑页面存在部分

        ///

        /// Edit页面基类哈希表

        ///

        protected Hashtable baseEditHashtable = new Hashtable();

        ///

        /// Edit页面,编辑数据哈希表

        ///

        protected Hashtable baseEditFillHashtable = new Hashtable();

        #endregion

 

 

        ///

        /// 构造函数

        ///

        public PageBase()

        {

            th***Load += new EventHandler(PageBase_Load);

        }

 

        private void PageBase_Load(object sender, EventArgs e)

        {

            if (!Pa***IsPostBack)

            {

 

                //整个流程需要的控制部分

                if (Session["baseHashtable"] != null)

                {

                    //从Session中获取哈希对象列表

                    baseHashtable = (Hashtable)Session["baseHashtable"];

                }

 

                //编辑页面访问权限和访问控制,只在第一次载入页面的时候有效

                if (Session["baseEditHashtable"] != null)

                {

                    //获取Edit页面哈希对象列表

                    baseEditHashtable = (Hashtable)Session["baseEditHashtable"];

                    //获取完后释放对应Session对象

                    Se***on.Remove("baseEditHashtable");

                }

                else

                {

                    //如果为初始状态,新增是否安全编辑状态值,默认值false,不安全

                    ba***ditHashta***.Add("EditSafeState", false);

                }

            }

 

            //查询页面访问控制

            if (Session["baseListHashtable"] != null)

            {

                //获取Edit页面哈希对象列表

                baseListHashtable = (Hashtable)Session["baseListHashtable"];

                //获取完后释放对应Session对象

                Se***on.Remove("baseListHashtable");

            }

            else

            {

                //如果为初始状态,新增是否刷新查询页面,默认值false,不刷新

                ba***istHashta***.Add("IsRefresh", false);

            }

        }

 

 

        #region UI通用函数

        ///

        /// 抛出出错消息提示

        ///

        /// 页面

        /// 出错消息

        protected void throwErrMsg(Page page, string errMsg)

        {

            pa***Response.Write("");

        }

 

        ///

        /// 刷新打开编辑窗体的List页面

        ///

        /// 页面

        protected void parentPageRefresh(Page page)

        {

            StringBuilder scriptString = new StringBuilder();

            sc***tString.Append("