在.Net的开发领域,您和您的公司是不是在为以下问题所困扰
1.DataSet中DataRow只能以DataTable[0].Rows[0][“Name”]的方式获取数据
2.Sql配置的不动态,不清晰的Sql拼凑
3.使用JAVA 的ORM设计.Net,使用对象层,每一次修改都将影响反射的对象。
那么请继续看下面的文章
Object/DataSet 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团队的思想。
必须引用的dll
IBatisNet(Version 1.5及其以后) with NickLee.Framework修改版本
NickLee.Web.UI(Version 2006.2.1447及其以后版本)
1. cXTM_User.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HTMLControls;
/// <summary>
/// cXTM_User.序列化
/// </summary>
[Serializable]
public class cXTM_User
{
private int _dID;
private string _userName;
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' encoding='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
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(对象/数据集关系映射)</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;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HTMLControls;
using IBatisNet.DataMapper;
using System.Reflection;
public partial class 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转化为序列化类数组
for (int y = 0; y < table1.Rows.Count; y++)
{
objModel[y] = new cXTM_User();
DataTableReturnOO(table1.Rows[y], objModel[y]);
}
//以DataSet模式绑定
ExDataGrid1.DataSource = table1;
//以序列化对象模式绑定
//ExDataGrid1.DataSource = objModel;
ExDataGrid1.DataBind();
}
}
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();
//如果为DataSet填充的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;
}
}
}
。