En el campo del desarrollo de .Net, ¿usted y su empresa tienen los siguientes problemas?
1. DataRow en DataSet solo puede obtener datos en forma de DataTable[0].Rows[0]["Name"]
2. Configuración de SQL El Sql no es dinámico ni claro.
3. Utilice ORM de JAVA para diseñar .Net y utilice la capa de objeto. Cada modificación afectará al objeto reflejado.
Luego continúe leyendo el siguiente artículo
Mapeo relacional de objetos/conjuntos de datos
(Mapeo relacional de objetos/conjuntos de datos)
El modo NickLee.ODRM puede resolver bien los problemas anteriores
1. DataRow en DataSet solo puede ser DataTable[0].Rows[0][" Nombre"] método para obtener
la solución de datos: DataRow se convierte en un objeto serializado, pero el objeto serializado solo se usa como una entidad de operación de objeto clara para procesar juicios comerciales y datos
2. La configuración de SQL no es una solución de mosaico SQL dinámica y poco clara
: usando la arquitectura de capa de datos de IBatisNet, usando la sintaxis SQL dinámica de IBatisNet, pero devolviendo DataSet
3. Use el ORM de JAVA para diseñar .Net y use la capa de objeto. Cada modificación afectará el objeto reflejado.
Solución: borre O (capa de objeto), sin mecanismo de reflexión, evite cambios en la capa de objeto con cada modificación.
A continuación se proporciona una explicación detallada.
La siguiente demostración de código se incluirá en NickLee.Framework.2.0.1.2 y superiores. Por supuesto, solo proporcionamos una idea y una solución flexible, que solo representa el pensamiento del equipo de TheFallAngel.
El dll al que se debe hacer referencia
IBatisNet (Versión 1.5 y posteriores) con NickLee.Framework versión modificada
NickLee.Web.UI (Versión 2006.2.1447 y posteriores)
1. cXTM_User.cs
usando System
usandoSystem.Data
;
usando
System.Web.Security;
usando System.Web.UI;
usando
System.Web.UI.HtmlControls
;
/// <summary>
/// cXTM_User.Serialization
/// </summary>
[Serializable]
public class cXTM_User
{
private int _dID;
privatestring _userName
()
{
//
// TODO: Agregar aquí Lógica de constructor
/ /
}
public int DID
{
get
{
return _dID
}
set
{
_dID = value;
}
}
public string Nombre de usuario
{
get
{
return _userName
}
set
{
_userName = valor
}
///
<summary>
// / Por favor defina el propiedades en esta clase para la matriz en Propertylist y asegúrese de que el nombre sea único
/// y coherente con el nombre de la consulta en SelectXTM_UserByKey_Test en XTM_User
/// </summary>
public string[] Propertylist
{
get
{
return new string[ ] { "Nombre de usuario", "DID" } }
}
}
2.
XTM_User.xml
<?xml version='1.0' codificación='UTF-8' ?>
<sqlMap namespace='XTM_User' xmlns=" http:// ibatis.apache .org/mapping " xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance ">
<declaraciones>
<select id='SelectXTM_UserByKey_Test' parameterClass='System.Collections.Hashtable'>
SELECCIONE
los 5 principales
[DID],
[Nombre de usuario],
[Nombre de inicio de sesión],
[PWD],
[Inicio de sesión],
[StopFlag],
[Hora de inicio de sesión],
[LASTUPDATE]
DESDE [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 Transicional//ES" " http://www.w3.org/TR/xhtml1/DTD /xhtml1-transitional.dtd ">
<html xmlns=" http://www.w3.org/1999/xhtml " >
<head runat="server">
<title>Mapeo relacional objeto/conjunto de datos(Mapeo de relación objeto/conjunto de datos )</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
usando
System.Data;
usando System.Configuration;
usando
System.Collections;
Web;
usando System.Web.Security;
usando System.Web.UI;
usando
System.Web.UI.HtmlControls
;
usando IBatisNet.DataMapper;
usando System.Reflection;
clase parcial pública ODRM_test: PageBase
{
protected void Page_Load(remitente del objeto, EventArgs e)
{
if (!IsPostBack)
{
DataSet set11 = Mapper.Instance().QueryForDataSet("SelectXTM_UserByKey_Test",UIhashtable table1
= ConvertDataTable(set11, "
);");
//Aquí está la clase de serialización autodefinida
cXTM_User[] objModel = new cXTM_User[table1.Rows.Count];
//DataTable se convierte en una matriz de clases de serialización
para (int y = 0; y < table1.Rows Count; y++)
{
objModel[y] = new cXTM_User();
DataTableReturnOO(table1.Rows[y], objModel[y]
}
// VincularExDataGrid1.DataSource = table1
en modo DataSet
; enlace
//ExDataGrid1.DataSource = objModel;
ExDataGrid1.DataBind(
)
;
protected void ExDataGrid1_ItemDataBound(object sender, DataGridItemEventArgs e)
{
/*
* El alcance de la aplicación de esta parte
* Para consultar la modificación de un dato, puede usar objModel.UserName
* en lugar de usar DataTable[0].Rows[0] ["Nombre de usuario"] Patrón
* Mejorar el grado de orientación a objetos y reducir parte de la codificación del proceso de negocio
*/
if (e.Item.ItemIndex! = -1)
{
cXTM_User objModel = nuevo cXTM_User();
//Si el DataGrid está lleno para el DataSet
if (e.Item.DataItem.GetType().FullName == "System.Data.DataRowView")
{
DataTableReturnOO((DataRow)((DataRowView)e.Item.DataItem). Row, objModel);
}
// De lo contrario, se considera un objeto serializado relleno
else
{
objModel = (cXTM_User)e.Item.DataItem;
}
}
}
/// <summary>
/// DataSet se convierte en una función de clase de serialización, la definición de clase se refiere a cXTM_User
/// </summary>
private void DataTableReturnOO(DataRow row, cXTM_User objModel)
{
Hashtable hTable = new Hashtable();
hTable = ReturnHashtable (fila);
Tipo tipo de entidad = Type.GetType(objModel.GetType().AssemblyQualifiedName);
for (int j = 0; j < objModel.Propertylist.Length; j++)
{
PropertyInfo propertyinfo = entidadtype.GetProperty(
objModel.Propertylist[j]), null
)
;
}
/// <summary>
/// Convertir a DataTable
/// </summary>
/// <param name="Source">Fuente de datos</param>
/// <param name="DataMember">Nombre de la tabla de datos </param>
public static DataTable ConvertDataTable(objeto Fuente, cadena DataMember)
{
DataTable
baseTable = new DataTable();
if (La fuente es DataTable)
{
baseTable
= (DataTable)Source
return baseTable
;
DataSet set1 = (DataSet)Source;
if ((set1.Tables.Count > 1) && ((DataMember == null) || (DataMember == "")))
{
throw new Exception("Si hay más de una tabla en su conjunto de datos, debe definir la propiedad DataMember para especificar qué tabla usar.");
}
if (set1.Tables.Count < 1)
{
throw new Exception("No hay tablas en la fuente de datos.");
}
if ((DataMember! = nulo) && (DataMember! = ""))
{
baseTable = set1.Tables[DataMember]
return
baseTable
}
else
{
baseTable = set1.Tables[0]
;
}
devolver tabla base;
}
/// <summary>
/// Devuelve DataTable como par clave-valor de tabla hash
/// </summary>
/// <param name="SourceTable">Objeto de fila de datos</param>
/// <returns>< /returns>
public static Hashtable ReturnHashtable(DataRow SourceRow)
{
Hashtable hTable = nueva
lista IList = SourceRow.ItemArray
objeto[] tObj = nuevo objeto[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
]
.NombreDeColumna;
for (int x = 0; x < list.Count
;
x++)
{
hTable.Add(tObj[x
].ToString(), list[x])
;
}
5. PageBase.cs
usando System.Data
;
usando System.Configuration;
usandoSystem.Web.Security
;
usando
System.Web.UI.WebControls
;
Web.UI.WebControls.WebParts;
utilizando System.Web.UI.HtmlControls;
usando System.Reflection;
usando System.Text;
usando System.Collections;
//se requiere espacio de nombres
//espacio de nombres Framework.Web.UIProcess
//{
/// <summary>
/// Descripción resumida de PageBase
/// </summary>
/// <summary>
/// Capa de página (capa de presentación ) clase base, todas las páginas heredan esta página
/// </summary>
public class PageBase : System.Web.UI.Page
{
#region Todo el sistema tiene alguna
cadena privada _baseselect;
/// <summary>
/// Campo de consulta
/// </summary>
protected string baseelect
{
get
{
// TODO: Agregar el getter BaseRule.OperationCode para implementar
return _baseselect
}
set
{
// TODO: Agregar el configurador BaseRule.OperationCode para implementar
_baseselect = value;
///
<summary>
///
Tabla hash de clase base, existe en todo el sistema
/// </summary>
protected Hashtable baseHashtable = new Hashtable( );
/// <summary>
/// Tabla hash de interfaz, obtiene controles y valores de control obtenidos de la fábrica de UI
/// </summary>
protected Hashtable UIhashtable = new Hashtable()
/// <summary>
/// Mensaje de error, valor predeterminado ""
/// </summary>
protected string errMsg = "";
/// <summary>
/// Estado de error, valor predeterminado false
/// </summary>
protected bool errState = false;
// <summary>
/// Variable privada _UISet
/// </summary>
private DataSet _UISet = new DataSet()
/// <summary>
/// Conjunto de datos de la capa de interfaz
/// </summary>
protected DataSet UISet
{
get
{
// TODO: Agregar el getter BaseRule.OperationCode para implementar
return
_UISet
}
set
{
//
TODO
: Agregar el setter BaseRule.OperationCode para implementar
_UISet = valor
;
// <summary >
/// Tabla de datos de la capa de interfaz
/// </summary>
protected DataTable UITable
{
get
{
// TODO: Agregar el getter BaseRule.OperationCode para implementar
return _UITable
}
set
{
// TODO: Agregar BaseRule.OperationCode;
configurador
para implementar
_UITable = valor
;
cadena privada _pageTitle = "";
/// <summary>
/// Título de la página
/// </summary>
cadena protegida pageTitle
{
get
{
// TODO: Agregar el getter BaseRule.OperationCode para implementar
return _pageTitle
}
set
{
//
TODO
: agregue el configurador BaseRule.OperationCode para implementar
_pageTitle
= value
;
#region Consultar la parte existente de la página
/// <summary>
/// Listar la tabla hash de la clase base de la página
/// </summary>
protected Hashtable baseListHashtable = new Hashtable()
/// <summary>
/// Total número de páginas. Uso del conjunto de datos de 1000w, 10000w
/// </summary>
protected int pageCount;
/// <summary>
///
Número totalde
registros. Variables Uso de conjuntos de datos de 1000w y 10000w
/// </summary>
protected int recordCount;
Conjuntos de datos de 1000w y 10000w Uso
/// </summary>
protected int RecordCount
{
get
{
return recordCount
}
}
#endregion;
#region La parte existente de la página de edición
/// <summary>
/// Editar la tabla hash de la clase base de la página
/// </summary>
protected Hashtable baseEditHashtable = new Hashtable()
/// <summary>
/// Editar página, Editar tabla hash de datos
/// </summary>
protected Hashtable baseEditFillHashtable = new Hashtable()
;
/// <summary>
/// Constructor
/// </summary>
public PageBase()
{
this.Load += new EventHandler(PageBase_Load
}
privado vacío PageBase_Load (remitente del objeto, EventArgs e)
{
if (!Page.IsPostBack)
{
// La parte de control requerida para todo el proceso
if (Session["baseHashtable"] != null)
{
//Obtener la lista de objetos hash de Session
baseHashtable = (Hashtable)Session["baseHashtable"]
}
// Los derechos de acceso a la página de edición y el control de acceso solo son válidos cuando la página se carga por primera vez
if (Session["baseEditHashtable"] != null)
{
//Obtener la lista de objetos hash de la página de edición
baseEditHashtable = (Hashtable)Session[ "baseEditHashtable"];
// Libera el objeto de sesión correspondiente después de la adquisición
Session.Remove("baseEditHashtable");
}
else
{
// Si es el estado inicial, agrega si es seguro editar el valor del estado, el valor predeterminado es falso, no es seguro
baseEditHashtable.Add ("EditSafeState", falso
}
}
// Consultar control de acceso a la página
if (Session["baseListHashtable"] != null)
{
// Obtener la lista de objetos hash de la página Editar
baseListHashtable = (Hashtable)Session["baseListHashtable"]
// Liberar el objeto Session correspondiente después de la adquisición
. .Remove("baseListHashtable");
}
else
{
// Si es el estado inicial, agregue si se actualiza la página de consulta, el valor predeterminado es falso,
baseListHashtable no se actualizará.Add("IsRefresh", false
}
}
#región Función general de la interfaz de usuario
/// <summary>
/// Lanzar mensaje de error
/// </summary>
/// <param name="page">Page</param>
/// <param name=" errMsg" >Mensaje de error</param>
protected void throwErrMsg(Página página, cadena errMsg)
{
page.Response.Write("<script>window.alert("" + errMsg.Replace(""", "'") + "");</script>");
}
/// <summary>
/// Actualiza la página Lista que abre el formulario de edición
/// </summary>
/// <param name="page">Page</param>
protected void parentPageRefresh(Página)
{
StringBuilder scriptString = new StringBuilder();
scriptString.Append("<script language = javascript>");
//Llame a actualizar() en Function.js para actualizar el formulario principal
scriptString.Append("window.opener.refresh(false, "");");
scriptString.Append(" ventana.focus();");
scriptString.Append(" ventana.opener=null;");
scriptString.Append(" ventana.close(); ");
scriptString.Append("</" + "script>");
página.Response.Write(scriptString.ToString())
;
/// <summary>
/// Restablecer página
/// </summary>
/// <param name="page">Página</param>
protected void pageReset(Página)
{
StringBuilder scriptString = new StringBuilder();
scriptString.Append("<lenguaje de escritura = javascript>");
scriptString.Append(" this.ubicación.reset(); ");
scriptString.Append("</" + "script>");
página.Response.Write(scriptString.ToString())
;
/// <summary>
/// La tabla hash se genera después de que se pasa la fábrica de interfaces js
/// </summary>
/// <param name="splitStr">la fábrica de interfaces js pasa en cadena</param>
/// < devuelve></returns>
public Hashtable AjaxUIFactory(string splitStr)
{
string[] fristStr = splitStr.Split(',');
tabla Hashtable = new Hashtable()
for (int x = 0; x < fristStr.Length; x++ )
{
string[] secondStr = fristStr[x].Split('|');
if ( secondStr.Length == 3)
{
//Obtiene la cadena interceptada y
la tabla de valores.Add( secondStr[1], secondStr[2 ]);
}
}
tabla de retorno;
}
#endregion
}
http://www.cnblogs.com/mail-ricklee/archive/2006/11/23/569270.html