在.Net的開發領域,您和您的公司是不是在為以下問題所困擾
1.DataSet中DataRow只能以DataTable[0].Rows[0][“Name”]的方式獲取數據
2.Sql配置的不動態,不清晰的Sql拼湊
3.使用java 的ORM設計.Net,使用對象層,每一次修改都將影響反射的對象。
那么請繼續看下面的文章
Object/DataSet Relational Mapping
(對象/數據集關系映射)
NickLee.ODRM模式可以很好的解決以上問題
1.DataSet中DataRow只能以DataTable[0].Rows[0][“Name”]的方式獲取數據
方案:DataRow轉化為序列化對象,但序列化對象只作為清晰的對象操作實體處理業務判斷和數據
2.Sql配置的不動態,不清晰的Sql拼湊
方案:采用IBatisNet數據層構架,采用IBatisNet動態的SQL語法,但返回DataSet
3.使用JAVA 的ORM設計.Net,使用對象層,每一次修改都將影響反射的對象。
方案:清晰的O(對象層),無反射機制,避免每一次修改對對象層的改動。
下面做詳細的說明
以下代碼演示將包含在NickLee.Framework.2.0.1.2以上版本中,當然,我們只是提供一種思想,靈活的方案,僅代表TheFallAngel團隊的思想。
必須引用的dll
IBatisNet(Version 1.5及其以后) with NickLee.Framework修改版本
NickLee.Web.UI(Version 2006.2.1447及其以后版本)
1. cXTM_User.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
/// <summary>
/// cXTM_User.序列化
/// </summary>
[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;
}
}
/// <summary>
/// Propertylist中數組請定義該類中屬性,并確保名稱唯一性
/// 以及與XTM_User中SelectXTM_UserByKey_Test中查詢名稱統一
/// </summary>
public string[] Propertylist
{
get
{
return new string[] { "UserName", "DID" };
}
}
}
2. XTM_User.xml
<?xml version='1.0' encoding='UTF-8' ?>
<sqlMap namespace='XTM_User' xmlns="aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="ODRM_test" %>
<%@ Register Assembly="NickLee.Web.UI" Namespace="NickLee.Web.UI" TagPrefix="NickLee" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " <html xmlns=" <head runat="server"> <title>Object/DataSet Relational Mapping(對象/數據集關系映射)</title> </head> <body> <form id="form1" runat="server"> <div> <NickLee:ExDataGrid ID="ExDataGrid1" runat="server" OnItemDataBound="ExDataGrid1_ItemDataBound"> </NickLee:ExDataGrid></div> </form> </body> </html> 4. test.aspx.cs using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using IBatisNet.DataMapper; using System.Reflection; public partial class ODRM_test : PageBase { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { DataSet set11 = Mapper.Instance().QueryForDataSet("SelectXTM_UserByKey_Test",UIhashtable); DataTable table1 = ConvertDataTable(set11, ""); //這里為自己定義的序列化類 cXTM_User[] objModel = new cXTM_User[table1.Rows.Count]; //DataTable轉化為序列化類數組 for (int y = 0; y < table1.Rows.Count; y++) { objModel[y] = new cXTM_User(); DataTableReturnOO(table1.Rows[y], objModel[y]); } //以DataSet模式綁定 ExDataGrid1.DataSource = table1; //以序列化對象模式綁定 //ExDataGrid1.DataSource = objModel; ExDataGrid1.DataBind(); } } protected void ExDataGrid1_ItemDataBound(object sender, DataGridItemEventArgs e) { /* * 該部分應用范圍 * 查詢一條數據的修改,可以用objModel.UserName * 而不必再使用DataTable[0].Rows[0]["UserName"]的模式 * 提高面向對象的程度,并減少業務流程部分編碼 */ if (e.Item.ItemIndex != -1) { cXTM_User objModel = new cXTM_User(); //如果為DataSet填充的DataGrid if (e.Item.DataItem.GetType().FullName == "System.Data.DataRowView") { DataTableReturnOO((DataRow)((DataRowView)e.Item.DataItem).Row, objModel); } //否則認為為序列化對象填充 else { objModel = (cXTM_User)e.Item.DataItem; } } } /// <summary> /// DataSet轉化為序列化類函數,類定義參考cXTM_User /// </summary> private void DataTableReturnOO(DataRow row, cXTM_User objModel) { Hashtable hTable = new Hashtable(); hTable = ReturnHashtable(row); Type entitytype = Type.GetType(objModel.GetType().AssemblyQualifiedName); for (int j = 0; j < objModel.Propertylist.Length; j++) { PropertyInfo propertyinfo = entitytype.GetProperty(objModel.Propertylist[j]); propertyinfo.SetValue(objModel, hTable[objModel.Propertylist[j]], null); } } /// <summary> /// 轉換為DataTable /// </summary> /// <param name="Source">數據源</param> /// <param name="DataMember">數據表名稱</param> 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 ((set1.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 (set1.Tables.Count < 1) { throw new Exception("There are no tables in the datasource."); } if ((DataMember != null) && (DataMember != "")) { baseTable = set1.Tables[DataMember]; return baseTable; } else { baseTable = set1.Tables[0]; return baseTable; } } return baseTable; } /// <summary> /// 返回DataTable為哈希表鍵值對 /// </summary> /// <param name="SourceTable">數據行對象</param> /// <returns></returns> public static Hashtable ReturnHashtable(DataRow SourceRow) { Hashtable hTable = new Hashtable(); IList list = SourceRow.ItemArray; object[] tObj = new object[SourceRow.Table.Columns.Count]; for (int i = 0; i < SourceRow.Table.Columns.Count; i++) { tObj[SourceRow.Table.Columns.IndexOf(SourceRow.Table.Columns[i].ColumnName)] = SourceRow.Table.Columns[i].ColumnName; } for (int x = 0; x < list.Count; x++) { hTable.Add(tObj[x].ToString(), list[x]); } return hTable; } } 5. PageBase.cs using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Reflection; using System.Text; using System.Collections; //namespace可要可不要 //namespace Framework.Web.Uiprocess //{ /// <summary> /// PageBase 的摘要說明 /// </summary> /// <summary> /// 頁面層(表示層)基類,所有頁面繼承該頁面 /// </summary> public class PageBase : System.Web.UI.Page { #region 整個系統存在部分 private string _baseselect; /// <summary> /// 查詢字段 /// </summary> protected string baseselect { get { // TODO: 添加 BaseRule.OperationCode getter 實現 return _baseselect; } set { // TODO: 添加 BaseRule.OperationCode setter 實現 _baseselect = value; } } /// <summary> /// 基類哈希表,在整個系統中存在 /// </summary> protected Hashtable baseHashtable = new Hashtable(); /// <summary> /// 界面哈希表,獲取UI工廠獲取的控件和控件值 /// </summary> protected Hashtable UIhashtable = new Hashtable(); /// <summary> /// 出錯提示,默認值"" /// </summary> protected string errMsg = ""; /// <summary> /// 出錯狀態,默認值false /// </summary> protected bool errState = false; /// <summary> /// 私有變量_UISet /// </summary> private DataSet _UISet = new DataSet(); /// <summary> /// 界面層數據集 /// </summary> protected DataSet UISet { get { // TODO: 添加 BaseRule.OperationCode getter 實現 return _UISet; } set { // TODO: 添加 BaseRule.OperationCode setter 實現 _UISet = value; } } private DataTable _UITable = new DataTable(); /// <summary> /// 界面層數據表 /// </summary> protected DataTable UITable { get { // TODO: 添加 BaseRule.OperationCode getter 實現 return _UITable; } set { // TODO: 添加 BaseRule.OperationCode setter 實現 _UITable = value; } } private string _pageTitle = ""; /// <summary> /// 頁面標題 /// </summary> protected string pageTitle { get { // TODO: 添加 BaseRule.OperationCode getter 實現 return _pageTitle; } set { // TODO: 添加 BaseRule.OperationCode setter 實現 _pageTitle = value; } } #endregion #region 查詢頁面存在部分 /// <summary> /// List頁面基類哈希表 /// </summary> protected Hashtable baseListHashtable = new Hashtable(); /// <summary> /// 頁面總數.變量.1000w、10000w數據集使用 /// </summary> protected int pageCount; /// <summary> /// 記錄總數.變量.1000w、10000w數據集使用 /// </summary> protected int recordCount; /// <summary> /// 記錄總數.屬性.1000w、10000w數據集使用 /// </summary> protected int RecordCount { get { return recordCount; } } #endregion #region 編輯頁面存在部分 /// <summary> /// Edit頁面基類哈希表 /// </summary> protected Hashtable baseEditHashtable = new Hashtable(); /// <summary> /// Edit頁面,編輯數據哈希表 /// </summary> protected Hashtable baseEditFillHashtable = new Hashtable(); #endregion /// <summary> /// 構造函數 /// </summary> public PageBase() { this.Load += new EventHandler(PageBase_Load); } private void PageBase_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { //整個流程需要的控制部分 if (session["baseHashtable"] != null) { //從Session中獲取哈希對象列表 baseHashtable = (Hashtable)Session["baseHashtable"]; } //編輯頁面訪問權限和訪問控制,只在第一次載入頁面的時候有效 if (Session["baseEditHashtable"] != null) { //獲取Edit頁面哈希對象列表 baseEditHashtable = (Hashtable)Session["baseEditHashtable"]; //獲取完后釋放對應Session對象 Session.Remove("baseEditHashtable"); } else { //如果為初始狀態,新增是否安全編輯狀態值,默認值false,不安全 baseEditHashtable.Add("EditSafeState", false); } } //查詢頁面訪問控制 if (Session["baseListHashtable"] != null) { //獲取Edit頁面哈希對象列表 baseListHashtable = (Hashtable)Session["baseListHashtable"]; //獲取完后釋放對應Session對象 Session.Remove("baseListHashtable"); } else { //如果為初始狀態,新增是否刷新查詢頁面,默認值false,不刷新 baseListHashtable.Add("IsRefresh", false); } } #region UI通用函數 /// <summary> /// 拋出出錯消息提示 /// </summary> /// <param name="page">頁面</param> /// <param name="errMsg">出錯消息</param> protected void throwErrMsg(Page page, string errMsg) { page.Response.Write("<script>window.alert(/"" + errMsg.Replace("/"", "'") + "/");</script>"); } /// <summary> /// 刷新打開編輯窗體的List頁面 /// </summary> /// <param name="page">頁面</param> protected void parentPageRefresh(Page page) { StringBuilder scriptString = new StringBuilder(); scriptString.Append("<script language = Javascript>"); //調用Function.js中的refresh()刷新父窗體 scriptString.Append("window.opener.refresh(false,/"/");"); scriptString.Append(" window.focus();"); scriptString.Append(" window.opener=null;"); scriptString.Append(" window.close(); "); scriptString.Append("</" + "script>"); page.Response.Write(scriptString.ToString()); } /// <summary> /// 重置頁面 /// </summary> /// <param name="page">頁面</param> protected void pageReset(Page page) { StringBuilder scriptString = new StringBuilder(); scriptString.Append("<script language = javascript>"); scriptString.Append(" this.location.reset(); "); scriptString.Append("</" + "script>"); page.Response.Write(scriptString.ToString()); } /// <summary> /// js界面工廠傳入后生成Hashtable /// </summary> /// <param name="splitStr">js界面工廠傳入字符串</param> /// <returns></returns> public Hashtable AjaxUIFactory(string splitStr) { string[] fristStr = splitStr.Split(','); Hashtable table = new Hashtable(); for (int x = 0; x < fristStr.Length; x++) { string[] secondStr = fristStr[x].Split('|'); if (secondStr.Length == 3) { //取截取后字符串和值 table.Add(secondStr[1], secondStr[2]); } } return table; } #endregion } http://www.survivalescaperooms.com/mail-ricklee/archive/2006/11/23/569270.html
新聞熱點
疑難解答