في مجال تطوير .Net، هل تعاني أنت وشركتك من المشاكل التالية؟
1. يمكن لـ DataRow في DataSet الحصول على البيانات فقط في شكل DataTable[0].Rows[0]["Name"]
2. تكوين Sql Sql ليس ديناميكيًا وواضحًا
3. استخدم ORM الخاص بـ JAVA لتصميم .Net واستخدام طبقة الكائن. كل تعديل سيؤثر على الكائن المنعكس.
ثم يرجى الاستمرار في قراءة المقالة التالية
رسم الخرائط العلائقية للكائن/مجموعة البيانات
(التعيين العلائقي لمجموعة الكائنات/البيانات)
يمكن لوضع NickLee.ODRM حل المشكلات المذكورة أعلاه جيدًا
1. يمكن أن يكون DataRow في DataSet DataTable[0].Rows[0][" طريقة الاسم"] للحصول على
حل البيانات: يتم تحويل DataRow إلى كائن متسلسل، ولكن يتم استخدام الكائن المتسلسل فقط ككيان تشغيل كائن واضح لمعالجة حكم الأعمال والبيانات
2. تكوين Sql ليس ديناميكيًا وغير واضح.
حل خليط Sql: باستخدام بنية طبقة بيانات IBatisNet، باستخدام بناء جملة SQL الديناميكي لـ IBatisNet، مع إرجاع DataSet
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.Configuration؛
باستخدام System.Web
باستخدام System.Web.Security؛
باستخدام System.Web.UI؛
باستخدام
System.Web.UI.WebControls
؛
///
/// cXTM_User.Serialization
///
[Serializable]
public class cXTM_User
{
public int _dID
;
public cXTM_User()
{
//
// TODO: أضف هنا منطق المُنشئ
/ /
}
public int DID
{
get
{
return _dID
}
set
{
_dID = value
} }
public
string UserName
{
get
{
return _userName
}
set
{
_userName = value
}
}
///
// / يرجى تحديد الخصائص في هذه الفئة للمصفوفة في قائمة الخصائص، وتأكد من أن الاسم فريد
/// ومتوافق مع اسم الاستعلام في SelectXTM_UserByKey_Test في XTM_User
///
public string[] Propertylist
{
get
{
return new string[ ] { " UserName", "DID" };
}
}
}
2.XTM_User.xml
حدد
أعلى 5
[DID]،
[UserName]،
[LoginName]،
[PWD]،
[LoginFlag]،
[StopFlag]،
[LoginTime]،
[LASTUPDATE]
من [XTM_User]
3. test.aspx
<%@ Page Language = "C#" AutoEventWireup = "true" CodeFile = "test.aspx.cs" Inherits = "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
;
باستخدام System.Configuration
باستخدام
System.Collections;
Web؛
باستخدام System.Web.Security؛
باستخدام System.Web.UI؛
باستخدام
System.Web.UI.WebControls
؛
باستخدام IBatisNet.DataMapper
باستخدام System.Reflection؛
فئة عامة جزئية ODRM_test: PageBase
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataSet set11 = Mapper.Instance().QueryForDataSet("SelectXTM_UserByKey_Test",UIhashtable 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
في وضع DataSet
; ملزمة
//ExDataGrid1.DataSource
=
objModel
;
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();
// إذا تم ملء 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;
}
}
}
///
/// يتم تحويل DataSet إلى وظيفة فئة تسلسل، ويشير تعريف الفئة إلى cXTM_User
///
Private void DataTableReturnOO(DataRow Row, cXTM_User objModel)
{
Hashtable hTable = new Hashtable();
hTable = ReturnHashtable(row);
نوع الكيان = Type.GetType(objModel.GetType().AssemblyQualifiedName);
for (int j = 0; j < objModel.Propertylist.Length; j++)
{
PropertyInfo propertyinfo = الكيانtype.GetProperty(objModel.Propertylist[j]);
propertyinfo.SetValue(objModel, hTable[objModel.Propertylist[j]], null );
}
}
///
/// تحويل إلى DataTable
///
/// مصدر البيانات
/// اسم جدول البيانات
public
static
DataTable ConvertDataTable(object Source, string DataMember)
{
DataTable
baseTable = new
DataTable
(
)
;
DataSet set1 = (DataSet)Source;
if ((set1.Tables.Count > 1) && ((DataMember == null) || (DataMember == "")))
{
throw new Exception("إذا كان هناك أكثر من واحد" في مجموعة البيانات الخاصة بك، يجب عليك تحديد خاصية DataMember لتحديد الجدول الذي سيتم استخدامه.");
}
if (set1.Tables.Count < 1)
{
throw new Exception("لا توجد جداول في مصدر البيانات.");
}
if ((DataMember != null) && (DataMember!
= ""))
{
baseTable = set1.Tables[DataMember]
}
else
{
baseTable = set1.Tables[0
]
;
}
إرجاع الجدول الأساسي
}
///
/// إرجاع DataTable كزوج قيمة مفتاح جدول التجزئة
///
/// كائن صف البيانات
///
public static Hashtable ReturnHashtable(DataRow SourceRow)
{
Hashtable hTable = new Hashtable(
)
;
for (int i = 0; i < SourceRow.Table.Columns.Count; i++)
{
tObj[SourceRow.Table.Columns.IndexOf(SourceRow.Table.Columns[i].ColumnName)] = SourceRow.Table.Columns[i .اسم العمود
}
for (int x = 0; x < list.Count; x++)
{
hTable.Add(tObj[x].ToString(), list[x])
}
return hTable
}
}
5. PageBase.cs
باستخدام
System.Data
باستخدام
System.Configuration
؛
باستخدام
System.Web.Security
؛
Web.UI.WebControls.WebParts;
باستخدام System.Web.UI.HtmlControls;
باستخدام System.Reflection؛
باستخدام
System.Text؛
// مساحة الاسم مطلوبة
// مساحة الاسم Framework.Web.UIProcess
//{
///
/// وصف ملخص لـ PageBase
///
///
/// طبقة الصفحة ( طبقة العرض ) الفئة الأساسية، جميع الصفحات ترث هذه الصفحة
///
public class PageBase : System.Web.UI.Page
{
#region يحتوي النظام بأكمله على بعض
السلاسل الخاصة _baseselect;
///
/// حقل الاستعلام
///
protected string baseselect
{
get
{
// TODO: Add BaseRule.OperationCode getter to
return _baseselect
}
set
{
// TODO: أضف أداة ضبط BaseRule.OperationCode لتنفيذ
_baseselect = value
}
}
///
/// جدول تجزئة الفئة الأساسية موجود في النظام بأكمله
///
protected Hashtable baseHashtable = new Hashtable( );
///
/// جدول تجزئة الواجهة، يحصل على عناصر التحكم وقيم التحكم التي تم الحصول عليها من مصنع واجهة المستخدم
///
protected
Hashtable UIhashtable = new Hashtable();
/// موجه خطأ، القيمة الافتراضية ""
///
protected string errMsg = "";
///
/// حالة الخطأ، القيمة الافتراضية خاطئة
///
protected bool errState = false;
//
/// المتغير الخاص _UISet
///
public DataSet _UISet = new DataSet();
///
/// مجموعة بيانات طبقة الواجهة
///
protected DataSet UISet
{
get
{
// TODO: إضافة أداة BaseRule.OperationCode لتنفيذ
return _UISet;
}
set
{
// TODO:
إضافة
أداة ضبط BaseRule.OperationCode لتنفيذ
_UISet = value;
}
public DataTable _UITable = new DataTable();
//
/// جدول بيانات طبقة الواجهة
///
protected DataTable UITable
{
get
{
// TODO: إضافة BaseRule.OperationCode getter لتنفيذ
return _UITable
}
set
{
// TODO: Add BaseRule.OperationCode واضع لتنفيذ
_UITable = value
}
}
سلسلة خاصة _pageTitle = "";
///
/// عنوان الصفحة
///
سلسلة محمية pageTitle
{
get
{
// TODO: أضف أداة BaseRule.OperationCode للتنفيذ
return _pageTitle
}
set
{
// TODO: أضف أداة ضبط BaseRule.OperationCode لتنفيذ
_pageTitle = value;
}
}
#endregion
#region الاستعلام عن الجزء الموجود من الصفحة
///
/// جدول تجزئة الفئة الأساسية لصفحة القائمة
///
protected Hashtable baseListHashtable = new Hashtable();
///
/// Total عدد الصفحات: 1000 واط، 10000 واط استخدام مجموعة البيانات
///
protected int pageCount;
///
/// إجمالي عدد المتغيرات. استخدام مجموعات البيانات 1000 واط و10000 واط
///
protected int reportCount;
///
/// إجمالي عدد السجلات. استخدم مجموعات البيانات 1000 واط و10000 واط
///
protected int RecordCount
{
get
{
return RecordCount
}
}
#endregion
#region الجزء الموجود من صفحة التحرير
///
/// تحرير جدول تجزئة الفئة الأساسية للصفحة
///
protected Hashtable baseEditHashtable = new Hashtable()
///
/// تحرير الصفحة، تحرير جدول تجزئة البيانات
///
protected Hashtable baseEditFillHashtable = new Hashtable()
#endregion
///
/// المُنشئ
///
public PageBase()
{
this.Load += new EventHandler(PageBase_Load })
;
Private void PageBase_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
// جزء التحكم المطلوب للعملية بأكملها
if (Session["baseHashtable"] != null)
{
// احصل على قائمة كائنات التجزئة من الجلسة
baseHashtable = (Hashtable)Session["baseHashtable"]
}
;
// تحرير حقوق الوصول إلى الصفحة والتحكم في الوصول صالحة فقط عند تحميل الصفحة لأول مرة
if (Session["baseEditHashtable"] != null)
{
// احصل على قائمة كائنات تجزئة الصفحة المعدلة
baseEditHashtable = (Hashtable)Session[ "baseEditHashtable"];
// حرر كائن الجلسة المقابل بعد الاستحواذ
Session.Remove("baseEditHashtable");
}
else
{
// إذا كانت هذه هي الحالة الأولية، فأضف ما إذا كان تعديل قيمة الحالة آمنًا، أم لا، فالقيمة الافتراضية هي
خطأ
، إنه غير آمن
baseEditHashtable.Add ("EditSafeState"، false)
؛
// التحكم في الوصول إلى صفحة الاستعلام
if (Session["baseListHashtable"] != null)
{
// احصل على قائمة كائنات تجزئة الصفحة القابلة للتحرير
baseListHashtable = (Hashtable)Session["baseListHashtable"];
// حرر كائن الجلسة المقابل بعد الاستحواذ
. .Remove("baseListHashtable");
}
else
{
// إذا كانت هذه هي الحالة الأولية، أضف ما إذا كنت تريد تحديث صفحة الاستعلام، فالقيمة الافتراضية خاطئة،
ولن يتم تحديث baseListHashtable.Add("IsRefresh"، false })
;
}
# الوظيفة العامة لواجهة المستخدم الخاصة بالمنطقة
///
/// رمي رسالة الخطأ
///
/// الصفحة
/// رسالة الخطأ
protected void throwErrMsg(Page page, string errMsg)
{
page.Response.Write("");
}
///
/// تحديث صفحة القائمة التي تفتح نموذج التحرير
///
/// الصفحة
protected voidparentPageRefresh(Page page)
{
StringBuilder scriptString = new StringBuilder();
scriptString.Append("