ในด้านการพัฒนา .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
;
///
/// cXTM_User.Serialization
///
[แบบอนุกรม]
คลาสสาธารณะ 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
///
public string[] Propertylist
{
get
{
return new string[
]
{ " ชื่อผู้ใช้",
"
"
}
;
ibatis.apache .org/mapping " xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance ">
เลือก
5 อันดับแรก
[DID],
[ชื่อผู้ใช้],
[LoginName],
[PWD],
[LoginFlag],
[StopFlag],
[LoginTime],
[LASTUPDATE]
จาก [XTM_User]
3. test.aspx
<%@ ภาษาเพจ = "C#" AutoEventWireup = "true" CodeFile = "test.aspx.cs" สืบทอด = "ODRM_test" %>
<%@ Register Assembly = "NickLee.Web.UI" Namespace= "NickLee.Web.UI" TagPrefix="NickLee" %>
http://www.w3.org/TR/xhtml1/DTD /xhtml1-transitional.dtd ">
http://www.w3.org/1999/xhtml " >
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;
}
}
}
///
/// ชุดข้อมูลถูกแปลงเป็นฟังก์ชันคลาสการทำให้เป็นอนุกรม คำจำกัดความของคลาสอ้างถึง cXTM_User
///
โมฆะส่วนตัว 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 );
}
-
///
/// แปลงเป็น DataTable
///
/// แหล่งข้อมูล
/// ชื่อตารางข้อมูล
สาธารณะ 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]
;
}
ส่งคืนตารางฐาน;
}
///
/// ส่งคืน DataTable เป็นคู่คีย์-ค่าของตารางแฮช
///
/// วัตถุแถวข้อมูล
///
สาธารณะ 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
//{
///
/// คำอธิบายโดยสรุปของ PageBase
///
///
/// เลเยอร์หน้า ( เลเยอร์การนำเสนอ ) คลาสพื้นฐาน ทุกเพจสืบทอดเพจนี้
///
คลาสสาธารณะ PageBase : System.Web.UI.Page
{
#region ทั้งระบบมี
สตริงส่วนตัว _baseselect;
///
/// ฟิลด์ข้อความค้นหา
///
สตริงที่ได้รับการป้องกัน
{
get
{
// TODO: เพิ่ม BaseRule.OperationCode getter เพื่อใช้
return _baseselect
;
ตั้ง
{
// สิ่งที่ต้องทำ: เพิ่มตัวตั้งค่า BaseRule.OperationCode เพื่อใช้
_baseselect = value;
}
}
///
/// ตารางแฮชคลาสฐานมีอยู่ในทั้งระบบ
///
ป้องกัน Hashtable baseHashtable = ใหม่ Hashtable( );
///
/// ตารางแฮชของอินเทอร์เฟซ รับการควบคุมและค่าควบคุมที่ได้รับจากโรงงาน UI
///
ป้องกัน Hashtable UIhashtable = new Hashtable();
///
/// พร้อมท์ข้อผิดพลาด ค่าเริ่มต้น ""
///
สตริงที่มีการป้องกัน errMsg = "";
///
/// สถานะข้อผิดพลาด ค่าเริ่มต้น false
///
บูลที่ได้รับการป้องกัน errState = false;
/ //
/// ตัวแปรส่วนตัว _UISet
///
ชุดข้อมูลส่วนตัว _UISet = ชุดข้อมูลใหม่ ();
///
/// ชุดข้อมูลเลเยอร์อินเทอร์เฟซ
///
protected DataSet UISet
{
get
{
// TODO: เพิ่ม BaseRule.OperationCode getter เพื่อใช้
return
_UISet;
}
set
{
// TODO:เพิ่ม
BaseRule.OperationCode setter เพื่อใช้
_UISet = value;
}
}
//
/// ตารางข้อมูลเลเยอร์อินเทอร์เฟซ
///
ป้องกัน DataTable UITable
{
รับ
{
// TODO: เพิ่ม BaseRule.OperationCode getter เพื่อใช้
return _UITable;
}
set
{
// TODO: เพิ่ม BaseRule.OperationCode
ตัวตั้งค่า
เพื่อใช้
_UITable = value
;
สตริงส่วนตัว _pageTitle = "";
///
/// ชื่อหน้า
///
สตริงที่ได้
รับการป้องกัน pageTitle
{
รับ
{
// TODO:เพิ่ม
BaseRule.OperationCode getter เพื่อใช้
return _pageTitle;
}
สิ่งที่ต้องทำ : เพิ่มตัวตั้งค่า BaseRule.OperationCode เพื่อใช้งาน
_pageTitle = value;
}
}
#endregion
#region สอบถามส่วนที่มีอยู่ของเพจ
///
/// ตารางแฮชคลาสฐานของหน้ารายการ
///
protected Hashtable baseListHashtable = new Hashtable();
///
/// Total จำนวนหน้า ตัวแปร 1,000w, 10,000w การใช้ชุดข้อมูล
///
ป้องกัน int pageCount;
///
/// จำนวนบันทึกทั้งหมด การใช้ชุดข้อมูล 1,000w และ 10,000w
///
int recordCount;
///
/// จำนวนบันทึกทั้งหมด ชุดข้อมูล 1,000w และ 10,000w ใช้
///
protected int RecordCount
{
get
{
return recordCount;
}
}
#endregion
#region ส่วนที่มีอยู่ของหน้าแก้ไข
///
/// แก้ไขตารางแฮชคลาสฐานของหน้า
///
ป้องกัน Hashtable baseEditHashtable = new Hashtable();
///
/// แก้ไข หน้า แก้ไขตารางแฮชข้อมูล
///
ป้องกัน Hashtable baseEditFillHashtable = new Hashtable()
;
///
/// Constructor
///
สาธารณะ 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 ฟังก์ชั่นทั่วไป
///
/// โยนข้อความแสดงข้อผิดพลาด
///
/// หน้า
/// ข้อความแสดงข้อผิดพลาด
protected void ThrowErrMsg(หน้าเพจ สตริง errMsg)
{
page.Response.Write("");
}
///
/// รีเฟรชหน้ารายการที่เปิดแบบฟอร์มแก้ไข
///
/// หน้า
ป้องกัน void parentPageRefresh(หน้าเพจ)
{
StringBuilder scriptString = new StringBuilder();
scriptString.Append("