Pedro 的个人资料Pedro Carlos S. de Olive...照片日志列表 工具 帮助

de Oliveira Pedro

职业
地点
Pedro de Oliveira is a consultant at Accenture working in the Technology Architecture group for a major Telecom client in Brazil.
9月21日

Problem of Validating, CausesValidation and Form Close

(Também em português: Problema com evento Validating, CausesValidation e fechar do formulário)

Teaching a lesson in a Microsoft Learning class, I was demonstrating the use of the Validating event in a textbox and a button with CausesValidation property set to false (there is a question discussing that in the certification exam), and I wrote a simple code:

Private Sub btnCancel_Click(...) Handles btnCancel.Click
     MessageBox.Show("Cancel pressed")
End Sub

It worked as expected, and to end the demonstration I changed the code to:

Private Sub btnCancel_Click(...) Handles btnCancel.Click
     Me.Close()
End Sub

I forgot that I had this problem when I was programming a Windows Form applicaton some time ago. At that time, I simply decided to not use the Validating event and put all my validation code in the OK button. But now I was demonstrating this to students and could not admit that this is something we had to accept.

So, with some search in the Internet, a little code and just a few changes, I present my solution to this problem.

First, declare a private const in the Form:

Private Const WM_CLOSE As Integer = CInt(&H10)

Then, override the WndProc method:

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
     If m.Msg = WM_CLOSE Then
          Dim formControl As Control
          For Each formControl In Me.Controls
               formControl.CausesValidation = False
          Next
     End If
     MyBase.WndProc(m)
End Sub

And that's all. The Cancel button can be clicked and the Close method will execute without the validation stop.

Good luck.

Pedro de Oliveira
MCT (MCSD .NET/VS6)
Rio de Janeiro/Brazil

More information: MCAD/MCSD: Error Handling for the User Interface

9月5日

If you work with Oracle and .NET, beware of parameter order

 
A common mistake when you work with Oracle is to declare parameters out of order when using Oracle in a .NET application.
 
For example, let's use the following parametrized query:
 
SELECT NAME, AGE 
       FROM EMPLOYEES 
       WHERE NAME = :p_name AND AGE = :p_age
 
 
The input parameters p_name and p_age can be declared in the following order:
 
cmd.Parameters.Add("p_age", OracleType.Int32).Value = 18
cmd.Parameters.Add("p_name", OracleType.VarChar, 80).Value = "Pedro"
 
Against the expectation, this code result in error, because p_name was declared in SQL before p_age. Oracle put the value 18 in the first parameter (in this case, p_name) and the value "Pedro" in the second parameter (p_age). As "Pedro" cannot be converted into integer, an error occurs.
 
To correct this code, you have to use the same order as used in SQL, declaring the parameters like this:
 
cmd.Parameters.Add("p_name", OracleType.VarChar, 80).Value = "Pedro"
cmd.Parameters.Add("p_age", OracleType.Int32).Value = 18
 
This little mistake can cause serious problems if parameters are of compatible types, because incorrect (switched) information could be saved, therefore causing inconsistent data.
 
In resume, if you have to use Oracle parameters, be careful with parameter order.
 
Nice programming.
 
Pedro Carlos S. de Oliveira
MCT (MCSD .NET/VS6)
Rio de Janeiro/Brazil
9月2日

Diferenças entre Session e ViewState

Li num blog uma dúvida sobre a diferença entre Session vs ViewState e, em resumo, vou tentar mostrar o que são e quais são as diferenças entre estes recursos de manutenção de estado.

O Session é o mais conhecido, pois existe desde o ASP. Este é um objeto que armazena pares do tipo chave/valor. Chave é um nome (string) de acesso e o valor é qualquer objeto (Object). O armazenamento destes pares é feito no servidor e, na sua forma padrão (default), consome memória. O Session é um objeto individual, i.e., associado a apenas um usuário usando a aplicação web. Sendo individual e consumindo memória, este objeto torna-se perigoso para a escalabilidade da aplicação web, i.e., o suporte ao crescimento no número de usuários (que causará um aumento no consumo de memória no servidor).

O ViewState é um objeto que foi inserido no ASP.NET, junto com os recursos de manutenção de estado do WebForm (página ASPX). Este objeto também armazena pares do tipo chave/valor, contudo diferente do Session, o valor não pode ser um objeto (pelo menos, em seu estado original). Apenas tipos simples (números e strings) podem ser armazenados. Objetos serializáveis também podem ser armazenados em ViewState, mas apenas porque ao ser serializado o objeto é transformado em XML, que é uma string. O ViewState também é um objeto individual, mas diferente do Session não consome recursos (memória ou outro) no servidor. O conteúdo é acrescentado à página gerada num campo hidden do WebForm ( __VIEWSTATE ), encriptado e num formato compacto. Isto faz com que a escalabilidade não seja prejudicada, mas o tamanho da página gerada fica maior, o que aumenta o tempo de carga da página. Em conexões lentas, isto pode ser um problema.

Acredito que com estas informações fica mais fácil entender as diferenças entre estes objetos.

Boa programação.

 

Pedro Carlos S. de Oliveira
MCT (MCSD .NET/VS6)
Rio de Janeiro/Brasil

9月1日

Webservice para consulta de CEP (Brasil)

Usando a página dos Correios para consultar o CEP de um endereço, notei no fim da página de resultados da busca um anúncio que oferecia a possibilidade de consultar o CEP no Microsoft Office 2003. Como era um anúncio da própria empresa de Correios, resolvi testar e, como esperado, consegui usar a partir do Office.
 
