.Net 개발 분야에서 귀하와 귀하의 회사는 다음 문제로 인해 어려움을 겪고 있습니까?
1. DataSet의 DataRow는 DataTable[0].Rows[0]["Name"] 형식의 데이터만 얻을 수 있습니다.
2. Sql 구성 Sql은 동적이지 않고 명확하지 않습니다.
3. JAVA의 ORM을 사용하여 .Net을 디자인하고 객체 레이어를 사용하면 모든 수정이 반영된 객체에 영향을 미칩니다.
그런 다음 계속해서 다음 문서를 읽어 보십시오.
개체/데이터 세트 관계형 매핑
(Object/Data Set Relational Mapping)
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 수정 버전
NickLee.Web.UI(버전 2006.2.1447 이상)
를 사용하여참조해야 하는 dll
1.
System.Data를 사용하는
cXTM_User.cs
;
System.Web 사용,
System.Web.UI
사용,
System.Web.UI.WebControls.WebParts
사용
,
/// <summary>
/// cXTM_User.Serialization
/// </summary>
[Serialize]
public class cXTM_User
{
private int _dID;
public
cXTM_User()
{
//
// 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[ ] { " UserName", "DID" };
}
}
}
2. XTM_User.xml
<?xml version='1.0' 인코딩='UTF-8' ?>
<sqlMap 네임스페이스='XTM_User' xmlns=" http:// ibatis.apache .org/mapping " xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance ">
<문>
<select id='SelectXTM_UserByKey_Test' 매개변수Class='System.Collections.Hashtable'>
[DID],
[UserName],
[LoginName],
[PWD],
[LoginFlag],
[StopFlag],
[LoginTime],
[LASTUPDATE]
FROM [XTM_User]
</select>
</statements>
</sqlMap>
상위 5개
선택
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 관계 매핑(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.
System.Data를
사용
하는test.aspx.System.Collections를
사용합니다
. 웹;
System.Web.UI사용
;
System.Web.UI.WebControls.WebParts
사용
;
IBatisNet.DataMapper 사용;
System.Reflection 사용;
공개 부분 클래스 ODRM_test : PageBase
{
protected void Page_Load(객체 전송자, 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 cXTM_User();
DataTableReturnOO(table1.Rows[y], objModel[y])
}
//
DataSet 모드에서
table1
바인딩 ;바인딩
//ExDataGrid1.DataSource = objModel
ExDataGrid1.DataBind()
}
}
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]], null
)
;
}
/// <summary>
/// DataTable로 변환
/// </summary>
/// <param name="Source">데이터 소스</param>
/// <param name="DataMember">데이터 테이블 이름 </param>
public static DataTable ConvertDataTable(object Source, string DataMember)
{
DataTable baseTable = new DataTable();
if
(소스는 DataTable입니다.)
{
baseTable = (DataTable)Source는
return baseTable
입니다
.
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]
return
baseTable
}
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사용
,
System.Web.Security
사용
,
System.Web.UI.WebControls
사용
. Web.UI.WebControls.WebParts;
System.Web.UI.HtmlControls 사용;
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: BaseRule.OperationCode setter를 추가하여 구현
_baseselect = value;
}
}
/// <summary>
/// 기본 클래스 해시 테이블은 전체 시스템에 존재합니다
. /// </summary>
protected Hashtable baseHashtable = new Hashtable( );
/// <summary>
/// 인터페이스 해시 테이블, UI 팩토리에서 얻은 컨트롤 및 컨트롤 값 가져오기
/// </summary>
protected Hashtable UIhashtable = new Hashtable()
/// <summary>
/// 오류 프롬프트, 기본값 ""
/// </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 getter를 추가하여 구현
return _UISet;
}
set
{
//
TODO:_UISet을
구현하기 위해 BaseRule.OperationCode setter 추가
}
}
private DataTable _UITable = new DataTable();
// <summary >
/// 인터페이스 계층 데이터 테이블
/// </summary>
protected DataTable UITable
{
get
{
// TODO: BaseRule.OperationCode getter를 추가하여return _UITable
구현
}
set
{
// TODO: BaseRule.OperationCode 추가
_UITable을구현하기 위한 설정자
= value
}
}
private string _pageTitle = "";
/// <summary>
/// 페이지 제목
/// </summary>
protected
string pageTitle
{
//
TODO: BaseRule.OperationCode getter를추가
하여
return
_pageTitle
구현
;
TODO:
_pageTitle = value 구현을 위해 BaseRule.OperationCode 설정자를 추가합니다.
}
}
#endregion;
#region 페이지의 기존 부분 쿼리
/// <summary>
/// 목록 페이지 기본 클래스 해시 테이블
/// </summary>
protected Hashtable baseListHashtable = new Hashtable()
/// <summary>
/// Total 페이지 수. 1000w, 10000w 데이터 세트 사용량
/// </summary>
protected int pageCount;
/// <summary>
/// 총 레코드 수. 1000w 및 10000w 데이터 세트 사용
/// </summary>
protected int RecordCount;
/// <summary>
/// 총 레코드 수입니다. 1000w 및 10000w 데이터 세트 사용
/// </summary>
protected int RecordCount
{
get
{
return RecordCount
}
}
#endregion;
#region 편집 페이지의 기존 부분
/// <summary>
/// 페이지 기본 클래스 해시 테이블 편집
/// </summary>
protected Hashtable baseEditHashtable = new Hashtable()
/// <summary>
/// 편집 페이지, 데이터 해시 테이블 편집
/// </summary>
protected Hashtable baseEditFillHashtable = new Hashtable()
;
/// <summary>
/// 생성자
/// </summary>
public PageBase()
{
this.Load += new EventHandler(PageBase_Load)
}
;
private void PageBase_Load(개체 전송자, EventArgs e)
{
if (!Page.IsPostBack)
{
//전체 프로세스에 필요한 제어 부분
if (Session["baseHashtable"] != null)
{
//Session에서 해시 객체 목록 가져오기
baseHashtable = (Hashtable)Session["baseHashtable"]
}
;
//편집 페이지 접근 권한 및 접근 제어는 페이지가 처음 로드될 때만 유효합니다.
if (Session["baseEditHashtable"] != null)
{
//편집 페이지 해시 개체 목록 가져오기
baseEditHashtable = (Hashtable)Session[ "baseEditHashtable"];
//획득 후 해당 Session 객체를 해제합니다.
Session.Remove("baseEditHashtable")
}
else
{
//초기 상태인 경우 상태 값을 편집해도 안전한지 추가, 기본값은
false,안전
하지 않습니다.
baseEditHashtable.Add ("EditSafeState", 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">페이지</param>
/// <param name=" errMsg" >오류 메시지</param>
protected void throwErrMsg(페이지 페이지, 문자열 errMsg)
{
page.Response.Write("<script>window.alert("" + errMsg.Replace(""", "'" ) + "");</script>");
}
/// <summary>
/// 편집 양식을 여는 목록 페이지 새로 고침
/// </summary>
/// <param name="page">Page</param>
protected void parentPageRefresh(Page page)
{
StringBuilder scriptString = new StringBuilder();
scriptString.Append("<script 언어 = 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>
/// js 인터페이스 팩토리가 문자열에 전달된 후 해시테이블이 생성됩니다
. /// </summary>
/// <param name="splitStr">js 인터페이스 팩토리가 문자열에 전달됩니다.</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)
{
//가로채기된 문자열 및 값 가져오기
table.Add(secondStr[1], secondStr[2 ]);
}
}
반환 테이블;
}
#endregion
}
http://www.cnblogs.com/mail-ricklee/archive/2006/11/23/569270.html