No campo do desenvolvimento .Net, você e sua empresa estão preocupados com os seguintes problemas:
1. DataRow no DataSet só pode obter dados na forma de DataTable[0].Rows[0]["Name"]
2. Configuração SQL? O Sql não é dinâmico e claro
3. Use o ORM do JAVA para projetar .Net e use a camada de objeto. Cada modificação afetará o objeto refletido.
Então continue lendo o seguinte artigo
Mapeamento Relacional de Objeto/DataSet
(Mapeamento Relacional de Objeto/Conjunto de Dados)
O modo NickLee.ODRM pode resolver bem os problemas acima
1. DataRow em DataSet só pode ser DataTable[0].Rows[0][" Nome"] método para obter
solução de dados: DataRow é convertido em um objeto serializado, mas o objeto serializado é usado apenas como uma entidade de operação de objeto clara para processar julgamento de negócios e dados
2. A configuração SQL não é uma solução de patchwork SQL dinâmica e pouco clara
: usando a arquitetura da camada de dados IBatisNet, usando a sintaxe SQL dinâmica do IBatisNet, mas retornando o DataSet
3. Use o ORM do JAVA para projetar .Net e usar a camada de objeto. Cada modificação afetará o objeto refletido.
Solução: Limpe O (camada do objeto), sem mecanismo de reflexão, evite alterações na camada do objeto a cada modificação.
A explicação detalhada é fornecida abaixo.
A demonstração de código a seguir será incluída em NickLee.Framework.2.0.1.2 e acima. Claro, estamos apenas fornecendo uma ideia e uma solução flexível, que representa apenas o pensamento da equipe TheFallAngel.
A dll que deve ser referenciada
IBatisNet (Versão 1.5 e posterior) com NickLee.Framework versão modificada
NickLee.Web.UI (Versão 2006.2.1447 e posterior)
1. cXTM_User.cs
using
System.Data
;
usando System.Web;
usandoSystem.Web.Security
;
usando
System.Web.UI.WebControls
;
///
/// cXTM_User.Serialization
///
[Serializable]
public class cXTM_User
{
private int _dID;
privatestring _userName
()
{
//
// TODO: Adicione aqui a lógica do construtor
/ /
}
public int DID
{
get
{
return _dID
}
set
{
_dID=
value
}
}
public string UserName
{
get
{
return
_userName
}
set
{
_userName =
value
;
propriedades nesta classe para a matriz na Propertylist e certifique-se de que o nome seja exclusivo
/// e consistente com o nome da consulta em SelectXTM_UserByKey_Test em XTM_User
///
public string[] Propertylist
{
get
{
return new string[ ] { "Nome de usuário", "DID" } }
}
}
2.
XTM_User.xml
SELECIONE
os 5 principais
[DID],
[UserName],
[LoginName],
[PWD],
[LoginFlag],
[StopFlag],
[LoginTime],
[LASTUPDATE]
FROM [XTM_User]
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" %>
http://www.w3.org/TR/xhtml1/DTD /xhtml1-transitional.dtd ">
http://www.w3.org/1999/xhtml " >
4.
test.aspx.cs
usando
System.Data
;
Web ;
usando System.Web.Security
;
usando
System.Web.UI.WebControls
;
usando IBatisNet.DataMapper;
usando System.Reflection;
classe parcial pública ODRM_test: PageBase
{
protegido void Page_Load (objeto remetente, EventArgs e)
{
if (!IsPostBack)
{
DataSet set11 = Mapper.Instance().QueryForDataSet("SelectXTM_UserByKey_Test",UIhashtable table1
= ConvertDataTable(set11, "
);");
//Aqui está a classe de serialização autodefinida
cXTM_User[] objModel = new cXTM_User[table1.Rows.Count];
//DataTable é convertido em uma matriz de classe de serialização
para (int y = 0; y < table1.Rows .Cont; y++)
{
objModel[y
]=
new cXTM_User();
//
Serializar o objeto Mode
;
ligação
//ExDataGrid1.DataSource
=
objModel
;
protected void ExDataGrid1_ItemDataBound(object sender, DataGridItemEventArgs e)
{
/*
* O escopo do aplicativo desta parte
* Para consultar a modificação de um dado, você pode usar objModel.UserName
* em vez de usar DataTable[0].Rows[0] ["UserName"] Padrão
* Melhora o grau de orientação a objetos e reduz parte da codificação do processo de negócios
*/
if (e.Item.ItemIndex! = -1)
{
cXTM_User objModel = new cXTM_User();
//Se o DataGrid for preenchido para o DataSet
if (e.Item.DataItem.GetType().FullName == "System.Data.DataRowView")
{
DataTableReturnOO((DataRow)((DataRowView)e.Item.DataItem). Row, objModel);
}
//Caso contrário, é considerado um objeto serializado preenchido
else
{
objModel = (cXTM_User)e.Item.DataItem;
}
}
}
///
/// DataSet é convertido em uma função de classe de serialização, a definição da classe refere-se a cXTM_User
///
private void DataTableReturnOO(DataRow row, cXTM_User objModel)
{
Hashtable hTable = new Hashtable();
hTable = ReturnHashtable (linha);
Tipo entidadetype = Type.GetType(objModel.GetType().AssemblyQualifiedName);
for (int j = 0; j { PropertyInfo propertyinfo = entidadetype.GetProperty(objModel.Propertylist[j]) ; ) ; } /// /// Converter em DataTable /// /// Fonte de dados /// Nome da tabela de dados static DataTable ConvertDataTable(objeto Fonte, string DataMember) { DataTable = new DataTable ( ) ; DataSet set1 = (DataSet)Source if ((set1.Tables.Count > 1) && ((DataMember == null) || (DataMember == ""))) { throw new Exception("Se houver mais de um tabela em seu conjunto de dados, você deve definir a propriedade DataMember para especificar qual tabela usar."); } if (set1.Tables.Count < 1) { throw new Exception("Não há tabelas na fonte de dados."); } ! = "")) { baseTable = set1.Tables[DataMember] } else { baseTable = set1.Tables[0 ] ; } retornar tabelabase; } /// /// Retorna DataTable como par chave-valor da tabela hash /// /// Objeto de linha de dados /// public static Hashtable ReturnHashtable(DataRow SourceRow) { Hashtable hTable = new Hashtable 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 ].NomeColuna; } for (int x = 0; x { [ x ].ToString(), lista[x] }) ; } 5. PageBase.cs usando System.Data ; usando System.Web.WebControls ; Web.UI.WebControls.WebParts; usando System.Web.UI.HtmlControls; usando System.Reflection; usando System.Text; usando System.Collections; //namespace é necessário //namespace Framework.Web.UIProcess //{ /// /// Descrição resumida do PageBase /// /// /// Camada de página ( Camada de apresentação ) classe base, todas as páginas herdam esta página /// public class PageBase : System.Web.UI.Page { #region Todo o sistema possui alguma string privada _baseselect; /// /// Campo de consulta /// protected string baseselect { get { // TODO: Add BaseRule.OperationCode getter para implementar return _baseselect } set { // TODO: Adicionar setter BaseRule.OperationCode para implementar _baseselect = value; } } /// /// Tabela hash da classe base, existe em todo o sistema /// protected Hashtable baseHashtable = new Hashtable( ); /// /// Tabela hash de interface, obtém controles e valores de controle obtidos da fábrica da UI /// protected Hashtable UIhashtable = new Hashtable(); /// Prompt de erro, valor padrão "" /// protected string errMsg = ""; /// /// Status do erro, valor padrão false /// protected bool errState = false; // /// Variável privada _UISet /// private DataSet _UISet = new DataSet( ) ; protected DataSet UISet { get { // TODO: Adicionar getter BaseRule.OperationCode para implementar return _UISet ; set { // BaseRule.OperationCode para implementar _UISet = valor ; // /// Tabela de dados da camada de interface /// protected DataTable UITable { get { // TODO: Adicionar baseRule.OperationCode getter para implementar return _UITable ; setter para implementar _UITable = valor ; private string _pageTitle = ""; /// /// Título da página /// protected string pageTitle { get { // TODO: Adicionar o getter BaseRule.OperationCode para implementar return _pageTitle } set { // TODO : Adicionar setter BaseRule.OperationCode para implementar _pageTitle = value ; #region Consulta a parte existente da página /// /// Lista a tabela hash da classe base da página /// protected baseListHashtable = new Hashtable(); número de páginas. Variáveis 1000w, 10000w uso do conjunto de dados /// protected int pageCount; /// /// Número total de variáveis. Uso de conjuntos de dados de 1000w e 10000w /// protected int recordCount; /// /// Número total de registros. Conjuntos de dados de 1000w e 10000w Use /// protected int RecordCount { get { return recordCount } } #endregion; #region A parte existente da página de edição /// /// Edita a tabela hash da classe base da página /// protected Hashtable baseEditHashtable = new Hashtable(); página, Editar tabela hash de dados /// protected Hashtable baseEditFillHashtable = new Hashtable() ; /// /// Construtor /// public PageBase() { this.Load += new EventHandler(PageBase_Load }) ; private void PageBase_Load(objeto remetente, EventArgs e) { if (!Page.IsPostBack) { //A parte de controle necessária para todo o processo if (Session["baseHashtable"] != null) { //Obtém a lista de objetos hash da Sessão baseHashtable = (Hashtable)Session["baseHashtable"] } //Os direitos de acesso e controle de acesso da página de edição só são válidos quando a página é carregada pela primeira vez if (Session["baseEditHashtable"] != null) { //Obter a lista de objetos hash da página de edição baseEditHashtable = (Hashtable)Session[ "baseEditHashtable"]; //Libere o objeto Session correspondente após a aquisição Session.Remove("baseEditHashtable"); else { // Se for o estado inicial, adicione se é seguro editar o valor do estado, o valor padrão é falso, não é seguro baseEditHashtable.Add ("EditSafeState", false ) ; //Consultar controle de acesso à página if (Session["baseListHashtable"] != null) { Obter a lista de objetos hash da página de edição baseListHashtable = (Hashtable)Session["baseListHashtable"]; .Remove("baseListHashtable"); } else { //Se for o estado inicial, adicione se deseja atualizar a página de consulta, o valor padrão é falso, baseListHashtable não será atualizado.Add("IsRefresh", false }) ; } #region UI função geral /// /// Lança mensagem de erro /// /// Page /// Mensagem de erro protegido void throwErrMsg(Página página, string errMsg) { page.Response.Write(""); } /// /// Atualizar a página da lista que abre o formulário de edição /// /// Page protected void parentPageRefresh(Page page) { StringBuilder scriptString = new StringBuilder(); scriptString.Append("