A surpresa veio quando notei que este recurso usado Office era na verdade um Webservice criado em .NET (extensão .aspx). Comentei isto em sala de aula e um aluno, Thiago Fialho, se interessou e, com algum trabalho e pesquisa, dissecou o funcionamento deste Webservice e seus resultados estão em seu blog do TheSpoke: http://thespoke.net/blogs/thiagocf/archive/2005/08/31/353202.aspx.
 
Vale a pena conferir e usar em suas aplicações .NET.
8月22日

Comparando a segurança no Java e no .NET

 

O gráfico acima já diz tudo, mas permita-me acrescentar um pouco de contexto. Nathaneal Paul e David Evans, dois pesquisadores do Departamento de Ciência da Computação da University of Virginia, nos Estados Unidos, concluíram um estudo chamado "Comparing Java and .NET Security: Lessons Learned and Missed".

O gráfico é a Figura 1 do documento e compara o número de grandes vulnerabilidades de segurança na Máquina Virtual Java e no CLR desde o lançamento oficial de cada um, em Janeiro de 1996 e Janeiro de 2002, respectivamente. 

Para fazer o download do estudo original:
http://www.only4gurus.com/brasil/preview.asp?ID=9023

 

Fonte: Blog do Only4Gurus (http://www.only4gurus.com.br/)

8月4日

Globalization para português do Brasil (pt-BR) - Parte 2

Continuando o assunto de configurações regionais do Brasil, vou mostrar outras formas de aplicar formatos regionais, independente do sistema do servidor (ou do usuário).
 
Em ASP.NET, caso fosse necessário aplicar a regionalização para português do Brasil em apenas uma página, poderíamos usar a diretiva Page:
 
<%@ Page UICulture="pt-BR" Culture="pt-BR"...%>
 
E, independente de ser uma aplicação ASP.NET, podemos usar os namespaces System.Globalization e System.Threading:
 
' Visual Basic
' Importar estes namespaces no início do código.
Imports System.Globalization
Imports System.Threading
 
' No código:
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("pt-BR")
Thread.CurrentThread.CurrentUICulture = New CultureInfo("pt-BR")
 
 
// C#
// Importar estes namespaces no início do código.

using System.Globalization;
using System.Threading;
 
// No código:
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("pt-BR");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("pt-BR");
 
Culture determina a cultura usada em funções dependentes da cultura como Date e Currency. Portanto, é usada na formatação de datas e números. UICulture determina a linguagem que será usada na carga de arquivos de recursos.
 
Recursos
Arquivos de recursos (resources) são usados para armazenar dados embutidos como strings ou imagens, que podem ser recuperados durante a execução e mostrados na tela. O Resource Management é um recurso do framework .NET usado para extrair elementos do código e armazená-los com chaves em arquivos de recursos. Na execução, a classe ResourceManager é usada para, baseado na chave, recuperar o item baseado na cultura correta. Recursos podem ser armazenados como arquivos independentes ou como parte do assembly.
 
ResourceWriter e resgen.exe podem ser usados para criar arquivos .resources. Para incluir arquivos .resources dentro de um assembly, use a opção de compilação relacionada ou Al.exe.
 
Para criar um arquivo texto de recursos:
  • resource.en-US.txt
    Msg = User name
  • resource.pt-BR.txt
    Msg = Usuário
Para gerar o arquivo .resources, inicie o Command Prompt do Visual Studio .Net e use o executável resgen:
resgen resource.en-US.txt
resgen resource.pt-BR.txt
Estes comandos irão gerar o arquivo .resources.
 
Numa página ASP.NET de teste:
 
' Visual Basic
Dim cultura As String = Request.Form("cultura")
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultura)
Thread.CurrentThread.CurrentUICulture = New CultureInfo(cultura)
Dim rm As ResourceManager = ResourceManager.CreateFileBasedResourceManager ("resource", Server.MapPath("resources") & Path.DirectorySeparatorChar, Nothing)
Response.Write( rm.GetString("Msg"))
 
 
// C#
string cultura = Request.Form("cultura");
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultura);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultura);
ResourceManager rm = ResourceManager.CreateFileBasedResourceManager ("resource", Server.MapPath("resources") + Path.DirectorySeparatorChar, null);
Response.Write( rm.GetString("Msg"));
 
O código irá mostrar o conteúdo baseado no valor de uma entrada chamada "cultura".
 
Caso você esteja usando ASP.NET e necessite de um framework de localização mais robusto, pode usar o Enterprise Localization Toolkit:
 
Boa programação. 

Publicação via FTP no VS .NET 2003

Para quem já precisou publicar via FTP os arquivos que desenvolveu no Visual Studio .NET 2003, sabe que esta é uma tarefa ingrata (ou pelo menos trabalhosa). Não existe recurso nativo e usar um programa externo é pouco prático, principalmente para quem tem pouca experiência (selecionar os arquivos que devem ser distribuídos, atualizar apenas o que foi alterado, ...).

É aí que entra uma aplicação (que também tem uma add-in para o VS.NET) super interessante que facilita muito o trabalho de publicação via FTP: Unleash It. Ela é gratuita e está disponível em http://www.eworldui.net/unleashit/.

Sua configuração poderia ser mais intuitiva, mas uma vez gravados os dados do servidor de destino, seu uso se restringe a pressionar um botão.

OK, para você já está usando o Visual Studio 2005 esta dica não é útil, mas acredito que muitos ainda irão usar o VS.NET 2003 durante algum tempo e, para vocês que se encontram neste caso, esta é uma ferramenta quase indispensável (se você não usa FTP...).
 
第 1 张,共 2 张