ในด้านการพัฒนา .Net คุณและบริษัทของคุณประสบปัญหาต่อไปนี้หรือไม่
1. DataRow ใน DataSet สามารถรับข้อมูลได้เฉพาะในรูปแบบ DataTable[0].Rows[0]["Name"]
2. การกำหนดค่า Sql Sql ไม่ใช่ไดนามิกและชัดเจน
3. ใช้ ORM ของ JAVA เพื่อออกแบบ .Net และใช้เลเยอร์อ็อบเจ็กต์
จากนั้นโปรดอ่านบทความต่อไปนี้
Object/DataSet Relational Mapping
(Object/Data Set Relational Mapping)
โหมด NickLee.ODRM สามารถแก้ปัญหาข้างต้นได้ดี
1. DataRow ในชุดข้อมูลสามารถเป็น DataTable[0].Rows[0][" เท่านั้น ชื่อ"] วิธีการรับ
โซลูชันข้อมูล: DataRow ถูกแปลงเป็นวัตถุซีเรียลไลซ์ แต่วัตถุซีเรียลไลซ์ถูกใช้เป็นเอนทิตีการดำเนินการวัตถุที่ชัดเจนเท่านั้นเพื่อประมวลผลการตัดสินใจทางธุรกิจและข้อมูล
2 การกำหนดค่า Sql ไม่ใช่
โซลูชันการแพตช์เวิร์ก Sql แบบไดนามิกและไม่ชัดเจน: ใช้สถาปัตยกรรมชั้นข้อมูล IBatisNet โดยใช้ไวยากรณ์ SQL แบบไดนามิกของ IBatisNet แต่ส่งคืนชุดข้อมูล
3 ใช้ ORM ของ JAVA เพื่อออกแบบ .Net และใช้เลเยอร์อ็อบเจ็กต์ ทุกการปรับเปลี่ยนจะส่งผลต่ออ็อบเจ็กต์ที่สะท้อน
วิธีแก้ไข: ล้าง O (เลเยอร์วัตถุ) ไม่มีกลไกการสะท้อน หลีกเลี่ยงการเปลี่ยนแปลงในเลเยอร์วัตถุทุกครั้งที่มีการแก้ไข
คำอธิบายโดยละเอียดแสดงไว้ด้านล่าง
การสาธิตโค้ดต่อไปนี้จะรวมอยู่ใน NickLee.Framework.2.0.1.2 และสูงกว่า แน่นอนว่าเราให้เฉพาะแนวคิดและโซลูชันที่ยืดหยุ่นเท่านั้น ซึ่งแสดงถึงความคิดของทีม TheFallAngel เท่านั้น
dll ที่ต้องอ้างอิง
IBatisNet (เวอร์ชัน 1.5 และใหม่กว่า) ที่มี NickLee.Framework เวอร์ชันแก้ไข
NickLee.Web.UI (เวอร์ชัน 2006.2.1447 และใหม่กว่า)
1. cXTM_User.cs
โดยใช้
System.Data
;
ใช้ System.Web
ใช้
System.Web.UI
ใช้
System.Web.UI.WebControls
;
/// <summary>
/// cXTM_User.Serialization
/// </summary>
[แบบอนุกรม]
คลาสสาธารณะ cXTM_User
{
private int _dID;
private string _userName;
public cXTM_User()
{
//
// TODO: เพิ่มที่นี่ ตรรกะ Constructor
/ /
}
public int DID
{
get
{
return
_dID;
}
set
{
_dID = value;
}
}
ชื่อผู้
ใช้
สตริงสาธารณะ
{
get
{
return _userName;
}
set
{
_userName =value
;
คุณสมบัติในคลาสนี้สำหรับอาร์เรย์ใน Propertylist และตรวจสอบให้แน่ใจว่าชื่อไม่ซ้ำกัน
/// และสอดคล้องกับชื่อแบบสอบถามใน SelectXTM_UserByKey_Test ใน XTM_User
/// </summary>
public string[] Propertylist
{
get
{
return new string[
]
{ " ชื่อผู้ใช้",
"
"
}
;
ibatis.apache .org/mapping " xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance ">
<statements>
<select id='SelectXTM_UserByKey_Test' parameterClass='System.Collections.Hashtable'>
เลือก
5 อันดับแรก
[DID],
[ชื่อผู้ใช้],
[LoginName],
[PWD],
[LoginFlag],
[StopFlag],
[LoginTime],
[LASTUPDATE]
จาก [XTM_User]
</select>
</statements>
</sqlMap>
3. test.aspx
<%@ ภาษาเพจ = "C#" AutoEventWireup = "true" CodeFile = "test.aspx.cs" สืบทอด = "ODRM_test" %>
<%@ Register Assembly = "NickLee.Web.UI" Namespace= "NickLee.Web.UI" TagPrefix="NickLee" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD /xhtml1-transitional.dtd ">
<html xmlns=" http://www.w3.org/1999/xhtml " >
<head runat="server">
<title>การแมปความสัมพันธ์ Object/DataSet (การแมปความสัมพันธ์ Object/DataSet )</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
ใช้ System.Data
;
ใช้
System.Configuration;
เว็บ ;
ใช้ System.Web.Security
;
ใช้
System.Web.UI.WebControls
;
ใช้ IBatisNet.DataMapper;
ใช้ System.Reflection;
สาธารณะบางส่วน ODRM_test : PageBase
{
ป้องกันโมฆะ Page_Load (ผู้ส่งวัตถุ EventArgs e)
{
if (!IsPostBack)
{
ชุดข้อมูล set11 = Mapper.Instance().QueryForDataSet("SelectXTM_UserByKey_Test",UIhashtable);
DataTable table1 = ConvertDataTable(set11, " ");
//นี่คือคลาสซีเรียลไลซ์เซชันที่กำหนดด้วยตนเอง
cXTM_User[] objModel = new cXTM_User[table1.Rows.Count];
//DataTable ถูกแปลงเป็นอาร์เรย์คลาสซีเรียลไลซ์เซชัน
สำหรับ (int y = 0; y < table1.Rows . Count; y++)
{
objModel[y] = new cXTM_User();
DataTableReturnOO(table1.Rows[y], objModel[y]);
//
BindExDataGrid1.DataSource = table1
ในโหมดชุดข้อมูล
; การเชื่อมโยง
//ExDataGrid1.DataSource = objModel;
ExDataGrid1.DataBind
()
;
protected void ExDataGrid1_ItemDataBound(object sender, DataGridItemEventArgs e)
{
/*
* ขอบเขตการใช้งานของส่วนนี้
* หากต้องการสอบถามการแก้ไขข้อมูล คุณสามารถใช้ objModel.UserName
* แทนการใช้ DataTable[0].Rows[0] ["ชื่อผู้ใช้"] รูปแบบ
* ปรับปรุงระดับของเชิงวัตถุและลดส่วนหนึ่งของการเข้ารหัสกระบวนการทางธุรกิจ
*/
ถ้า (e.Item.ItemIndex != -1)
{
cXTM_User objModel = new cXTM_User();
//หาก 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>
/// ชุดข้อมูลถูกแปลงเป็นฟังก์ชันคลาสการทำให้เป็นอนุกรม คำจำกัดความของคลาสอ้างถึง cXTM_User
/// </summary>
โมฆะส่วนตัว DataTableReturnOO(แถว DataRow, cXTM_User objModel)
{
Hashtable hTable = new Hashtable();
hTable = ReturnHashtable (แถว);
ประเภทentitytype = Type.GetType(objModel.GetType().AssemblyQualifiedName);
สำหรับ (int j = 0; j < objModel.Propertylist.Length; j ++)
{
PropertyInfo propertyinfo = enterttype.GetProperty (objModel.Propertylist [j]);
propertyinfo.SetValue (objModel, hTable [objModel.Propertylist [j]], null );
}
-
/// <summary>
/// แปลงเป็น DataTable
/// </summary>
/// <param name="Source">แหล่งข้อมูล</param>
/// <param name="DataMember">ชื่อตารางข้อมูล </param>
สาธารณะ DataTable ConvertDataTable (แหล่งที่มาของวัตถุ, สตริง DataMember)
{
DataTable baseTable = new DataTable();
if (Source is DataTable)
{
baseTable
=(
DataTable)Source;
return baseTable
;
ชุดข้อมูล set1 = (ชุดข้อมูล) แหล่งที่มา
if ((set1.Tables.Count > 1) && ((DataMember == null) || (DataMember == "")))
{
โยนข้อยกเว้นใหม่ ("ถ้ามีมากกว่าหนึ่งรายการ) คุณต้องกำหนดคุณสมบัติ DataMember เพื่อระบุตารางที่จะใช้");
}
if (set1.Tables.Count < 1)
{
Throw new Exception("There are no tables in the datasource.");
}
if ((DataMember != null) && (DataMember != ""))
{
baseTable = set1.Tables[DataMember];
}
อื่น
ๆ
{
baseTable
= set1.Tables[0]
;
}
ส่งคืนตารางฐาน;
}
/// <summary>
/// ส่งคืน DataTable เป็นคู่คีย์-ค่าของตารางแฮช
/// </summary>
/// <param name="SourceTable">วัตถุแถวข้อมูล</param>
/// <returns>< /returns>
สาธารณะ Hashtable ReturnHashtable (DataRow SourceRow)
{
Hashtable hTable = ใหม่ Hashtable();
IList list = SourceRow.ItemArray;
object[] tObj = new object[SourceRow.Table.Columns.Count];
สำหรับ (int i = 0; i < SourceRow.Table.Columns.Count; i++)
{
tObj[SourceRow.Table.Columns.IndexOf(SourceRow.Table.Columns[i].ColumnName)] = SourceRow.Table.Columns[i ].ชื่อคอลัมน์;
}
สำหรับ (int x = 0; x < list.Count; x++)
{
hTable.Add(tObj[x].ToString(), list[x]);
}
กลับ hTable
;
5.
PageBase.cs
ใช้
System.Data
;
ใช้ System.Web.Security
;
ใช้
System.Web.UI.WebControls
;
Web.UI.WebControls.WebParts
โดยใช้ System.Web.UI.HtmlControls;
ใช้ System.Reflection;
ใช้ System.Text
โดยใช้ System.Collections;
// จำเป็นต้องใช้เนมสเปซ
//namespace Framework.Web.UIProcess
//{
/// <summary>
/// คำอธิบายโดยสรุปของ PageBase
/// </summary>
/// <summary>
/// เลเยอร์หน้า ( เลเยอร์การนำเสนอ ) คลาสพื้นฐาน ทุกเพจสืบทอดเพจนี้
/// </summary>
คลาสสาธารณะ PageBase : System.Web.UI.Page
{
#region ทั้งระบบมี
สตริงส่วนตัว _baseselect;
/// <summary>
/// ฟิลด์ข้อความค้นหา
/// </summary>
สตริงที่ได้รับการป้องกัน
{
get
{
// TODO: เพิ่ม BaseRule.OperationCode getter เพื่อใช้
return _baseselect
;
ตั้ง
{
// สิ่งที่ต้องทำ: เพิ่มตัวตั้งค่า BaseRule.OperationCode เพื่อใช้
_baseselect = value;
}
}
/// <summary>
/// ตารางแฮชคลาสฐานมีอยู่ในทั้งระบบ
/// </summary>
ป้องกัน Hashtable baseHashtable = ใหม่ Hashtable( );
/// <summary>
/// ตารางแฮชของอินเทอร์เฟซ รับการควบคุมและค่าควบคุมที่ได้รับจากโรงงาน UI
/// </summary>
ป้องกัน Hashtable UIhashtable = new Hashtable();
/// <summary>
/// พร้อมท์ข้อผิดพลาด ค่าเริ่มต้น ""
/// </summary>
สตริงที่มีการป้องกัน errMsg = "";
/// <summary>
/// สถานะข้อผิดพลาด ค่าเริ่มต้น false
/// </summary>
บูลที่ได้รับการป้องกัน errState = false;
/ // <summary>
/// ตัวแปรส่วนตัว _UISet
/// </summary>
ชุดข้อมูลส่วนตัว _UISet = ชุดข้อมูลใหม่ ();
/// <summary>
/// ชุดข้อมูลเลเยอร์อินเทอร์เฟซ
/// </summary>
protected DataSet UISet
{
get
{
// TODO: เพิ่ม BaseRule.OperationCode getter เพื่อใช้
return
_UISet;
}
set
{
// TODO:เพิ่ม
BaseRule.OperationCode setter เพื่อใช้
_UISet = value;
}
}
// <summary >
/// ตารางข้อมูลเลเยอร์อินเทอร์เฟซ
/// </summary>
ป้องกัน DataTable UITable
{
รับ
{
// TODO: เพิ่ม BaseRule.OperationCode getter เพื่อใช้
return _UITable;
}
set
{
// TODO: เพิ่ม BaseRule.OperationCode
ตัวตั้งค่า
เพื่อใช้
_UITable = value
;
สตริงส่วนตัว _pageTitle = "";
/// <summary>
/// ชื่อหน้า
///
</summary>
สตริงที่ได้
รับการป้องกัน pageTitle
{
รับ
{
// TODO:เพิ่ม
BaseRule.OperationCode getter เพื่อใช้
return _pageTitle;
}
สิ่งที่ต้องทำ : เพิ่มตัวตั้งค่า BaseRule.OperationCode เพื่อใช้งาน
_pageTitle = value;
}
}
#endregion
#region สอบถามส่วนที่มีอยู่ของเพจ
/// <summary>
/// ตารางแฮชคลาสฐานของหน้ารายการ
/// </summary>
protected Hashtable baseListHashtable = new Hashtable();
/// <summary>
/// Total จำนวนหน้า ตัวแปร 1,000w, 10,000w การใช้ชุดข้อมูล
/// </summary>
ป้องกัน int pageCount;
/// <summary>
/// จำนวนบันทึกทั้งหมด การใช้ชุดข้อมูล 1,000w และ 10,000w
/// </summary>
int recordCount;
/// <summary>
/// จำนวนบันทึกทั้งหมด ชุดข้อมูล 1,000w และ 10,000w ใช้
/// </summary>
protected int RecordCount
{
get
{
return recordCount;
}
}
#endregion
#region ส่วนที่มีอยู่ของหน้าแก้ไข
/// <summary>
/// แก้ไขตารางแฮชคลาสฐานของหน้า
/// </summary>
ป้องกัน Hashtable baseEditHashtable = new Hashtable();
/// <summary>
/// แก้ไข หน้า แก้ไขตารางแฮชข้อมูล
/// </summary>
ป้องกัน Hashtable baseEditFillHashtable = new Hashtable()
;
/// <summary>
/// Constructor
/// </summary>
สาธารณะ PageBase()
{
this.Load += new EventHandler(PageBase_Load);
}
โมฆะส่วนตัว PageBase_Load (ผู้ส่งวัตถุ EventArgs e)
{
ถ้า (! Page.IsPostBack)
{
// ส่วนควบคุมที่จำเป็นสำหรับกระบวนการทั้งหมด
if (Session["baseHashtable"] != null)
{
//รับรายการวัตถุแฮชจาก Session
baseHashtable = (Hashtable)Session["baseHashtable"]
;
// แก้ไขสิทธิ์การเข้าถึงเพจและการควบคุมการเข้าถึงจะมีผลเฉพาะเมื่อมีการโหลดเพจเป็นครั้งแรก
หาก (เซสชัน ["baseEditHashtable"] != null)
{
// รับรายการวัตถุแฮชแก้ไขเพจ
baseEditHashtable = (Hashtable) เซสชัน [ "baseEditHashtable"];
//ปล่อยอ็อบเจ็กต์เซสชันที่เกี่ยวข้องหลังจากการได้มา
Session.Remove("baseEditHashtable");
}
else
{
//หากเป็นสถานะเริ่มต้น ให้เพิ่มว่าปลอดภัยหรือไม่ในการแก้ไขค่าสถานะ ค่าเริ่มต้นคือ
เท็จ
มันไม่ปลอดภัย
baseEditHashtable.Add ("EditSafeState", false)
;
// การควบคุมการเข้าถึงหน้าแบบสอบถาม
ถ้า (เซสชัน ["baseListHashtable"] != null)
{
// รับรายการวัตถุแฮชหน้าแก้ไข
baseListHashtable = (Hashtable) เซสชัน ["baseListHashtable"];
// ปล่อยวัตถุเซสชันที่เกี่ยวข้องหลังจากการได้
มา .Remove("baseListHashtable");
}
else
{
//หากเป็นสถานะเริ่มต้น ให้เพิ่มว่าจะรีเฟรชหน้าแบบสอบถามหรือไม่ ค่าเริ่มต้นเป็นเท็จ
baseListHashtable จะไม่ถูกรีเฟรช เพิ่ม("IsRefresh", false);
}
}
#region UI ฟังก์ชั่นทั่วไป
/// <summary>
/// โยนข้อความแสดงข้อผิดพลาด
/// </summary>
/// <param name="page">หน้า</param>
/// <param name=" errMsg" >ข้อความแสดงข้อผิดพลาด</param>
protected void ThrowErrMsg(หน้าเพจ สตริง errMsg)
{
page.Response.Write("<script>window.alert("" + errMsg.Replace(""", "'" ) + "");</script>");
}
/// <summary>
/// รีเฟรชหน้ารายการที่เปิดแบบฟอร์มแก้ไข
/// </summary>
/// <param name="page">หน้า</param>
ป้องกัน void parentPageRefresh(หน้าเพจ)
{
StringBuilder scriptString = new StringBuilder();
scriptString.Append("<script language = javascript>");
//เรียกรีเฟรช() ใน Function.js เพื่อรีเฟรชฟอร์มหลัก
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">Page</param>
protected void pageReset(Page page)
{
StringBuilder scriptString = new StringBuilder() ;
scriptString.Append("<ภาษาสคริปต์ = javascript>");
scriptString.Append(" this.location.reset(); ");
scriptString.Append("</" + "script>");
page.Response.Write(scriptString.ToString()
}
/// <summary>
/// Hashtable ถูกสร้างขึ้นหลังจากส่งผ่านโรงงานอินเตอร์เฟส js ใน
/// </summary>
/// <param name="splitStr">โรงงานอินเตอร์เฟส js ส่งผ่านในสตริง</param>
/// < return></returns>
Hashtable สาธารณะ AjaxUIFactory (สตริง 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)
{
//รับสตริงที่ดักจับและ
ตารางค่าเพิ่ม(secondStr[1], SecondStr[2) ]);
}
}
ตารางส่งคืน;
}
#endregion
}
http://www.cnblogs.com/mail-ricklee/archive/2006/11/23/569270.html