.Net 開発の分野で、あなたとあなたの会社は次のような問題に悩まされていませんか?
1. DataSet の DataRow は DataTable[0].Rows[0]["Name"] の形式でしかデータを取得できません。
2. SQL 設定SQL は動的ではなく明確です。
3. JAVA の ORM を使用して .Net を設計し、オブジェクト層を使用します。すべての変更は反映されたオブジェクトに影響します。
次に、次の記事を読み続けてください。
オブジェクト/データセット リレーショナル マッピング
(オブジェクト/データ セット リレーショナル マッピング)
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 チームの考え方を表すものにすぎません。
NickLee.Framework の修正バージョンを使用して参照する必要がある DLL
(バージョン 1.5 以降)
NickLee.Web.UI (バージョン 2006.2.1447 以降)
1.
System.Data を使用する
cXTM_User.cs;
System.Configuration を使用する。
System.Web を使用する
;
System.Web.UI.WebControls を使用する
;
System.Web.UI.HtmlControls を使用する
;
/// <summary>
/// cXTM_User.Serialization
/// </summary>
[
Serializable]
public class cXTM_User
{
private int _dID;
private
string _userName;
//
// 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[ ] { " ユーザー名", "DID" };
}
}
}
2. XTM_User.xml
<?xml version='1.0' エンコーディング='UTF-8' ?>
<sqlMap namespace='XTM_User' xmlns=" http:// ibatis.apache .org/mapping " xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance ">
<statements>
<select id='SelectXTM_UserByKey_Test'parameterClass='System.Collections.Hashtable'>
SELECT
上位 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>オブジェクト/データセットの関係マッピング(オブジェクト/データセットの関係マッピング) )</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.
System.Data を使用する
test.aspx.cs;
System.Collections
を
使用する。 Web ;
System.Web.Security を使用;
System.Web.UI.WebControls を
使用;
System.Web.UI.HtmlControls を使用
;
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);
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
DataTableReturnOO(table1.Rows[y], objModel[y]);
//
DataSet モード
で
ExDataGrid1.DataSource = table1
をシリアル化します。バインディング
//ExDataGrid1.DataSource = objModel
;
}
}
protected void ExDataGrid1_ItemDataBound(object sender, DataGridItemEventArgs e)
{
/*
* この部分の適用範囲
* データの変更をクエリするには、
DataTable[0].Rows[0] を使用する代わりに、 *
objModel.UserName を使用できます。["UserName"] パターン
* オブジェクト指向度を高め、業務プロセスの一部のコーディングを削減
*/
if (e.Item.ItemIndex != -1)
{
cXTM_User objModel = new cXTM_User();
//DataGrid が DataSet に入力されている場合
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 (行);
型エンティティタイプ = 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]]);
)
;
}
/// <summary>
/// DataTable に変換
/// </summary>
/// <param name="Source">データ ソース</param>
/// <param name="DataMember">データ テーブル名</param>
public static DataTable ConvertDataTable(object Source, string DataMember)
{
DataTablebaseTable = new DataTable();
if
(ソースが DataTable)
{
baseTable = (DataTable)Source
return BaseTable
}
if (ソースが DataSet)
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]
;
ベーステーブルを返し
ます
。
/// <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
].列
名;
for (int x = 0; x < list.Count; x++)
{
hTable.Add(tObj[x].ToString(), list[x])
}
return hTable
;
5.
System.Data を使用する
PageBase.cs
、
System.Web.Security
を使用する
、
System.Web.UI.WebControls を
使用する
。
System.Web.UI.HtmlControls を使用する
Web.UI.WebControls.WebParts
;
System.Reflection を使用する;
System.Text を使用する
;
//名前空間は必須です
//名前空間 Framework.Web.UIProcess
//{
/// <summary>
/// PageBase の概要説明
/// </summary>
/// <summary>
/// ページ層 ( プレゼンテーション層) 基本クラス、すべてのページはこのページを継承します
/// </summary>
public class PageBase : System.Web.UI.Page
{
#region システム全体に
プライベート文字列 _baseselect;
/// <summary>
/// クエリ フィールド
/// </summary>
protected string baseselect
{
get
{
// TODO: BaseRule.OperationCode getter を追加して
return _baseselect
;
set
{
// TODO:
_baseselect = value;
を実装する BaseRule.OperationCode セッターを追加します}
}
/// <summary>
/// 基本クラスのハッシュ テーブル、システム全体に存在します
/// </summary>
protected Hashtable BaseHashtable = new Hashtable( );
/// <summary>
/// インターフェイス ハッシュ テーブル、UI ファクトリから取得したコントロールとコントロール値を取得します
/// </summary>
protected
Hashtable UIhashtable = new Hashtable();
/// エラー プロンプト、デフォルト値 ""
/// </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 ゲッターを追加して
return _UISet;
}
set
{
// TODO:BaseRule.OperationCode
セッターを
追加して
_UISet = value;
}
private DataTable _UITable = new DataTable();
// <summary >
/// インターフェイス層データ テーブル
/// </summary>
protected DataTable UITable
{
get
{
// TODO: BaseRule.OperationCode ゲッターを追加して
return _UITable;
set
{
//
TODO: BaseRule.OperationCode を追加します。
_UITable = value を
実装するためのセッター
}
;
private string _pageTitle = ""
/// <summary>
/// ページ タイトル
/// </summary>
protected string pageTitle
{
get
{
// TODO:
return _pageTitle
を実装する BaseRule.OperationCode getter を追加します}
set
{
// TODO : BaseRule.OperationCode セッターを追加して
_pageTitle = value;
を
実装します
。
#region ページの既存の部分をクエリします
/// <summary>
/// リスト ページの基本クラスのハッシュ テーブル
/// </summary>
protected Hashtable baseListHashtable = new Hashtable()
/// <summary>
/// Total変数のページ数。1000w、10000w データセットの使用量
。 /// </summary>
protected int pageCount;
/// <summary>
/// レコードの合計数。1000w および 10000w データ セットの使用。
///
protected int RecordCount;
///
レコードの合計数。 1000w および 10000w データ セットを使用します
。 /// </summary>
protected int RecordCount
{
get
{
return recordCount
}
}
#endregion;
#region 編集ページの既存の部分
/// <summary>
/// ページの基本クラスのハッシュ テーブルを編集します
/// </summary>
protected Hashtable baseEditHashtable = new Hashtable();
/// <summary>
/// 編集ページ、データ ハッシュ テーブルの編集
/// </summary>
protected HashtablebaseEditFillHashtable = new Hashtable()
;
/// <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)
{
//編集ページのハッシュ オブジェクト リストを取得します
baseEditHashtable = (Hashtable)Session[ "baseEditHashtable"];
// 取得後に対応するセッション オブジェクトを解放します。
Session.Remove("baseEditHashtable")
}
else
{
// 初期状態の場合、状態値を編集しても安全かどうかを追加します。デフォルト値は次のとおりです。 false、安全ではあり
ませ
ん
。
//ページのアクセス制御を問い合わせる
if (Session["baseListHashtable"] != null)
{
//編集ページのハッシュ オブジェクト リストを取得します
baseListHashtable = (Hashtable)Session["baseListHashtable"]
//取得後に対応する Session オブジェクトを解放します
。 .Remove("baseListHashtable");
}
else
{
//初期状態の場合、クエリページを更新するかどうかを追加します。デフォルト値は false で、
baseListHashtable は更新されません。Add("IsRefresh", false)
}
}
#region UI 一般関数
/// <summary>
/// エラー メッセージをスローする
/// </summary>
/// <param name="page">Page</param>
/// <param name=" errMsg" >エラーメッセージ</param>
protected void throwErrMsg(Page page, string errMsg)
{
page.Response.Write("<script>window.alert("" + errMsg.Replace(""", "'" ) + "");</script>");
}
/// <summary>
/// 編集フォームを開くリスト ページを更新します
/// </summary>
/// <param name="page">Page</param>
protected voidparentPageRefresh(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("</" + "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 インターフェイス ファクトリが渡された後にハッシュテーブルが生成されます
/// </summary>
/// <param name="splitStr">js インターフェイス ファクトリが文字列で渡される</param>
/// < return></returns>
public Hashtable AjaxUIFactory(string splitStr)
{
string[] fristStr = splitStr.Split(',');
ハッシュテーブル テーブル = new Hashtable()
; x++ )
{
string[] SecondStr = fristStr[x].Split('|');
if (secondStr.Length == 3)
{
//インターセプトされた文字列と値を取得します
。 ]);
}
}
テーブルを返します。
}
#endregion
}
http://www.cnblogs.com/mail-ricklee/archive/2006/11/23/569270.html