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
;
/// <summary>
/// cXTM_User.Serialization
/// </summary>
[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
/// </summary>
public string[] Propertylist
{
get
{
return new string[ ] { "Nome de usuário", "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 ">
<declarações>
<select id='SelectXTM_UserByKey_Test' parâmetroClass='System.Collections.Hashtable'>
SELECIONE
os 5 principais
[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>Mapeamento Relacional Objeto/DataSet(Mapeamento de Relacionamento Objeto/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.
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;
}
}
}
/// <summary>
/// DataSet é convertido em uma função de classe de serialização, a definição da classe refere-se a cXTM_User
/// </summary>
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 <objModel.Propertylist.Length; j++)
{
PropertyInfo propertyinfo = entidadetype.GetProperty(objModel.Propertylist[j])
;
)
;
}
/// <summary>
/// Converter em DataTable
/// </summary>
/// <param name="Source">Fonte de dados</param>
/// <param name="DataMember">Nome da tabela de dados </param>
publicstatic
DataTable ConvertDataTable(objeto Fonte, string DataMember)
{
DataTable
baseTable=
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.");
}
if ((DataMember != null) && (DataMember!
= ""))
{
baseTable = set1.Tables[DataMember]
}
else
{
baseTable = set1.Tables[0
]
;
}
retornar tabelabase;
}
/// <summary>
/// Retorna DataTable como par chave-valor da tabela hash
/// </summary>
/// <param name="SourceTable">Objeto de linha de dados</param>
/// <returns>< /returns>
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 <lista.Count; x++)
{
hTable.Add(tObj[
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
//{
/// <summary>
/// Descrição resumida do PageBase
/// </summary>
/// <summary>
/// Camada de página ( Camada de apresentação ) classe base, todas as páginas herdam esta página
/// </summary>
public class PageBase : System.Web.UI.Page
{
#region Todo o sistema possui alguma
string privada _baseselect;
/// <summary>
/// Campo de consulta
/// </summary>
protected string baseselect
{
get
{
// TODO: Add BaseRule.OperationCode getter para implementar
return _baseselect
}
;set
{
// TODO: Adicionar setter BaseRule.OperationCode para implementar
_baseselect = value;
}
}
/// <summary>
/// Tabela hash da classe base, existe em todo o sistema
/// </summary>
protected Hashtable baseHashtable = new Hashtable( );
/// <summary>
/// Tabela hash de interface, obtém controles e valores de controle obtidos da fábrica da UI
/// </summary>
protected
Hashtable UIhashtable = new Hashtable();
/// Prompt de erro, valor padrão ""
/// </summary>
protected string errMsg = "";
/// <summary>
/// Status do erro, valor padrão false
/// </summary>
protected bool errState = false;
// <summary>
/// Variável privada _UISet
/// </summary>
private
DataSet _UISet = new DataSet(
)
;
protected DataSet UISet
{
get
{
// TODO: Adicionar getter BaseRule.OperationCode para implementar
return
_UISet
;
set
{
//
TODO: Adicionar setterBaseRule.OperationCode
para implementar
_UISet = valor
;
// <summary >
/// Tabela de dados da camada de interface
///
</summary>
protected
DataTable UITable
{
get
{
// TODO: Adicionar baseRule.OperationCode getter para implementar
return
_UITable
;
setter
para implementar
_UITable = valor
;
private string _pageTitle = "";
/// <summary>
/// Título da página
/// </summary>
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
/// <summary>
/// Lista a tabela hash da classe base da página
/// </summary>
protected
HashtablebaseListHashtable
= new Hashtable();
número de páginas. Variáveis 1000w, 10000w uso do conjunto de dados
/// </summary>
protected int pageCount;
/// <summary>
/// Número total de variáveis. Uso de conjuntos de dados de 1000w e 10000w
/// </summary>
protected int recordCount;
/// <summary>
/// Número total de registros. Conjuntos de dados de 1000w e 10000w Use
/// </summary>
protected int RecordCount
{
get
{
return recordCount
}
}
#endregion;
#region A parte existente da página de edição
/// <summary>
/// Edita a tabela hash da classe base da página
///
</summary>
protected
Hashtable baseEditHashtable = new Hashtable();
página, Editar tabela hash de dados
/// </summary>
protected Hashtable baseEditFillHashtable = new Hashtable()
;
/// <summary>
/// Construtor
/// </summary>
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
/// <summary>
/// Lança mensagem de erro
/// </summary>
/// <param name="page">Page</param>
/// <param name=" errMsg" >Mensagem de erro</param>
protegido void throwErrMsg(Página página, string errMsg)
{
page.Response.Write("<script>window.alert("" + errMsg.Replace(""", "'" ) + "");</script>");
}
/// <summary>
/// Atualizar a página da lista que abre o formulário de edição
/// </summary>
/// <param name="page">Page</param>
protected void parentPageRefresh(Page page)
{
StringBuilder scriptString = new StringBuilder();
scriptString.Append("<script language = javascript>");
//Chame refresh() em Function.js para atualizar o formulário pai
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>
/// Redefinir página
/// </summary>
/// <param name="page">Página</param>
protected void pageReset(Page page)
{
StringBuilder scriptString = new StringBuilder() ;
scriptString.Append("<linguagem de script = javascript>");
scriptString.Append("this.location.reset(); ");
scriptString.Append("</" + "script>");
page.Response.Write(scriptString.ToString() })
;
/// <summary>
/// Hashtable é gerado depois que js interface factory é passado em
/// </summary>
/// <param name="splitStr">js interface factory passa em string</param>
/// < retorna></retorna>
public Hashtable AjaxUIFactory(string splitStr)
{
string
[] fristStr = splitStr.Split(',')
;
x++ )
{
string[] secondStr = fristStr[x].Split('|');
if (secondStr.Length == 3)
{
//Obter a string interceptada e o valor
table.Add(secondStr[1], secondStr[2
]
)
;