| Carlos's profileCarlos Mattos - Sorocaba...PhotosBlog | Help |
|
|
January 24 Listando Tabelas e Colunas utilizando LINQ-to-SQLRecuperar nomes de tabelas e colunas a partir da estrutura do banco de dados é sempre útil no processo de desenvolvimento. Existem diversas técnicas utilizando diferentes tecnologias para isto. Este post mostra como obter uma lista com os nomes das tabelas e seus respectivos campos utilizando o LINQ-to-SQL. O exemplo foi implementado com 1 formulário contendo 1 botão e 1 controle ListBox. Essa construção é possível porque o LINQ-to-SQL mantém o mapeamento da estrutura do banco de dados armazenado no objeto DataContext. Veja abaixo a interface em tempo de execução mostrando a lista das tabelas e colunas:
Agora veja o código necessário para construir esta lista (é bem simples):
{
public partial class Form1 : Form
{
DBTeste db = new DBTeste();
public Form1()
{
InitializeComponent();
}
private void Button1_Click(object sender, EventArgs e)
{
var DBEstrutura = db.Mapping;
foreach (var Tabela in DBEstrutura.GetTables())
{
listBox1.Items.Add(Tabela.TableName);
foreach (var Coluna in Tabela.RowType.DataMembers)
listBox1.Items.Add(" -" + Coluna.MappedName);
}
}
}
}
January 20 Criptografando dados com C# e MD5O exemplo abaixo demonstra como criptografar dados utilizando C# e o algorítmo MD5. O Namespace System.Security.Cryptography oferece os recursos necessários para esta implementação.
using System.Security.Cryptography;
...
public static string GetMD5Hash(string input)
{
MD5 md5Hasher = MD5.Create();
byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
return sBuilder.ToString();
} Abrindo Formulários Dinamicamente C# (Windows Forms)Introdução
Uma tarefa comum no desenvolvimento de soluções Windows Forms é a necessidade de instanciar formulários com base no nome da classe, ou seja, como o desenvolvedor pode abrir um formulário dinamicamente (programaticamente) passando o nome deste formulário (classe) como string. Isto é muito comum quando há necessidade de criarmos menus populados dinamicamente a partir de uma base de dados.
Problema
Apesar de representar uma necessidade comum em aplicações Windows Forms, ainda há muitas dúvidas entre os desenvolvedores de como implementar corretamente um procedimento para instanciar um formulário dinamicamente. Faltam exemplos sobre esse tipo prática e os que estão disponíveis na Web não são facilmente encontrados e na maioria das vezes são apresentados em outro idioma.
Solução
Uma construção simples com o método CreateInstance do objeto Activator permite implementar esta funcionalidade. Veja o código abaixo:
public static void OpenForm(string Namespace_FormName, bool System_Modal)
{
Type t = Type.GetType(Namespace_FormName);
if (t != null)
{
System.Windows.Forms.Form f = (System.Windows.Forms.Form)Activator.CreateInstance(t);
if (System_Modal)
f.ShowDialog();
else
f.Show();
}
}
Instanciando um formulário implementado em outro assembly
Com uma construção semelhante, é possível iniciar um formulário implementado eu outro assembly. Basta modificar o código acima para incluir informações sobre o assembly externo. O exemplo abaixo mostra como iniciar um formulário (MDIChild) contido em outro assembly e centralizá-lo no MDI:
private void OpenChildFormFromExternalAssembly(
string Full_Namespace_Class,
string Root_Namespace,
string Assembly_Version,
string Assembly_Culture,
string Assembly_PublicKeyToken,
bool System_Modal)
{
Type t = Type.GetType(Full_Namespace_Class + "," + Root_Namespace
+ ", Version=" + Assembly_Version
+ ", Culture=" + Assembly_Culture
+ ", PublicKeyToken=" + Assembly_PublicKeyToken);
if (t != null)
{
System.Windows.Forms.Form f = (System.Windows.Forms.Form)Activator.CreateInstance(t);
f.MdiParent = this;
int TopMargin = 0;
int LeftMargin = 0;
LeftMargin = ((this.Width - f.Width) / 2) + this.Left;
TopMargin = ((this.Height - f.Height) / 2) + this.Top - 50;
f.StartPosition = FormStartPosition.Manual;
f.Top = TopMargin;
f.Left = LeftMargin;
if (System_Modal)
f.ShowDialog();
else
f.Show();
}
}
As linhas abaixo demonstram como invocar o procedimento acima passando os parâmetros necessários:
OpenChildFormFromExternalAssembly(
"EIS.Presentation.frmTipoEis", // Namespace completo
"EIS", // Root Namespace
"1.0.0.0", // Assembly Version (AssemblyInfo.cs)
"neutral", // Cultura (Default=neutral)
"null", // PublicKeyToken (Default=null)
false
); Gerenciando Conflitos de Concorrência no LINQ-to-SQLIntrodução O LINQ-to-SQL oferece uma coleção de APIs (Application Program Interface) para auxiliar o desenvolvedor a identificar, avaliar e solucionar conflitos de concorrência nas suas aplicações.
Concorrência Otimista O modelo otimista para gerenciamento de conflitos de concorrência utiliza o método Resolve(RefreshMode) apresentado pelo Namespace System.Data.Linq. Este método avalia o conflito e atualiza os dados de acordo com o que foi definido pelo desenvolvedor através da Enumeração RefreshMode.
Enumeração RefreshMode Esta enumeração determina como o método Resolve() irá tratar os conflitos de concorrência expostos pela Exception ChangeConflictException. Abaixo estão os membros desta enumeração com uma breve descrição:
Entendendo o RefreshMode Analisando a Enumeração acima, o desenvolvedor pode ter uma interpretação equivocada sobre o comportamento do método Resolve(). Para esclarecer isso abaixo estão três cenários diferentes que ilustram o comportamento do método Resolve para cada Membro da Enumeração RefreshMode.
Cenário de Exemplo Considere o cenário abaixo. Uma Exception do tipo ChangeConflictException é gerada quando o Usuário1 tenta submeter suas alterações ao banco de dados, porque o Usuário2 efetivou modificações nos dados enquanto o Usuário1 estava manipulando o mesmo registro.
Resolvendo conflitos mesclando dados (KeepChanges) O membro KeepChanges pode ser utilizado para reconciliar diferenças entre os valores esperados e os valores reais contidos no banco de dados antes de você tentar submeter a atualização novamente. Este membro mescla dados do cliente com dados contidos na base.
Resolvendo conflitos mantendo os dados do banco (OverwriteCurrentValues) O membro OverwriteCurrentValues pode ser utilizado para reconciliar diferenças entre os valores esperados e os valores reais contidos no banco de dados antes de você tentar submeter a atualização novamente. Este membro sobrescreve os valores atuais (no cliente) com os valores encontrados no banco de dados.
Resolvendo conflitos sobrescrevendo os valores do banco de dados (KeepCurrentValues) O membro KeepCurrentValues pode ser utilizado para reconciliar diferenças entre os valores esperados e os valores reais contidos no banco de dados antes de você tentar submeter a atualização novamente. Este membro sobrescreve os valores do banco de dados com os valores atuais no cliente.
Exemplo de implementação do modelo de concorrência otimista O procedimento abaixo apresenta o código necessário para implementação do modelo otimista. A linha em destaque mostra a chamada do método Resolve() onde o desenvolvedor pode escolher a ação desejada de acordo com a enumeração RefreshMode.
try { db.SubmitChanges(ConflictMode.ContinueOnConflict); }
catch (ChangeConflictException e) { Console.WriteLine(e.Message);
foreach (ObjectChangeConflict occ in db.ChangeConflicts) { occ.Resolve(RefreshMode.KeepCurrentValues); } }
January 02 MVP 2008 Reloaded!Mais um ano no programa MVP! Não há maneira melhor para iniciar um novo ano! Recebí hoje pela manhã o e-mail informando a minha renovação para o programa MVP. Este é o quarto ano que participo do programa. Sinto-me honrado por fazer parte de uma comunidade tão ativa ao lado de grandes profissionais. Desde 2003 (meu primeiro ano no programa) conheci grandes profissionais e fiz grandes amigos!
Abraços para todos!
Carlos Mattos
MVP 2008 (C#) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|