Code Snippets no Visual Studio .NET
Code Snippets no Visual Studio .NET
------------------------------------------------------------------
Dica N�: 682
Assunto: .NET
T�tulo: Utilizando code snippets no .net
Dica:
Um recurso simples e muito interessante, mas pouco conhecido, � o recurso dos code
snippets no VS .NET
� comum criarmos pequenos trechos de c�digo que repetimos com muita frequencia,
como um tratamento de erro ou uma mensagem de confirma��o.
Para simplificar o uso de trechos de c�digo como esse podemos utilizar o recurso de
code snippets : Basta arrastar o trecho da janela de c�digo para a toolbox, em
qualquer aba, e o trecho de c�digo permanecer� ali para ser utilizado sempre que
desejarmos.
-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 635
Assunto: .NET
T�tulo: Criando propriedades din�micas nos seus componentes
Dica:
� muito interessante que possamos fazer o mesmo para nossos pr�prios componentes,
dando a possibilidade que nossas propriedades sejam configuradas como propriedades
din�micas.
Isso � bem mais simples do que pode parecer inicialmente. Basta aplicarmos um
atributo na propriedade que desejamos que se torne propriedade din�mica. Veja um
exemplo :
<RecommendedAsConfigurable(True)> _
Public Property MyProperty() As Integer
Get
' Insert code here.
Return 0
End Get
Set
' Insert code here.
End Set
End Property
-----------------------------------------------------------------------------------
---------------------------------------------
Alguns algor�timos s�o de uso muito comum e frequente, para esses � comum
utilizarmos a velha t�cnica do copy/past
Esse c�digo pode ser utilizado, por exemplo, em um customValidator de uma apl�ca��o
web.
IsCNPJ = False
a = 0
i = 0
d1 = 0
d2 = 0
j = 5
For i = 1 To 12 Step 1
a = a + (Val(Mid(strCNPJ, i, 1)) * j)
j = [Link](IIf(j > 2, j - 1, 9))
Next i
a = a Mod 11
d1 = [Link](IIf(a > 1, 11 - a, 0))
a = 0
i = 0
j = 6
For i = 1 To 13 Step 1
a = a + (Val(Mid(strCNPJ, i, 1)) * j)
j = [Link](IIf(j > 2, j - 1, 9))
Next i
a = a Mod 11
d2 = [Link](IIf(a > 1, 11 - a, 0))
If (d1 = Val(Mid(strCNPJ, 13, 1)) And d2 = Val(Mid(strCNPJ, 14, 1)))
Then
IsCNPJ = True
Else
IsCNPJ = False
End If
End Function
-----------------------------------------------------------------------------------
---------------------------------------------
Muitas vezes podemos desejar formatar uma data com uma cultura espec�fica,
independentemente das configura��es da m�quina.
Uma das formas de fazer isso � alterarmos a cultura para a thread atual, da
seguinte forma : [Link] =new
[Link]("en-us")
Quando estamos desenvolvendo smart clients este m�todo � adequado, mas quando
estamos desenvolvendo aplica��es web ou webservices nem tanto, porque estamos
alterando as caracter�sticas de uma thread que n�s n�o controlamos, esta thread
pode vir a ser reutilizada e a altera��o que fizemos pode prejudicar o
funcionamento de outras aplica��es no servidor, talvez at� a nossa mesmo.
Para resolver isso podemos usar o objeto CultureInfo para obtermos a formata��o de
uma data em uma cultura espec�fica. Veja :
s=[Link]([Link], "{0}", d)
Neste exemplo a vari�vel d ser� formatada de acordo com a cultura que criamos, sem
com isso alterarmos nenhuma caracter�stica da thread que est� executando este
c�digo.
-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 620
Assunto: .NET
T�tulo: Simplificando o uso de imports
Dica:
� muito comum precisarmos utilizar o imports nos arquivos do nosso projeto. Por�m
quando surge a necessidade de utilizarmos imports constantemente em v�rios arquivos
do projeto isso come�a a ficar cansativo.
-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 619
Assunto: .NET
T�tulo: Verificando se o dom�nio de um e-mail existe
Dica:
Uma boa forma de evitar cadastramentos com e-mail falso � verificar se o dom�nio de
um determinado endere�o de e-mail realmente existe.
Para fazer isso devemos realizar a resolu��o do nome DNS do servidor de dom�nio. Se
encontrarmos como resposta um endere�o IP, o dom�nio existe, se tivermos um erro
como resposta ent�o o servidor de dom�nio certamente n�o � v�lido.
Como podem notar, tarefas que antes eram muito dificeis de serem realizadas, tal
como uma resolu��o DNS via c�digo, com o Framework .NET se tornaram muito simples.
-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 607
Assunto: .NET
T�tulo: Gera��o de senhas aleat�rias
Dica:
Observe o uso do AndAlso e OrElse, recursos n�o documentados do [Link] que j� foram
citados em dicas aqui no site.
Function GetRandomPassword(ByVal length As Integer) As String
Static rand As New Random
Dim password As New [Link](length)
-----------------------------------------------------------------------------------
---------------------------------------------
Certamente voc�s j� devem ter ouvido falar que � sempre muito recomendado que
fa�amos o dispose dos objetos que utilizamos, para garantir a libera��o da mem�ria
utilizada.
Realmente, se n�o fizermos o dispose n�o temos como garantir em que momento os
recursos ser�o liberados, o que poderia nos gerar problemas
Mas se voc� tiver o perfil de S�o Tom� e tiver feito testes com o application
center para descobrir se a performance melhora mesmo, ficar� assustado ao descobrir
que voc� tem uma perda, n�o ganho de performance.
Simples : Performance e escalabilidade s�o duas coisas distintas que nem sempre
andam de m�os dadas. Neste exemplo � claro que o dispose vai gerar uma perda de
performance. Afinal, estamos realizando uma tarefa a mais dentro do nosso processo,
que � a tarefa de libera��o do objeto. Essa tarefa ir� consumir tempo e
performance.
Mas e a escalabilidade ?
Se n�o sabemos quanto tempo os recursos estar�o sendo consumidos (quando n�o damos
o dispose), ent�o temos ai um maior uso de mem�ria, desnecessariamente.
Consequentemente o volume de usu�rios que este servidor ir� suportar � menor do que
seria se estivessemos liberando os objetos.
Com isso observamos que com rela��o ao Dispose temos um t�pico conflito entre
Performance x Escalabilidade : Se fizermos perdemos performance mas economizamos
recursos para uma maior escalabilidade, se n�o fizermos ganhamos performance mas
consumiremos um maior volume de recursos.
-----------------------------------------------------------------------------------
---------------------------------------------
Uma das principais reclama��es dos programadores VB com o novo Visual Studio � n�o
poderem estar alterando c�digo durante o processo de depura��o. Os programadores de
ASP nem ligam muito, j� que a depura��o est� muito melhor do que existia em ASP,
mas os de VB notam a falta deste recurso.
-----------------------------------------------------------------------------------
---------------------------------------------
Provavelmente voc�s tamb�m j� usaram CTYPE para fazer Cast de dados. CAST � o nome
que damos ao fato de uma vari�vel j� conter uma informa��o (uma vari�vel j� conter
uma textbox, por exemplo), mas o .NET n�o saber disso, ent�o para termos o
intellisence (escrevi certo?) usamos o CTYPE mas sem a necessidade de converter,
fazendo apenas um CAST (a s�ntaxe � exatamente a mesma).
Mas exatamente pelo fato do CTYPE ter sido desenvolvido especialmente para
convers�o, ele fica mais lento na realiza��o do CAST, por isso acabamos tentando
evita-lo nessas situa��es.
Para resolver esse problema do CTYPE temos uma outra fun��o chamada DirectCast, que
funciona de forma semelhante ao CTYPE, mas n�o realiza convers�es de tipos, apenas
faz TypeCast.
Veja exemplos :
Assim sendo, quando desejarmos fazer um Cast podemos ao inv�s do CTYPE utilizarmos
o DirectCast e com isso ganharmos performance.
-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 513
Assunto: .NET
T�tulo: Marcando regi�es no c�digo
Dica:
Voc� com certeza j� deve ter notado a forma como o c�digo interno de defini��o de
um formul�rio ou de um webForm fica oculto, s� sendo exibido se clicarmos no sinal
de + na lateral esquerda.
Mas talvez voc� n�o tenha reparado no fato de que voc� tamb�m pode criar suas
pr�prias regi�es de c�digo, agrupando as suas rotinas de forma a organizar o seu
c�digo, facilitando a visualiza��o de determinados trechos de c�digo.
Para demarcar uma regi�o de c�digo utilizamos a instru��o #Region e #End Region em
torno da regi�o que deseja-se marcar.
Veja um exemplo :
#End Region
O texto especificado ao lado de Region ficar� vis�vel mesmo quando o c�digo for
ocultado.
-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 444
Assunto: .NET
T�tulo: Alinhando n�meros a direita
Dica:
A fun��o Format da classe String n�o possui recurso para alinhar um n�mero a
direita, mas podemos utiliza-la de forma associada a fun��o PadLeft, tamb�m da
classe string, para podermos chegar a este efeito.
Veja :
[Link]("{0:##,##0.00}", 10).PadLeft(10)
-----------------------------------------------------------------------------------
---------------------------------------------
O fato do RTF ser uma linguagem de marca��o e n�o bin�rio (blob), nos d� um grande
recurso : Se � uma linguagem de marca��o, ent�o podemos usar XSL para converter um
documento XML em RTF !
O XSL � uma linguagem derivada do XML utilizada para transformar um documento XML
em outro formato qualquer, podendo ser HTML, outro XML, ou, como no nosso caso, RTF
!
Isso significa que podemos pegar um conjunto de dados do banco de dados em formato
XML e gerar um documento texto utilizando os dados obtidos, incluindo at� mesmo
formata��es neste documento texto.
O DataSet j� nos auxilia a obter dados do banco em formato XML, basta ent�o
gerarmos um XSL para fazer a transforma��o dos dados em texto e pronto, teremos
nosso documento RTF !
---------------------------------------------------------ADO NET
----------------------------------------------------
Dica N�: 630
Assunto: [Link]
T�tulo: Atualizando DataSets em camadas
Dica:
Imagine um sistema windows simples, em camadas. Imaginemos uma tabela simples com
um campo autonumera��o sendo exibida em uma grid. Um componente (pode ser uma
classe, componente, etc) devolve um dataSet contendo os dados da tabela e recebe de
volta o dataSet para fazer a atualiza��o no servidor.
Para evitar que ocorra um conflito t�o cr�tico podemos utilizar as propriedades
AutoIncrementSeed e AutoIncrementStep. S�o propriedades do objeto dataColumn,
podemos encontra-las dentro do editor de um dataSet tipado. Atribuindo -1 e -1,
respectivamente, faremos com que a autonumera��o no dataSet seja negativa. Ao fazer
a atualiza��o no servidor o n�mero do servidor ser� atualizado no dataset, mas n�o
conflitar� com nenhum outro n�mero que o dataset j� possua.
1) O client precisa enviar os dados a serem atualizados para o servidor. N�o deve
enviar tudo e sim apenas os dados modificados. Por isso neste momento deve-se
utilizar o m�todo getChanges para obter uma c�pia do dataset apenas com as mudan�as
End Sub
End Sub
#End Region
End Sub
Eis o componente :
-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 657
Assunto: [Link]
T�tulo: Mais cuidados em transa��es com o adapter
Dica:
Por�m isso gera consequencias no trabalho com o dataset e precisamos estar muito
atentos a isso.
Mas durante este processo o adapter est� fazendo bem mais do que simplesmente
alterar o banco. Quando alteramos os dados do dataset, este guardou um status para
cada linha, informando que a linha encontra-se alterada. Ent�o, quando o adapter
grava os dados no banco ele modifica o status das linhas, indicando que foram
atualizadas com sucesso.
Mas quando fazemos uma transa��o, o erro pode acontecer no 3o registro, ent�o as
altera��es ser�o desfeitas. Mas neste ponto, o adapter j� ter� alterado o status do
1o e do 2o registro. Isso faz o dataset acreditar que os dados encontram-se v�lidos
quando na verdade n�o est�o mais v�lidos. Em uma pr�xima tentativa de grava��o
destes registros, os dados do dataset estar�o diferentes dos dados do banco e ser�
gerado um erro de viola��o de concorr�ncia.
Para evitar isso temos que fazer com que, quando estivermos realizando uma
transa��o, o adapter n�o atualize o status dos registros at� que todas as grava��es
tenham sido realizadas.
Podemos para isso usar o evento rowupdated do adapter. Podemos pedir que n�o
atualize o status das linhas. Mas h� um pequeno detalhe na l�gica : Se simplesmente
fizermos isso o adapter tamb�m n�o marcar� as linhas como erradas (j� viram as
bolinhas vermelhas ao lado de um datagrid?), o que se torna um problema. Ent�o
devemos pedir que a atualiza��o de status seja "pulada" apenas para os registros
que tiveram sucesso na atualiza��o (sem erros). Os que falharam n�o ter�o o status
atualizado, de qualquer forma.
[Link]
-----------------------------------------------------------------------------------
---------------------------------------------
Assim sendo, se sabemos que existem mais registros no dataReader mas n�o desejamos
l�-los, devemos cancelar a opera��o antes de fazermos o close, evitando assim um
excesso de tr�fego na rede.
Veja :
[Link]
[Link]
-----------------------------------------------------------------------------------
--------------------------------------------
Por�m quando isso � feito com o Data Provider do OLEDB o que o OLEDB faz �
transformar o nome da procedure que configuramos no CommandText na s�ntaxe do ODBC
para chamada de procedures (Calma ! Ele n�o vai usar ODBC, s� a s�ntaxe!).
O mal disso � que essa transforma��o do nome da procedure para a s�ntaxe ODBC gasta
um tempinho (muito pouco, mas gasta), ent�o se desejarmos uma otimiza��o neste
ponto podemos utilizar o [Link] e utilizarmos a s�ntaxe odbc diretamente
no commandText. Usando a s�ntaxe ODBC diretamente, o provider do OLEDB n�o ter� o
trabalho de converter a s�ntaxe.
Veja um exemplo :
dr = [Link]
-----------------------------------------------------------------------------------
---------------------------------------------
N�: 612
Assunto: [Link]
T�tulo: DataBinding e trabalho em camadas
Dica:
ds1=[Link]()
O problema disso � que os databindings neste momento j� haviam sido realizados com
um ponteiro apontando para o dataset anterior. Ao recebermos o novo, todos os
databindings se perdem.
dstmp=[Link]
[Link](dstmp)
Com esse c�digo utilizamos uma vari�vel tempor�ria para receber o dataset do
componente e depois realizamos um merge. Desta forma o ponteiro de objeto original
n�o � destruido, apenas importa os dados do dataset vindo do componente.
-----------------------------------------------------------------------------------
---------------------------------------------
Se for encontrado algum erro durante as atualiza��es feitas pelo adapter, ele j�
ter� realizado no banco parte das atualiza��es e ir� parar pela metade.
Por�m existem casos em que n�o desejamos que apenas parte das atualiza��es sejam
realizadas. Existem casos nos quais desejamos realizar tudo ou cancelar tudo, ou
seja, uma transa��o.
Veja um exemplo :
Dim tr As [Link]
[Link]([Link])
[Link] = tr
[Link] = tr
[Link] = tr
Try
[Link](ds1)
[Link]()
Catch er As Exception
[Link]()
End Try
Mas existe nisso um pequeno problema que precisamos contornar. Quando o adapter faz
o update ele reseta o status dos registros no dataset. O rollback feito na
transa��o ir� desfazer as execu��es no banco, mas n�o as altera��es de status no
dataset, consequentemente perderemos o controle do que estava alterado.
Para contornar isso podemos usar o GetChanges e um dataset secund�rio para fazer a
atualiza��o. O GetChanges gera uma c�pia do dataset com todos os registros
alterados. Ent�o fazemos o update sobre a c�pia. Se a transa��o falhar, descartamos
a c�pia e pelo original ainda sabemos quais registros foram alterados. Se, por�m, a
transa��o funcionar, resetamos os status dos registros do dataset original.
Dim tr As [Link]
Dim dsAlterados As DataSet
dsAlterados = [Link]
[Link]([Link])
[Link] = tr
[Link] = tr
[Link] = tr
Try
[Link](dsAlterados)
[Link]()
[Link]()
Catch er As Exception
[Link]()
End Try
Observe como o acceptChanges ap�s o commit faz com que os status do dataset
original sejam resetados, pois tudo foi aceito pelo banco.
Vale lembrar ainda que o tratamento de erros no update muda drasticamente de acordo
com o valor da propriedade ContinueUpdateonError, que determina se o adapter vai
parar a atualiza��o no primeiro erro ou vai executar todos os corretos e s� depois
parar. Mas no caso de uma transa��o, j� que tudo s� pode ser feito em conjunto o
�nico valor que faz sentido para essa propriedade � False, e o c�digo acima j� foi
feito para este caso.
-----------------------------------------------------------------------------------
--------------------------------------------
Dica N�: 599
Assunto: [Link]
T�tulo: Trabalhando com m�ltiplos Adapters
Dica:
O DataAdapter possui um recurso j� conhecido com rela��o a conex�o : Ele � capaz de
abrir e fechar a conex�o sozinho quando fazemos o Fill de um dataset.
[Link](ds1)
[Link](ds1)
Os dois adapters ir�o preencher o DS1 com as tabelas que est�o buscando do banco.
O problema � que os adapters quando utilizados desta forma realmente abrem e fecham
a conex�o, ent�o o c�digo acima tem 2 aberturas de conex�o e dois fechamentos, o
que provoca um consumo desnecess�rio de recursos.
Voc�s podem ainda pensar no uso do pooling. Devido ao pooling a conex�o j� estar�
aberta mesmo e n�o haver� prejuizo.
Ocorre que quando a conex�o � pega do pooling � executada uma procedure chamada
sp_reset_connection, que tem por objetivo resetar o status da conex�o
(caracter�sticas b�sicas da conex�o). Essa procedure causar� um consumo de recursos
desnecess�rio.
[Link]()
[Link](ds1)
[Link](ds1)
[Link]()
Voc� pode utilizar o Profiler do SQL Server para comprovar a diferen�a que estas
instru��es causam na comunica��o com o servidor.
-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 546
Assunto: [Link]
T�tulo: Evite utilizar o DataSet quando poss�vel
Dica:
O DataSet � um objeto que tem por objetivo armazenar v�rias tabelas (datatables) no
lado client. Por�m quando desejarmos obter os dados de apenas uma tabela podemos
evitar o uso do DataSet e utilizarmos apenas uma DataTable, desta forma tornando a
aplica��o um pouco mais leve.
Por exemplo :
---------------------------------------------------------ASP
------------------------------------------------------------------
Dica N�: 369
Assunto: ASP
T�tulo: Gravando erros no log do sistema operacional
Dica:
O WSH (Windows Script HOST) fornece um objeto SHELL que pode ser utilizado atrav�s
do ASP e um dos recursos que ele possui � gravar log de erros no evet viewer do
sistema operacional.
Veja um exemplo :
0 � Successo
1 � Erro
2 � Warning
4 � Informa��o
Mais uma vez utilizando o Windows Script Host podemos realizar leituras de chaves
de registry atrav�s do ASP. Isso nos tr�s um novo e seguro local para guardarmos
strings de conex�o com o banco. Veja um exemplo :
<%
Set objShell = CreateObject("[Link]")
[Link] �Registry Value: � & [Link]("RegistryPath") %>
HKCU - HKEY_CURRENT_USER
HKLM - HKEY_LOCAL_MACHINE
HKCR - HKEY_CLASSES_ROOT
-----------------------------------------------------------------------------------
---------------------------------------------
Uma forma t�pica de enviar e-mails em HTML � montar o c�digo HTML com imagens
apontando para URLs no seu pr�prio site.
Por�m isso faz com que o e-mail s� possa ser lido on-line, pois as imagens ter�o
que ser recuperadas do seu site quando o e-mail for aberto. Para resolver este
problema temos o m�todo attachURL do objeto newmail.
Esse m�todo funciona de forma semelhante ao m�todo attachFile, mas permite que o
arquivo attachado seja utilizado dentro do c�digo HTML, como se houvesse uma URL
para ele.
Dim myMail
Set myMail = CreateObject("[Link]")
-----------------------------------------------------------------------------------
---------------------------------------------
-----------------------------------------------------------------------------------
--------------------------------------------
Dica N�: 336
Assunto: ASP
T�tulo: Upload sem componentes
Dica:
O upload de arquivos � na verdade uma mudan�a na forma de codifica��o dos dados que
s�o transferidos do client para o servidor.
Normalmente isso � feito por componente, mas n�o quer dizer que n�o possa ser feito
diretamente em c�digo ASP. Veja o exemplo desta sub :
<%
Sub BuildUploadRequest(RequestBin)
'Get the boundary
PosBeg = 1
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
boundaryPos = InstrB(1,RequestBin,boundary)
'Get all data inside the boundaries
Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString("--")))
'Members variable of objects are put in a dictionary object
Dim UploadControl
Set UploadControl = CreateObject("[Link]")
'Get an object name
Pos = InstrB(BoundaryPos,RequestBin,getByteString("Content-Disposition"))
Pos = InstrB(Pos,RequestBin,getByteString("name="))
PosBeg = Pos+6
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
Name = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
PosFile = InstrB(BoundaryPos,RequestBin,getByteString("filename="))
PosBound = InstrB(PosEnd,RequestBin,boundary)
'Test if object is of file type
If PosFile<>0 AND (PosFile<PosBound) Then
'Get Filename, content-type and content of file
PosBeg = PosFile + 10
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
'Add filename to dictionary object
[Link] "FileName", FileName
Pos = InstrB(PosEnd,RequestBin,getByteString("Content-Type:"))
PosBeg = Pos+14
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
'Add content-type to dictionary object
ContentType = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
[Link] "ContentType",ContentType
'Get content of object
PosBeg = PosEnd+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
Else
'Get content of object
Pos = InstrB(Pos,RequestBin,getByteString(chr(13)))
PosBeg = Pos+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
End If
'Add content to dictionary object
[Link] "Value" , Value
'Add dictionary object to main dictionary
[Link] name, UploadControl
'Loop to next object
BoundaryPos=InstrB(BoundaryPos+LenB(boundary),RequestBin,boundary)
Loop
End Sub
Essas subs foram criadas para manipular o objeto request obtendo dele o arquivo que
sofreu upload e inserindo este arquivo dentro de um objeto [Link].
O par�metro que ela recebe � a leitura bin�ria do objeto request, assim sendo
come�amos da seguinte forma :
RequestBin = [Link](byteCount)
Dim UploadRequest
Set UploadRequest = CreateObject("[Link]")
Chamamos a sub :
BuildUploadRequest(RequestBin)
contentType = [Link]("blob").Item("ContentType")
filepathname = [Link]("blob").Item("FileName")
filename = Right(filepathname,Len(filepathname)-InstrRev(filepathname,"\"))
value = [Link]("blob").Item("Value")
caminho= [Link](".")
caminho=caminho &"\upload\"
'Create FileSytemObject Component
Set ScriptObject = [Link]("[Link]")
For i = 1 to LenB(value)
[Link] chr(AscB(MidB(value,i,1)))
Next
[Link] %>
-------------------------------------------------------ASP NET
------------------------------------------------------------------
Configura��es personalizadas usando [Link]
Muitas vezes, voc� quer incluir configura��es globais para sua aplica��o, como uma
string de conex�o com uma base de dados. No ASP cl�ssico (3.0), isso � poss�vel de
ser feito usando o arquivo [Link]. No .NET, existe um nova op��o: o arquivo
[Link] file (XML-based), e uma se��o especial chamada AppSettings.
No [Link]:
<configuration>
<appSettings>
<add key="PubsDSN" value="server=(local);database=pubs;uid=sa;pwd=;" />
</appSettings>
</configuration>
Na p�gina:
<html>
<body>
<%=[Link]["PubsDSN"]%>
</body>
</html>
-----------------------------------------------------------------------------------
----------
Mas quando surge uma necessidade como esta, que nos exige ter maior controle sobre
a interface gr�fica, ent�o precisamos estar atentos ao fato de que ainda precisamos
conhecer as tecnologias da web, tal como o javascript, indispens�vel para a
constru��o de uma boa interface gr�fica na web.
Utilizando javascript, podemos chegar nesse resultado facilmente, veja como fica :
-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 683
Assunto: [Link]
T�tulo: Fazendo referencia a path no [Link]
Dica:
Quando criamos nossa aplica��o [Link] ela vira um diret�rio virtual abaixo do
diret�rio raiz do site.
Imagine que dentro de nossa aplica��o temos v�rias sub-pastas, uma delas chamada
image, para guardar os arquivos de imagem.
Agora digamos que queremos fazer uma refer�ncia para um arquivo na pasta image. Se
fizermos /image/[Link] estar� errado, pois / representa a raiz do site, que
est� acima da nossa aplica��o.
Observe que isso apenas pode ser feito em webControls, componentes rodando no
servidor, tags html simples n�o entender�o isso.
-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 673
Assunto: [Link]
T�tulo: Personalizando a mensagem de acesso negado
Dica:
Se o usu�rio n�o se logou e � desviado para a tela de login isso � algo totalmente
natural. Mas se o usu�rio j� se logou e � desviado para a tela de login por n�o ter
permiss�o de acessar determinada p�gina o usu�rio vai, no m�nimo, ficar confuso.
Precisamos ent�o dar alguma mensagem personalizada para o usu�rio, mas o formul�rio
de login � sempre o mesmo. Ent�o precisaremos identificar quando o formul�rio de
login foi chamado porque o usu�rio n�o est� logado ou porque n�o tem permiss�o de
ver algo.
-----------------------------------------------------------------------------------
---------------------------------------------
Talvez voc� j� tenha notado que ao tentar chamar um arquivo [Link] pelo browser
o servidor IIS nega o acesso ao arquivo [Link].
Esse n�o � o comportamento padr�o do IIS. O IIS foi especialmente configurado para
negar o acesso aos arquivos [Link] (extens�o .config). Assim como isso foi
feito para a extens�o .config isso pode ser feito para outras extens�es tamb�m, o
que gera in�meras possibilidades. Veja o que voc� pode fazer com esse recurso :
Nesta tela observamos v�rios mapeamentos de extens�o com aplica��es que processam
essas extens�es de arquivo. Precisamos ent�o mapear a extens�o que desejamos
trabalhar com o [Link]. Podemos clicar em ADD e na caixa que surge indicarmos a
extens�o (.MDB por exemplo) e a aplica��o - aspnet_isapi.dll que normalmente se
encontra em $WINDOWS_DIR$\[Link]\Framework\$VERSION$
Uma op��o tamb�m � proibir totalmente o acesso ao arquivo, como acontece com
arquivos com a extens�o .config. Para isso devemos adicionar as seguintes tags no
[Link] :
<httpHandlers>
<add verb="*" path="*.mdb" type="[Link]" />
</httpHandlers>
Com isso estamos proibindo por completo o acesso a arquivos com a extens�o .MDB.
Observe que isso s� funciona porque configuramos o IIS informando que os
arquivos .MDB seriam tratados pelo [Link]
Essa proibi��o tamb�m pode ser feita para todos os sites da m�quina, inserindo essa
tag no [Link]
-----------------------------------------------------------------------------------
---------------------------------------------
-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 634
Assunto: [Link]
T�tulo: Impedindo o cache no browser do usu�rio
Dica:
[Link]([Link])
-----------------------------------------------------------------------------------
---------------------------------------------
A estrutura de funcionamento do HTTP nos permite trocar dados entre p�ginas atrav�s
de m�todos GET e POST. Como no [Link] n�o podemos fazer POST para outra p�gina,
ent�o ficamos limitados ao uso do GET.
Mas existe um outro truque que nos permite realizar a troca de dados. Utilizando o
[Link], ao inv�s do [Link], a troca de uma p�gina web para
outra p�gina web acontece no servidor. Isso faz com que tudo o que foi gerado na
primeira requisi��o seja mantido.
Neste caso temos duas formas de passar os dados : Podemos fazer com que os
webControls do webform1 fiquem visiveis ao webform2 ou podemos tranferir valores
isolados.
J� para a passagem de um valor simples foi criada uma propriedade, Valor, para
manter esta informa��o.
-----------------------------------------------------------------------------------
---------------------------------------------
Ent�o para podermos realizar este tipo de algor�timo devemos localizar o form e s�
ent�o fazer la�os com os controles contidos dentro do form. Podemos criar uma
fun��o que possa localizar e devolver o objeto form dentro da cole��o [Link].
Veja como fica :
End Sub
Recursos como esses podem ser produzidos em classes base e as p�ginas podem herdar
destas classes, como comentamos em outras dicas aqui no site
-----------------------------------------------------------------------------------
---------------------------------------------
Em uma dica anterior citamos algumas vantagens do uso do loadcontrol para carregar
web user control dinamicamente, em [Link]
titulo1=loadcontrol("[Link]")
[Link]="qualquercoisa"
[Link](titulo1)
Ent�o para resolver este problema temos que tratar a possibilidade de estarmos
recebendo um PartialCachingControl. Este objeto possui uma propriedade chamada
CachedControl que cont�m uma refer�ncia para o controle em quest�o, Titulo neste
exemplo.
Ent�o o c�digo, anteriormente simples, tem agora que prever todas essas
possibilidades. Veja como fica o c�digo :
obj=loadcontrol("[Link]")
[Link](obj)
Com isso � muito frequente surgir a d�vida : Como redirecionar o usu�rio para a
p�gina de login quando a sess�o dele for encerrada ?
Bem, vamos ver como resolver isso. � interessante observar que n�o iremos
redirecionar o usu�rio para a p�gina de login quando a sess�o for encerrada, mas
sim quando ela se iniciar. A sess�o � encerrada por timeout, nesse momento nem
sabemos se o usu�rio ir� mesmo voltar ou n�o. A quest�o � quando ele volta, a
sess�o � reiniciada por�m ele j� tem o cookie de autentica��o.
[Link]()
� claro que poder�amos for�ar um redirect direto para a tela de login, mas quanto
mais deixarmos essa tarefa por conta do [Link], melhor. Ent�o o que podemos fazer
� for�ar a que a sequencia de eventos seja executada novamente, fazendo um redirect
para a pr�pria p�gina. Veja como fica :
[Link]()
[Link]([Link]("script_name"))
O que vai acontecer � que o redirect ir� provocar a re-execu��o dos eventos e no
evento application_authenticaterequest, ao ser identificado que o usu�rio n�o
possui mais o cookie de autentica��o, ele ser� automaticamente desviado para a tela
de login, sem a necessidade de c�digo algum neste evento.
if instr(ucase([Link]("script_name")),"[Link]")=0 then
[Link]()
[Link]([Link]("script_name"))
end if
-----------------------------------------------------------------------------------
---------------------------------------------
Uma necessidade interessante � que possamos criar uma Grid com tamanho fixo e barra
de rolagem. Assim sendo fixamos o tamanho da grid e se os registros sendo exibidos
ultrapassarem o espa�o fixado � criada uma barra de rolagem para a grid.
Podemos fazer isso criando uma DIV em volta da grid. Veja como fica :
As configura��es de estilo fazem com que a grid fique com tamanho fixo e gere a
barra de rolagem caso esse tamanho seja ultrapassado.
O problema � que tudo ser� rolado, inclusive cabe�alho e rodap�. Ent�o para que
isso fique realmente adequado o cabe�alho e rodap� precisar�o ser produzidos de
forma personalizada fora do div.
-----------------------------------------------------------------------------------
---------------------------------------------
<img src={0}>
O {0} indica o local onde ser� inserido o conte�do do campo na montagem do HTML, a
datagrid se encarregar� de fazer isso automaticamente e, desta forma, as imagens
ser�o exibidas.
-----------------------------------------------------------------------------------
---------------------------------------------
O nome do arquivo que a propriedade FileName nos fornece inclui o path do arquivo
no client. Por causa disso precisaremos ter o cuidado de separar o nome do arquivo
do path antes de fazermos a grava��o do arquivo.
- Foi utilizado um For/Each para generalizar a grava��o dos arquivos. Desta forma
podemos inserir quantos input file desejarmos no formul�rio e o c�digo ir� tratar
de todos eles.
- O uso do [Link] deixa o c�digo mais gen�rico. Desta forma evitamos manter
um caminho fixo no c�digo, deixando-o flexivel com rela��o ao servidor.
</script>
<html>
<head>
</head>
<body>
<form method="post" enctype="multipart/form-data" runat="Server">
<br />
<input id="nomeArquivo" type="file" size="20" runat="Server" />
<br />
<input id="nomeArquivo2" type="file" size="20" runat="Server" />
<br />
<input type="submit" value="Upload" runat="Server" onserverclick="File_Upload" />
</form>
</body>
</html>
-----------------------------------------------------------------------------------
---------------------------------------------
Para corrigir o [Link] devemos primeiro ter certeza se a montagem do XML est�
ou n�o v�lida. Para fazermos isso podemos clicar com o bot�o direito e utilizar a
instru��o Create Schema. o [Link] n�o ir� criar o Schema, devido a tag [Link],
mas dir� se o XML est� ou n�o v�lido.
Estando o XML v�lido sabemos ent�o que o erro � a organiza��o dos elementos. Para
descobrirmos ent�o devemos utilizar um truque : Chamar o internet explorer por fora
do [Link] e tentarmos executar uma p�gina ASPX. Dar� erro, claro, mas a mensagem
indicar� para n�s exatamente onde est� o erro, coisa que o [Link] n�o faz.
-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 550
Assunto: [Link]
T�tulo: Gerando mensagens tipo Alert
Dica:
� muito comum termos situa��es em que desejamos passar uma mensagem para o usu�rio
mas sem que ela fique exposta em um label. As vezes trata-se de uma mensagem
r�pida, tal como "Registro gravado com sucesso !" ou algo do g�nero que gostariamos
que aparecesse na forma de Alert.
Por�m o [Link] n�o fornece muita facilidade para isso. Mas podemos, com alguns
truques, resolver o problema. Podemos criar uma sub para gerar a mensagem no client
e programar na TAG body para chamar a mensagem (ou n�o).
Veja :
Nas declara��es :
Private TemMensagem as Boolean
As Subs :
No ASPX :
Observem a forma como o eventoload gera ou n�o a chamada da fun��o conforme o valor
da vari�vel boleana.
-----------------------------------------------------------------------------------
---------------------------------------------
O problema � que n�o podemos inserir o evento onClick diretamente no bot�o delete
da grid. Temos que inserir o OnClick como um atributo para o client.
Para fazer isso temos que programar o evento OnItemCreated da grid. Esse evento �
executado para cada linha da grid que � criada (desenhada na p�gina). Neste evento
faremos o seguinte :
Capturar o bot�o delete :
dim botao as webcontrol
botao=[Link](0).Controls(0)
-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 467
Assunto: [Link]
T�tulo: Criando uma confirma��o no bot�o excluir da GRID
Dica:
Segundo a dica 347, basta utilizarmos uma codifica��o no evento itemcreated da grid
para conseguirmos inserir a mensagem no bot�o.
Ocorre que o evento itemcreated � executado para cada c�lula criada na grid. Ent�o
se ele est� sendo executado para a primeira c�lula (0) a c�lula do bot�o delete
(digamos que seja 5, depende da grid) ainda n�o existe e a instru��o n�o
funcionar�.
end if
--------------------------------------------------------VB
NET------------------------------------------------------------------
Dica N�: 640
Assunto: [Link]
T�tulo: Acessando a identidade do usu�rio do Windows
Dica:
O Framework .NET nos permite facilmente acessar a identidade do usu�rio do Windows.
Para fazer isso, por�m, temos que pedir que o Application Domain (o espa�o em que
nossa aplica��o est� rodando) utilize a identifica��o do Windows, e ent�o poderemos
acessa-la.
[Link]([Link]
wsPrincipal)
user=[Link]
A partir deste ponto podemos utilizar as propriedades de user para identificar, por
exemplo, em qual grupo ele est�. Por exemplo, podemos esconder um certo bot�o se
ele n�o for do grupo Admins, veja :
[Link]=[Link]("Admin")
-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 656
Assunto: [Link]
T�tulo: Disparar uma URL no browser padr�o
Dica:
Com a integra��o das aplica��es com a web essa se tornou uma tarefa cada vez mais
necess�ria, e uma pergunta comum � : Como fazer ?
Felizmente trata-se de uma tarefa muito simples. Basta disparar a execu��o da URL
como se esta fosse uma aplica��o qualquer. O SO identificar� que trata-se de uma
URL e ir� disparar o browser padr�o.
[Link]("[Link]
-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 626
Assunto: [Link]
T�tulo: Efeito de desaparecimento no fechamento de um Form
Dica:
Com os novos recursos disponibilizados pelo .NET ficou ainda mais f�cil criar
efeitos visuais nos formul�rios Windows.
Seguindo esse plano, podemos fazer um Override no m�todo onclosing do form. Este
m�todo ocorre imediatamente antes do evento closing, que identifica o momento em
que o formul�rio est� fechando.
Com isso podemos criar forms herdados (add->inherited form) e todos os forms que
adicionarmos desta forma estar�o implementando automaticamente este efeito de
desaparecimento.
Outro recurso tamb�m �til � fazer com que o efeito seja configur�vel. O c�digo pode
consultar uma configura��o no registry para decidir se implementa o efeito ou n�o.
Isso permitir� que um usu�rio que tenha mais pressa possa configurar a aplica��o
para desativar os efeitos e desta forma ter um fechamento mais r�pido dos
formul�rios. Veja um exemplo :
If [Link]("UsarEfeitos", 1) = 1 Then
Dim i As Decimal = 1
-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 337
Assunto: [Link]
T�tulo: Criando excess�es personalizadas
Dica:
Quem j� come�ou a trabalhar com o .NET j� conheceu, sem d�vida, a forma de gerar um
erro quando ocorrer uma falha de neg�cio :
O truque est� na forma como o [Link] trabalha orientado a objetos. Para criar um
erro personalizado devemos criar uma nova classe de erro que herde a Exception,
veja :
End class
E captura-lo no catch.
Observe que em nosso erro personalizado n�o � poss�vel adicionar uma mensagem. Isso
porque a mensagem � recebida pelo construtor da classe e o construtor n�o �
herdado, cada classe deve ter o seu. Assim sendo, para que no nosso erro seja
poss�vel inserir uma mensagem personalizada devemos fazer um construtor, veja :
End class
#if log
sub log(msg as string)
[Link] msg,1
end sub
#end if
Por�m isso resolve o problema de facilmente eliminar uma sub do c�digo, mas n�o
elimina suas chamadas. Assim todas as chamadas para esta sub passariam a dar erro.
A inser��o do atributo conditional faz com que as chamadas desta sub sejam ou n�o
eliminadas. Desta forma sim resolvemos o problema de manter log em tempo de
depura��o e retira-lo facilmente na aplica��o final.
A vari�vel Log pode ser definida na p�gina Build da janela propriedades de projeto,
em configuration properties.
-----------------------------------------------------------------------------------
--------------------------------------------
Os itens de menu do [Link] possuem 2 propriedades que podem ser utilizadas para
criar menus em colunas : Break e BarBreak. Basta atribuir true a uma destas
propriedades de um item de menu e tal item se transforma em uma quebra de colunas
no menu
Veja um exemplo :
[Link] = True
-----------------------------------------------------------------------------------
--------------------------------------------
Ambas as propriedades devolvem um objeto RegistryKey, que pode ser manipulado para
a realiza��o de grava��es.
Dim x, y As [Link]
x = [Link]()
y = [Link]("teste")
[Link]("testando", 10)
-----------------------------------------------------------------------------------
--------------------------------------------
Os objetos command do [Link] (Tanto sql command como oledbcommand) possuem uma
vers�o (overload) do m�todo executereader que aceita um par�metro adicional :
Um dos valores de um enumeration chamado CommandBehavior.
Um dos valores mais interessantes � o valor CloseConnection. Isso far� com que a
conex�o seja fechada assim que o datareader for fechado. Assim sendo, se o
datareader for passado como par�metro para outro local do c�digo, por exemplo, n�o
precisamos ter preocupa��es com a conex�o : Quando o datareader for fechado a
conex�o � fechada.
Veja um exemplo :
reader = [Link]([Link]);
-----------------------------------------------------------------------------------
-------------------------------------------
O Framework .NET tem uma classe chamada WebClient. Essa classe encapsula o uso da
classe HTTPWebRequest e HTTPWebResponse.
Ou seja : A classe WebClient � uma forma simples de recuperar uma informa��o da
web, uma p�gina web, por exemplo.
Vejamos um exemplo bem simples, recuperando um XML do site DevX e exibindo via
MSGBOX :
b = [Link]("[Link]
For Each x In b
[Link](Chr(x))
Next
MsgBox([Link])
-----------------------------------------------------------------------------------
-------------------------------------------
CurrentChanged : Indica que ocorreu uma altera��o no registro atual. Este evento
pode ser utilizado para validar dados, por exemplo.
PositionChanged : Indica que a posi��o atual nos registros foi alterada. Pode ser
utilizado, por exemplo, para atualizar uma contagem de registros na tela.
-----------------------------------------------------------------------------------
-------------------------------------------
Dica N�: 622
Assunto: [Link]
T�tulo: Identificando eventos do sistema
Dica:
� muito frequente precisarmos identificar a ocorr�ncia de eventos do sistema. Por
exemplo, algumas aplica��es dependem da hora do sistema e precisam se proteger caso
o usu�rio resolva alterar o rel�gio do micro.
A instru��o AddHandler nos permite ligar uma Sub a um evento em Run-time. A sub
MudouHora, neste exemplo, ser� avisada sempre que o rel�gio for alterado.
-----------------------------------------------------------------------------------
-------------------------------------------
Por mais que utilizemos try/catch, sempre pode ocorrer algum erro imprevisto na
aplica��o.
Para evitar esse tipo de problema podemos realizar uma captura de excess�es
diretamente no Application Domain. O Application Domain �, por assim dizer, o
espa�o de execu��o da nossa aplica��o.
Para fazer isso, devemos incluir um m�dulo e uma sub Main para ser a sub de start
do projeto. Na sub main, capturamos o evento para tratamento de excess�es e damos
seguimento com a aplica��o.
Module Module1
Public Sub main()
AddHandler [Link], _
AddressOf trataerro
Dim x As New Form1
[Link](x)
End Sub
End Module
-----------------------------------------------------------------------------------
-------------------------------------------
Dica N�: 380
Assunto: [Link]
T�tulo: Otimizando compara��es de string
Dica:
O [Link] � orientado a objetos, por isso mesmo constantes s�o interpretadas pelo
compilador como um objeto.
Assim sendo, se uma constante "Bufalo" existir mais de uma vez no c�digo o
compilador considera as duas constantes (que s�o iguais) como um mesmo objeto.
x="Bufalo"
if x="Bufalo" then
....
end if
Esse � o c�digo t�pico gerado por um programador. Mas sabendo-se que as constantes
s�o objetos, ent�o o if pode ter a sua performance melhorada alterando-o para o
seguinte :
if x is "Bufalo" then
....
end if
--------------------------------------------------------
VB-------------------------------------------------------------------------
Dica N�: 367
Assunto: Visual Basic
T�tulo: Enviando dados via POST com o INET
Dica:
O componente INET do VB nos permite fazer transmiss�es de dados via m�todo POST,
nos permitindo realizar comunica��es, troca de dados, com p�ginas na web mesmo que
estas n�o tenham sido preparadas para este fim.
A transmiss�o POST apenas pode ser realizada atrav�s do m�todo EXECUTE e n�o
atrav�s do m�todo OPENURL. Mas al�m disso existe um truque para que a transmiss�o
funcione : � necess�rio enviar ao servidor um cabe�alho indicando o que est� sendo
transmitido, do contr�rio o servidor ir� ignorar os dados.
Lembre-se que o m�todo execute � assincrono, ou seja, a aplica��o n�o ir� parar
esperando que ele seja executado. Portanto � necess�rio que voc� recupere a
resposta do servidor atrav�s do m�todo getchunk utilizado no evento statechanged,
veja :
If State = 12 Then
Do
vtdata = [Link](1024, icString)
res = res & vtdata
Loop While Len(vtdata) <> 0
[Link] res
End If
End Sub
-----------------------------------------------------------------------------------
----------------------------------------------
O RDS j� est� saindo de moda, sendo substituido pelo SOAP. Ainda assim vale a pena
analisarmos um pouco do que ele � capaz de fazer.
Junto ao ADO temos um provider chamado MS Remote. O MS Remote nos permite fazer
acesso a providers remotos. Quer dizer, fazer com que a string de conex�o que
estamos utilizando n�o seja processada no nosso servidor, mas em um servidor
remoto.
Mais simples que isso, imposs�vel. Mas os mais atentos j� devem ter notado que �
necess�rio que exista algo no servidor (aluno02, neste exemplo), em sua porta 80,
para receber a requisi��o que est� sendo realizada.
[Link]
[Link]
[Link]
[Link]
oledbprovusing_the_ole_db_remoting_provider__a_closer_look.asp
[Link]
-----------------------------------------------------------------------------------
----------------------------------------------
-----------------------------------------------------------------------------------
----------------------------------------------
-----------------------------------------------------------------------------------
----------------------------------------------
-----------------------------------------------------------------------------------
----------------------------------------------