Haben Sie und Ihr Unternehmen im Bereich der .Net-Entwicklung Probleme mit den folgenden Problemen?
1. DataRow in DataSet kann Daten nur in der Form DataTable[0].Rows[0]["Name"] abrufen.
2. SQL-Konfiguration Das SQL ist nicht dynamisch und klar.
3. Verwenden Sie JAVAs ORM zum Entwerfen von .Net und verwenden Sie die Objektebene. Jede Änderung wirkt sich auf das reflektierte Objekt aus.
Dann lesen Sie bitte den folgenden Artikel weiter:
Object/DataSet Relational Mapping
(Object/DataSet Relational Mapping)
NickLee.ODRM-Modus kann die oben genannten Probleme gut lösen
1. DataRow in DataSet kann nur DataTable[0].Rows[0][" sein Name"] Methode zum Erhalten einer Datenlösung
: DataRow wird in ein serialisiertes Objekt konvertiert, das serialisierte Objekt wird jedoch nur als klare Objektoperationseinheit zur Verarbeitung von Geschäftsurteilen und Daten verwendet.
2. Die SQL-Konfiguration ist keine dynamische und unklare SQL-Patchwork-
Lösung: Verwenden Sie die IBatisNet-Datenschichtarchitektur, verwenden Sie die dynamische SQL-Syntax von IBatisNet, geben Sie jedoch DataSet
3 zurück. Verwenden Sie JAVAs ORM, um .Net zu entwerfen und die Objektschicht zu verwenden. Jede Änderung wirkt sich auf das reflektierte Objekt aus.
Lösung: O (Objektebene) löschen, kein Reflexionsmechanismus, Änderungen an der Objektebene bei jeder Änderung vermeiden.
Eine ausführliche Erklärung finden Sie weiter unten.
Die folgende Codedemonstration wird in NickLee.Framework.2.0.1.2 und höher enthalten sein. Natürlich stellen wir nur eine Idee und eine flexible Lösung bereit, die nur die Denkweise des TheFallAngel-Teams darstellt.
Die DLL, auf die verwiesen werden muss
IBatisNet (Version 1.5 und höher) mit der von NickLee.Framework modifizierten Version
NickLee.Web.UI (Version 2006.2.1447 und höher)
1. cXTM_User.cs
using System.Data
;
using System.Configuration;
Verwendung von System.Web;
Verwendung
von System.Web.UI.WebControls;
Verwendung
von System.Web.UI.WebControls
;
/// <summary>
/// cXTM_User.Serialization
/// </summary>
[Serialisierbar]
public class cXTM_User
{
private int _dID;
private string _userName;
public cXTM_User()
{
//
// TODO: Hier hinzufügen Konstruktorlogik
/ /
}
public int DID
{
get
{
return _dID;
}
}
public string UserName
{
get
{
return
_userName
= value
;
}
}
///
<summary>
//
/
Bitte definieren
Sie
die
Eigenschaften in dieser Klasse für das Array in der Propertylist und stellen Sie sicher, dass der Name eindeutig
/// und mit dem Abfragenamen in SelectXTM_UserByKey_Test in XTM_User /// konsistent
ist. </summary>
public string[] Propertylist
{
get
{
return new string[ ] { " UserName", "DID" }
}
}
}
2
.
ibatis.apache .org/mapping " xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance ">
<statements>
<select id='SelectXTM_UserByKey_Test' parameterClass='System.Collections.Hashtable'>
SELECT
Top 5
[DID],
[UserName],
[LoginName],
[PWD],
[LoginFlag],
[StopFlag],
[LoginTime],
[LASTUPDATE]
FROM [XTM_User]
</select>
</statements>
</sqlMap>
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" %>
<!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 Relational Mapping(Object/DataSet Relationship 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.Data
;
using
System.Collections
;
Web:
Verwendung von System.Web.UI
;
Verwendung von System.Web.UI.WebControls;
Verwendung von System.Web.UI.WebControls
;
mit IBatisNet.DataMapper;
mit System.Reflection;
öffentliche Teilklasse 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, " ");
//Hier ist die selbstdefinierte Serialisierungsklasse
cXTM_User[] objModel = new cXTM_User[table1.Rows.Count];
//DataTable wird in ein Serialisierungsklassen-Array konvertiert
für (int y = 0; y < table1.Rows . Count; y++)
{
objModel[y] = new cXTM_User();
DataTableReturnOO(table1.Rows[y], objModel[y]);
//
BindExDataGrid1.DataSource = table1
im DataSet-Modus
; Bindung
//ExDataGrid1.DataSource = objModel;
ExDataGrid1.DataBind(
)
;
protected void ExDataGrid1_ItemDataBound(object sender, DataGridItemEventArgs e)
{
/*
* Der Anwendungsbereich dieses Teils
* Um die Änderung eines Datenelements abzufragen, können Sie objModel.UserName
* anstelle von DataTable[0].Rows[0] verwenden. ["Benutzername"] Muster
* Verbessern Sie den Grad der Objektorientierung und reduzieren Sie einen Teil der Geschäftsprozesscodierung
*/
if (e.Item.ItemIndex != -1)
{
cXTM_User objModel = new cXTM_User();
//Wenn das DataGrid für das DataSet gefüllt ist
if (e.Item.DataItem.GetType().FullName == "System.Data.DataRowView")
{
DataTableReturnOO((DataRow)((DataRowView)e.Item.DataItem). Row, objModel);
}
//Ansonsten wird es als gefülltes serialisiertes Objekt betrachtet
else
{
objModel = (cXTM_User)e.Item.DataItem;
}
}
}
/// <summary>
/// DataSet wird in eine Serialisierungsklassenfunktion konvertiert, die Klassendefinition bezieht sich auf cXTM_User
/// </summary>
private void DataTableReturnOO(DataRow row, cXTM_User objModel)
{
Hashtable hTable = new Hashtable();
hTable = ReturnHashtable (Zeile);
Typ 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>
/// In DataTable konvertieren
/// </summary>
/// <param name="Source">Datenquelle</param>
/// <param name="DataMember">Name der Datentabelle </param>
public static DataTable ConvertDataTable(
object Source, string DataMember)
{
DataTable baseTable = new DataTable();
if (Source is DataTable)
{
baseTable = (DataTable)Source
}
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 Tabelle in Ihrem Datensatz müssen Sie die DataMember-Eigenschaft definieren, um anzugeben, welche Tabelle verwendet werden soll.");
}
if (set1.Tables.Count < 1)
{
throw new Exception("Es sind keine Tabellen in der Datenquelle vorhanden.");
}
if ((DataMember!
=
null) && (DataMember!
= ""))
{
baseTable =set1.Tables
[
DataMember
]
;
}
return baseTable;
}
/// <summary>
/// DataTable als Hash-Tabellen-Schlüssel-Wert-Paar zurückgeben
/// </summary>
/// <param name="SourceTable">Datenzeilenobjekt</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 ].Spaltenname;
}
for (int x = 0; x < list.Count; x++)
{
hTable.Add(tObj[
x
].ToString(), list[x])
;
}
5. PageBase.cs
unter Verwendung
vonSystem.Data
;
unter
Verwendung
von
System.Web.UI
.
Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Reflection;
using System.Text;
using System.Collections;
//Namespace ist erforderlich
//Namespace Framework.Web.UIProcess
//{
/// <summary>
/// Zusammenfassende Beschreibung von PageBase
/// </summary>
/// <summary>
/// Seitenebene ( Präsentationsebene ) Basisklasse, alle Seiten erben diese Seite
/// </summary>
öffentliche Klasse PageBase : System.Web.UI.Page
{
#region Das gesamte System verfügt über einen
privaten String _baseselect;
/// <summary>
/// Query field
/// </summary>
protected string baseselect
{
get
{
// TODO: BaseRule.OperationCode-Getter hinzufügen, um
return _baseselect
;
set
{
// TODO: BaseRule.OperationCode-Setter hinzufügen, um
_baseselect = value;
}
}
/// <summary>
/// Basisklassen-Hash-Tabelle, existiert im gesamten System
/// </summary>
protected Hashtable baseHashtable = new Hashtable( );
/// <summary>
/// Schnittstellen-Hash-Tabelle, ruft Steuerelemente und Kontrollwerte ab, die von der UI-Fabrik erhalten wurden
/// </summary>
protected Hashtable UIhashtable = new Hashtable();
/// <summary>
/// Fehleraufforderung, Standardwert „“
/// </summary>
protected string errMsg = „“;
/// <summary>
/// Fehlerstatus, Standardwert false
/// </summary>
protected bool errState = false;
/ // <summary>
/// Private Variable _UISet
/// </summary>
private DataSet = new DataSet(
/// <summary>
/// Schnittstellenschicht-Datensatz
/// </summary>
protected DataSet UISet
{
get
{
// TODO: BaseRule.OperationCode-Getter hinzufügen, um _UISet zu implementieren
;
}
set
{
//
TODO
:
BaseRule.OperationCode-Setter hinzufügen, um
_UISet = value;
/
// <summary >
/// Schnittstellenschicht-Datentabelle
/// </summary>
protected DataTable UITable
{
get
{
// TODO: BaseRule.OperationCode-Getter hinzufügen, um
return _UITable;
}
set
{
// TODO: BaseRule.OperationCode hinzufügen Setter zur Implementierung
von _UITable = value
}
}
private string _pageTitle = "";
/// <summary>
/// Seitentitel
/// </summary>
protected
string pageTitle
{
get
{
//
TODO: BaseRule.OperationCode-
Getter hinzufügen, um
return _pageTitlezu
implementieren;
TODO: BaseRule.OperationCode-Setter hinzufügen, um
_pageTitle = value;
}
}
#endregion
zu implementieren
#region Den vorhandenen Teil der Seite abfragen
/// <summary>
/// Hash-Tabelle der Basisklasse der Seite auflisten
/// </summary>
protected Hashtable baseListHashtable = new Hashtable();
/// <summary>
/// Total Anzahl der Seiten. 1000w, 10000w Datensatznutzung
/// </summary>
protected int pageCount;
/// <summary>
/// Verwendung von 1000w- und 10000w-Datensätzen
/// </summary>
protected int recordCount;
///
Gesamtzahl der Datensätze. 1000-W- und 10000-W-Datensätze Verwenden Sie
/// </summary>
protected int RecordCount
{
get
{
return recordCount
}
}
#endregion
#region Der vorhandene Teil der Bearbeitungsseite
/// <summary>
/// Basisklassen-Hash-Tabelle der Bearbeitungsseite
/// </summary>
protected Hashtable baseEditHashtable = new Hashtable();
/// <summary>
/// Bearbeiten Seite, Daten-Hash-Tabelle bearbeiten
/// </summary>
protected Hashtable baseEditFillHashtable = newHashtable
();
/// <summary>
/// Konstruktor
/// </summary>
public PageBase()
{
this.Load += new EventHandler(PageBase_Load)
;
private void PageBase_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
//Der für den gesamten Prozess erforderliche Kontrollteil
if (Session["baseHashtable"] != null)
{
//Holen Sie sich die Hash-Objektliste von Session
baseHashtable = (Hashtable)Session["baseHashtable"]
}
//Zugriffsrechte und Zugriffskontrolle für die Seite bearbeiten sind nur gültig, wenn die Seite zum ersten Mal geladen wird
if (Session["baseEditHashtable"] != null)
{
//Hash-Objektliste der Seite bearbeiten abrufen
baseEditHashtable = (Hashtable)Session[ "baseEditHashtable"];
//Das entsprechende Sitzungsobjekt nach der Erfassung freigeben
Session.Remove("baseEditHashtable");
sonst
{
//
Wenn es sich um den Anfangszustand handelt, fügen Sie hinzu, ob das Bearbeiten des Zustandswerts sicher ist false, es ist unsicher.
baseEditHashtable.Add
("EditSafeState", false)
;
//Seitenzugriffskontrolle abfragen
if (Session["baseListHashtable"] != null)
{
//Seiten-Hash-Objektliste bearbeiten
baseListHashtable = (Hashtable)Session["baseListHashtable"];
//Das entsprechende Sitzungsobjekt nach der Erfassung freigeben
. .Remove("baseListHashtable");
}
else
{
//Wenn es der Anfangszustand ist, fügen Sie hinzu, ob die Abfrageseite aktualisiert werden soll. Der Standardwert ist false.
BaseListHashtable wird nicht aktualisiert.Add("IsRefresh", false)
;
}
#region UI allgemeine Funktion
/// <summary>
/// Fehlermeldung ausgeben
/// </summary>
/// <param name="page">Seite</param>
/// <param name=" errMsg" >Fehlermeldung</param>
protected void throwErrMsg(Page page, string errMsg)
{
page.Response.Write("<script>window.alert("" + errMsg.Replace(""", "'" ) + "");</script>");
}
/// <summary>
/// Aktualisieren Sie die Listenseite, die das Bearbeitungsformular öffnet
/// </summary>
/// <param name="page">Page</param>
protected void parentPageRefresh(Page page)
{
StringBuilder scriptString = new StringBuilder();
scriptString.Append("<script language = javascript>");
//Refresh() in Function.js aufrufen, um das übergeordnete Formular zu aktualisieren
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>
/// Seite zurücksetzen
/// </summary>
/// <param name="page">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>
/// Hashtable wird generiert, nachdem die JS-Schnittstellenfabrik übergeben wurde
/// </summary>
/// <param name="splitStr">JS-Schnittstellenfabrik wurde als Zeichenfolge übergeben</param>
/// < return></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)
{
//Abgefangene Zeichenfolge und Wert abrufen
table.Add(secondStr[1], secondStr[2 ]);
}
return
table;
}
#endregion
}
http://www.cnblogs.com/mail-ricklee/archive/2006/11/23/569270.html