В области разработки .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.Data
с
использованием System.Configuration ;
использование System.Web;
использование
System.Web.UI;
использование System.Web.UI.WebControls;
использование System.Web.UI.HtmlControls
;
/// <summary>
/// cXTM_User.Serialization
/// </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;
///
Пожалуйста
,
определите
свойства в этом классе для массива в списке свойств и убедитесь, что имя уникально
/// и соответствует имени запроса в SelectXTM_UserByKey_Test в XTM_User
/// </summary>
public string[] Propertylist
{
get
{
return new string[ ] { " UserName", "DID" };
}
}
}
2. XTM_User.xml
<?xml version='1.0'coding='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'>
ВЫБЕРИТЕ
первые 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. test.aspx.cs
с использованием System.Data
;
сиспользованием
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)
{
DataSet11 = 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]);
//
ПривязкаExDataGrid1.DataSource = table1
в режиме DataSet
; привязка
//ExDataGrid1.DataSource = objModel
ExDataGrid1.DataBind(
)
;
protected void ExDataGrid1_ItemDataBound(object sender, DataGridItemEventArgs e)
{
/*
* Область применения этой части
* Чтобы запросить изменение части данных, вы можете использовать objModel.UserName
* вместо использования DataTable[0].Rows[0] ["UserName"] Шаблон
* Повысить степень объектно-ориентированности и сократить часть кодирования бизнес-процессов
*/
если (e.Item.ItemIndex!= -1)
{
cXTM_User objModel = новый 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 (объект Source, string DataMember)
{
DataTable baseTable = новый DataTable ();
если (Источник DataTable)
{
baseTable = (DataTable) Source;
return baseTable
}
if (Source is DataSet)
{
DataSet set1 = (DataSet)Source;
if ((set1.Tables.Count > 1) && ((DataMember == null) || (DataMember == "")))
{
throw new Exception("Если существует более одного table в вашем наборе данных, вы должны определить свойство 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 = новый список 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.Web
;
с помощью System.Web.UI
;
спомощью
System.Web.UI.WebControls;
Web.UI.WebControls.WebParts
с использованием System.Web.UI.HtmlControls;
использование System.Reflection;
использование System.Text;
использование System.Collections;
//требуется пространство имен
//пространство имен 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 для реализации
return _baseselect
}
;set
{
// TODO: Добавить установщик BaseRule.OperationCode для реализации
_baseselect = value
}
}
/// <summary>
/// Хэш-таблица базового класса, существует во всей системе
/// </summary>
protected Hashtable baseHashtable = new Hashtable( );
/// <summary>
/// Хэш-таблица интерфейса, получает элементы управления и значения элементов управления, полученные от фабрики пользовательского интерфейса
/// </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 для реализации
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: Добавитьметод
получения BaseRule.OperationCode для реализации
return
_pageTitle
; TODO: Добавьте установщик BaseRule.OperationCode для реализации
_pageTitle = value;
}
}
#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>
/// Edit страница, Редактировать хэш-таблицу данных
/// </summary>
protected Hashtable baseEditFillHashtable = newHashtable
();
/// <summary>
/// Конструктор
/// </summary>
public PageBase()
{
this.Load += new EventHandler(PageBase_Load })
;
Private void PageBase_Load (отправитель объекта, 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
{
//
Если это начальное состояние, добавьте, безопасно ли редактировать значение состояния, значение по умолчанию: false, это небезопасно
baseEditHashtable.Add ("EditSafeState", false
} }
)
;
//Управление доступом к странице запроса
if (Session["baseListHashtable"] != null)
{
//Получаем список объектов хэша страницы редактирования
baseListHashtable = (Hashtable)Session["baseListHashtable"];
//Освобождаем соответствующий объект сеанса после получения
. .Remove("baseListHashtable");
}
else
{
//Если это исходное состояние, добавьте, нужно ли обновлять страницу запроса, значение по умолчанию — false,
baseListHashtable не будет обновляться.Add("IsRefresh", false }
;
}
#region Общая функция пользовательского интерфейса
/// <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 void родительPageRefresh(Page page)
{
StringBuilder scriptString = new StringBuilder();
scriptString.Append("<script Language = 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 = new Hashtable();
for (int x = 0; x < fristStr.Length; x++ )
{
string[] SecondStr = fristStr[x].Split('|');
if ( SecondStr.Length == 3)
{
//Получаем перехваченную строку и
таблицу значений.Add( SecondStr[1], SecondStr[2] ]);
}
}
вернуть таблицу
}
#endregion
}
http://www.cnblogs.com/mail-ricklee/archive/2006/11/23/569270.html