0% acharam este documento útil (0 voto)
8 visualizações45 páginas

Code Snippets no Visual Studio .NET

As três dicas resumem técnicas e recursos do .NET Framework: 1) utilizar snippets de código para reutilizar trechos comumente usados; 2) criar propriedades dinâmicas para configurar componentes; 3) validar CNPJs com um algoritmo comum.
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato TXT, PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
8 visualizações45 páginas

Code Snippets no Visual Studio .NET

As três dicas resumem técnicas e recursos do .NET Framework: 1) utilizar snippets de código para reutilizar trechos comumente usados; 2) criar propriedades dinâmicas para configurar componentes; 3) validar CNPJs com um algoritmo comum.
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato TXT, PDF, TXT ou leia on-line no Scribd

---------------------------------------------------------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.

Em tempo : Qualquer aba EXCETO a clipboard ring

-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 635
Assunto: .NET
T�tulo: Criando propriedades din�micas nos seus componentes
Dica:

� comum criarmos componentes, CustomWebControls ou componentes para serem usados em


ambientes de smart Client, aumentando a reutiliza��o de funcionalidades e
enriquecendo nossa interface, quer seja windows ou web.

Um recurso muito importante existente em alguns componentes que acompanham o


framework � o recurso das propriedades din�micas. Alguns componentes, tais como o
oledbconnection, possuem propriedades din�micas.

No exemplo do OLEDBConnection a propriedade din�mica � ConnectionString. Isso


significa que configurando a connectionstring adequadamente podemos guardar o valor
da string de conex�o fora da aplica��o, no [Link] no caso de uma aplica��o web
ou no arquivo de manifesto no caso de uma aplica��o Windows.

� 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

Pronto, nossa propriedade aparecer� entre as propriedades din�micas na janela de


propriedades

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 624


Assunto: .NET
T�tulo: Valida��o de CNPJ
Dica:

Alguns algor�timos s�o de uso muito comum e frequente, para esses � comum
utilizarmos a velha t�cnica do copy/past

Um deles � o de valida��o de CNPJ. Segue ent�o um c�digo de valida��o de CNPJ em


[Link] .

Esse c�digo pode ser utilizado, por exemplo, em um customValidator de uma apl�ca��o
web.

Public Function IsCNPJ(ByVal strCNPJ As String) As Boolean

IsCNPJ = False

Dim a, j, d1, d2 As Double


Dim i As Integer

If Len(strCNPJ) <> 14 Then


IsCNPJ = False
Exit Function
End If

If Not IsOnlyNumber(strCNPJ) Then


IsCNPJ = False
Exit Function
End If

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

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 608


Assunto: .NET
T�tulo: Formatar uma data em qualquer cultura
Dica:

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 :

Dim ciDe As New [Link]("en-us")


Dim s as string

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.

Para simplificarmos a utiliza��o do imports podemos realizar o imports a n�vel de


projeto ao inv�s de a n�vel de arquivo. Para fazermos isso basta entrarmos nas
propriedades do projeto atrav�s do solution explorer.

Na tela que se abre devemos selecionar, a esquerda, a op��o imports, ent�o


poderemos configurar os imports para todo o projeto ao inv�s de para um arquivo
espec�fico.

-----------------------------------------------------------------------------------
---------------------------------------------
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.

No [Link] pode-se, por exemplo, usar um CustomValidator para realizar a valida��o


de endere�os de correio. Veja como fica o c�digo de valida��o :

Dim dominio As String


Dim obj As [Link]
dominio = [Link]([Link]("@") + 1)
Try
obj = [Link](dominio)
[Link] = [Link](0).ToString
Catch er As Exception
[Link] = False
'ou, para aplica��es windows
'msgbox("Dom�nio inv�lido!")
End Try

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:

A fun��o abaixo utiliza o StringBuilder e a classe Random para fazer a gera��o de


uma senha aleat�ria com digitos e letras.

O par�metro de entrada � o tamanho da senha, a saida ser� a senha formada.

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)

For i As Integer = 1 To length


Dim charIndex As Integer
' allow only digits and letters
Do
charIndex = [Link](48, 123)
Loop Until (charIndex >= 48 AndAlso charIndex <= 57) OrElse (charIndex _
>= 65 AndAlso charIndex <= 90) OrElse (charIndex >= 97 AndAlso _
charIndex <= 122)
' add the random char to the password being built
[Link]([Link](charIndex))
Next
Return [Link]()
End Function

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 596


Assunto: .NET
T�tulo: Dispose ou n�o dispose, eis a quest�o
Dica:

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.

Mas afinal, por que ??????????????????????

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.

Quando n�o damos o dispose, o dispose � realizado pelo Garbase Collector. O GC


utiliza threads para realizarem a libera��o de recursos de uma forma tal que isso a
principio n�o afeta a continuidade do processamento na nossa aplica��o.

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.

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 514


Assunto: .NET
T�tulo: Alterando c�digo durante a depura��o
Dica:

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.

Ocorre que o recurso na verdade existe, s� precisa ser habilitado. Para


habilitarmos a edi��o de c�digo durante a depura��o devemos entrar no menu Tools-
>Options, abrir a pasta Debugging, selecionar o item Edit and Continue e marcar a
checkbox "Allow me to edit VB files while debugging".

Infelizmente o recurso �, sim, inferior ao do VB 6, pois a edi��o, apesar de


permitida, n�o � reconhecida pela depura��o, obrigando que o processo de depura��o
se reinicie. Mas pelo menos a edi��o � poss�vel e o reinicio do processo de
depura��o pode at� mesmo ser configurado para ser automatico (na mesma tela,
inclusive, nos option buttons logo abaixo).

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 604


Assunto: .NET
T�tulo: Convers�o e Cast de dados
Dica:

Certamente voc�s j� conhecem a fun��o CTYPE, que realiza convers�es de dados.

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 :

Dim Q As Object = 2.37 ' Requires Option Strict to be Off.


Dim I As Integer = CType(Q, Integer) ' Succeeds.
Dim J As Integer = DirectCast(Q, Integer) ' Fails.

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 :

#Region "Este � o c�digo que faz alguma coisa"

'Muitas Subs aqui

#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)

Com a aplica��o da fun��o PadLeft na string resultante do format assim estamos


pedindo para alinhar a string a direita. Quando pedimos isso temos que informar com
base em que tamanho esse alinhamento deve ser feito, no caso o 10 do padleft indica
o n�mero de d�gitos que os valores ter�o.
O resultado final desta instru��o � o n�mero 10 formatado como 10.00 e alinhado a
direita como uma string de 10 digitos.

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 603


Assunto: .NET
T�tulo: Gerando RTF a partir de um DataSet
Dica:

O RTF, formato de textos que se assemelha levemente ao DOC em sua capacidade de


manter a formata��o de textos, � na verdade uma linguagem de marca��o, com tags que
determinam as caracter�sticas do texto em quest�o.

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 !

Veja exemplos completos em [Link]


us;311461

---------------------------------------------------------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.

Esse trabalho em camadas gera diversos tipos de problemas, um dos principais � a


recupera��o do id da autonumera��o. Em algumas situa��es complexas a autonumera��o
pode chegar a causar um grande desencontro. Que o valor do campo autonumera��o
inserido no dataSet n�o bater� com o valor do banco, isso � esperado, mas existe a
possibilidade de que o valor gerado pelo banco entre em conflito com algum valor j�
existente no DataSet, gerando um grande problema.

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.

Ent�o vejamos alguns passos no processo de atualiza��o :

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

2) Vamos considerar uma atualiza��o n�o transacional. Neste caso configuramos a


propriedade continueupdateonerror do dataAdapter para true para que ele n�o devolva
erros, apenas marque os registros que gerarem erro de atualiza��o. Claro que sempre
existe a op��o de usar transa��es, neste caso pode-se dar uma olhada na dica em
[Link]

3) O m�todo de atualiza��o precisa devolver o dataset ap�s a atualiza��o. Isso


porque o client est� com o dataset inteiro e o client usar� o dataset devolvido
para saber quais atualiza��es funcionaram ou n�o

4) O adapter, ao fazer o m�todo update, tipicamente realiza tamb�m um acceptchanges


no registro. Por�m no caso de inser��es isso n�o pode ser feito por causa da
autonumera��o. Se fosse feito a mesclagem do dataSet no client falharia, duplicando
registros. Ent�o precisamos tratar o evento rowUpdated do adapter para garantir que
n�o seja feito o acceptChanges nos registros inseridos

5) O client pode, ap�s a mesclagem do dataset, fazer um rejectChanges, para


imediatamente rejeitar os dados dos registros que falharam na atualiza��o, mas isso
� opcional.

Veja um exemplo simples. Eis o client :

Dim dados As [Link]


#Region " Windows Form Designer generated code "

Public Sub New()


[Link]()

'This call is required by the Windows Form Designer.


InitializeComponent()

'Add any initialization after the InitializeComponent() call

End Sub

'Form overrides dispose to clean up the component list.


Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
[Link]()
End If
End If
[Link](disposing)
End Sub

'Required by the Windows Form Designer


Private components As [Link]

'NOTE: The following procedure is required by the Windows Form Designer


'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents DG As [Link]
Friend WithEvents Component11 As WindowsControlLibrary1.Component1
Friend WithEvents Button1 As [Link]
<[Link]()> Private Sub InitializeComponent()
[Link] = New [Link]
[Link] = New [Link]
Me.Component11 = New WindowsControlLibrary1.Component1([Link])
Me.Button1 = New [Link]
CType([Link], [Link]).BeginInit()
[Link]()
'
'DG
'
[Link] = ""
[Link] = [Link]
[Link] = New [Link](16, 16)
[Link] = "DG"
[Link] = New [Link](256, 184)
[Link] = 0
'
'Button1
'
[Link] = New [Link](104, 224)
[Link] = "Button1"
[Link] = 1
[Link] = "Button1"
'
'Form1
'
[Link] = New [Link](5, 13)
[Link] = New [Link](292, 273)
[Link](Me.Button1)
[Link]([Link])
[Link] = "Form1"
[Link] = "Form1"
CType([Link], [Link]).EndInit()
[Link](False)

End Sub

#End Region

Private Sub Form1_Load(ByVal sender As [Link], ByVal e As [Link])


Handles [Link]
dados = [Link]
[Link] = [Link]
End Sub

Private Sub Button1_Click(ByVal sender As [Link], ByVal e As


[Link]) Handles [Link]
If [Link] Then
Dim d As [Link]
d = [Link]
d = [Link](d)
[Link](d)
[Link]()
Else
MsgBox("nada foi mudado")
End If

End Sub

Eis o componente :

Public Function ler() As DS


[Link](Ds1)
Return (Ds1)
End Function

Public Function gravar(ByVal xx As DS) As DS


[Link](xx)
Return (xx)
End Function

Private Sub DA_RowUpdated(ByVal sender As Object, ByVal e As


[Link]) Handles [Link]
If [Link] = [Link] Then
[Link] = [Link]
End If
End Sub

-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 657
Assunto: [Link]
T�tulo: Mais cuidados em transa��es com o adapter
Dica:

Na dica 611 ([Link] mostramos como


realizar uma transa��o durante a atualiza��o de dados de um adapter.

Por�m isso gera consequencias no trabalho com o dataset e precisamos estar muito
atentos a isso.

Na dica (link acima) o adapter tem a propriedade continueupdateonerror como false,


ent�o ele para no primeiro erro ocorrido, o erro � capturado pelo catch que faz o
rollback da transa��o, desfazendo todas as altera��es no banco.

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.

Ent�o o c�digo adicional fica assim :

Private Sub OleDbDataAdapter1_RowUpdated(ByVal sender As Object, ByVal e As


[Link]) Handles [Link]
If [Link] <> [Link] Then
If [Link] = 1 Then
[Link] = [Link]
End If
End If
End Sub

Por�m, se a transa��o funcionar, os registros n�o ter�o seu status atualizado.


Ent�o podemos adicionar uma instru��o a mais, ap�s a realiza��o da transa��o :

[Link]

Fazendo o acceptchanges zeramos todos os status das linhas do dataset.

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 648


Assunto: [Link]
T�tulo: Cancele dados pendentes quando estiver utilizando um DataReader
Dica:

Ao utilizarmos um DataReader pode acontecer eventualmente de desejarmos fecha-lo


antes de termos navegado por todo o seu conte�do.

O problema � que se simplesmente utilizamos o m�todo close do datareader, este


objeto for�a a navega��o at� o final dos dados antes que o close seja realmente
realizado.

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]
-----------------------------------------------------------------------------------
--------------------------------------------

Dica N�: 646


Assunto: [Link]
T�tulo: Com o provider do OLEDB, utilize [Link]
Dica:

Para chamarmos uma stored procedure no servidor de banco normalmente utilizamos o


objeto command e definimos o commandtype como storedproc.

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 :

Dim cmd As New [Link]("Call CustOrderHist(?)", CN)


Dim dr As [Link]
[Link] = [Link]
[Link]("@CustomerID", [Link], 5)
[Link]("@CustomerID").Value = "ALFKI"
[Link]()

dr = [Link]

J� com o Data Provider do SQL Server ocorre justamente o contr�rio : Temos um


overhead de performance se usarmos o [Link], devemos estar usando o
[Link].

-----------------------------------------------------------------------------------
---------------------------------------------

N�: 612
Assunto: [Link]
T�tulo: DataBinding e trabalho em camadas
Dica:

O recurso de vincular os objetos do formul�rio a uma origem de dados, tal como um


dataset, � um poderoso recurso de RAD (desenvolvimento r�pido de aplica��es)

Quando estamos desenvolvendo em camadas, por�m, temos um pequeno problemas. As


instru��es que realizam o dataBinding s�o inseridas no InitializeComponent do form,
enquanto que a chamada do componente que ir� trazer os dados fica normalmente no
load.
A chamada do componente tipicamente seria algo como :

ds1=[Link]()

O problema � que no momento em que fazemos isso estamos destruindo a inst�ncia do


dataset existente na vari�vel ds1 e inserindo nesta vari�vel um novo dataset, vindo
do componente.

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.

Para contornar este problema podemos fazer o seguinte :

dim dstmp as dataset

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.

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 611


Assunto: [Link]
T�tulo: Controlando as atualiza��es feitas por um Adapter
Dica:

Quando utilizamos o adapter para fazer as atualiza��es de um dataset na base de


dados, utilizamos o m�todo Update do adapter. Esse m�todo vai realizar no banco
todas as dele��es, inser��es e atualiza��es.

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.

Mas como fazer isso com um adapter ?

Basta iniciar a transa��o e configurar cada um dos commands do adapter com a


transa��o, desta forma, ao fazer o update, poderemos testar se algum erro ocorreu e
cancelar ou fazer commit.

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.

Veja como fica :

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.

Assim sendo, o seguinte c�digo funcionaria :

[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.

Assim sendo a alternativa seria :

[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 :

Dim DT as new DataTable


[Link](DT) '<---- O Adapter poder fazer o fill de uma datatable
[Link]=DT
[Link]()

Desta forma economizamos recursos em nossa aplica��o

---------------------------------------------------------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 :

<% Set objShell = CreateObject("[Link]")


[Link] 1, "Ocorreram erros no arquivo [Link]."
Set objShell = Nothing %>

O primeiro par�metro � o tipo de log sendo gravado :

0 � Successo
1 � Erro
2 � Warning
4 � Informa��o

O segundo par�metro � a mensagem sendo gravada.


-----------------------------------------------------------------------------------
--------------------------------------------

Dica N�: 373


Assunto: ASP
T�tulo: Ler chaves de registry
Dica:

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") %>

O caminho do registry deve ser montado utilizando a \ como delimitadora e deve


come�ar em um dos roots v�lidos, que s�o codificados com 4 letras, da seguinte
forma :

HKCU - HKEY_CURRENT_USER
HKLM - HKEY_LOCAL_MACHINE
HKCR - HKEY_CLASSES_ROOT

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 317


Assunto: ASP
T�tulo: Attachando imagens em e-mails em HTML
Dica:

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.

Veja abaixo um exemplo obtido no site da Microsoft. Observe como a imagem �


referenciada a partir da tag IMG :

Dim myMail
Set myMail = CreateObject("[Link]")

HTML = "<!DOCTYPE HTML PUBLIC ""-//IETF//DTD HTML//EN"">" & NL


HTML = HTML & "<html>"
HTML = HTML & "<head>"
HTML = HTML & "<meta http-equiv=""Content-Type"""
HTML = HTML & "content=""text/html; charset=iso-8859-1"">"
HTML = HTML & "<meta name=""GENERATOR"" content=""Microsoft FrontPage 2.0"">"
HTML = HTML & "<title>Exchange CDO Example</title>"
HTML = HTML & "</head>"
HTML = HTML & "<body bgcolor=""#FFFFFF"">"
HTML = HTML & "<p><font size=""6"" face=""Arial Black""><strong>Exchange CDO "
HTML = HTML & "Sample<img src=[Link]>"
HTML = HTML & "</strong></font></p>"
HTML = HTML & "<p>CDO for NTS allows an easy way to send mail."
HTML = HTML & "This example shows how the content can be an HTML page"
HTML = HTML & "which allows you to send rich text and inline graphics.</p>"
HTML = HTML & "</body>"
HTML = HTML & "</html>"

[Link] "D:\wwwroot\[Link]", "[Link]"


[Link] = "Example@[Link]"
[Link] = "Someone@[Link]"
[Link] = "Sample Message"
[Link] = 0
[Link] = 0
[Link] = HTML
[Link]

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 316


Assunto: ASP
T�tulo: Envio de emails com attach com ASP
Dica:

O objeto CDONTS do ASP permite que fa�amos o envio de arquivos attachados no e-


mail, mas os arquivos devem estar no servidor web ou acess�veis a ele. Veja um
exemplo :

Set objNewMail = CreateObject("[Link]")


Call [Link]("c:\arquivos\[Link]", "[Link]")
[Link] "origem@[Link]", "voce@[Link]", _
"Envio de arquivo", "Eis o arquivo que voc� esperava", 0
Set objNewMail = Nothing

Podemos, claro, utilizar o [Link] para facilitar a montagem do caminho do


arquivo. Supondo que o arquivo esteja no mesmo diret�rio que seu site, veja como
fica :

Set objNewMail = CreateObject("[Link]")


Call [Link]([Link]("/[Link]"), "[Link]")
[Link] "origem@[Link]", "voce@[Link]", _
"Envio de arquivo", "Eis o arquivo que voc� esperava", 0
Set objNewMail = Nothing

-----------------------------------------------------------------------------------
--------------------------------------------
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.

O formul�rio que estar� transferindo o arquivo recebe a especifica��o de um tipo de


codifica��o diferente e � necess�rio que no servidor esse tipo de codifica��o seja
traduzido de volta ao formato de arquivo.

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

'String to byte string conversion


Function getByteString(StringStr)
For i = 1 to Len(StringStr)
char = Mid(StringStr,i,1)
getByteString = getByteString & chrB(AscB(char))
Next
End Function

'Byte string to string conversion


Function getString(StringBin)
getString =""
For intCount = 1 to LenB(StringBin)
getString = getString & chr(AscB(MidB(StringBin,intCount,1)))
Next
End Function
%>

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].

Veja como utilizar essa sub :

O par�metro que ela recebe � a leitura bin�ria do objeto request, assim sendo
come�amos da seguinte forma :
RequestBin = [Link](byteCount)

Em seguinda criamos um objeto [Link] que ser� usado pela sub :

Dim UploadRequest
Set UploadRequest = CreateObject("[Link]")

Chamamos a sub :

BuildUploadRequest(RequestBin)

Obtem-se ent�o os dados do [Link] e utiliza-se o filesystemobject


para gravar o arquivo :

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]")

'Create and Write to a File


pathEnd = Len([Link]([Link]("PATH_INFO")))-14

on error resume next


Set MyFile = [Link](caminho &
[Link]("TXTarquivo").Item("Value") & filename)

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.

O exemplo abaixo mostra um arquivo de configura��o com uma string dsn.

No [Link]:

<configuration>

<appSettings>
<add key="PubsDSN" value="server=(local);database=pubs;uid=sa;pwd=;" />
</appSettings>
</configuration>

Na p�gina:

<%@ Page Language="C#" %>

<html>
<body>
<%=[Link]["PubsDSN"]%>
</body>
</html>

-----------------------------------------------------------------------------------
----------

Dica N�: 677


Assunto: [Link]
T�tulo: Aceitando apenas n�meros em uma textbox
Dica:

O [Link] � t�o mais simples que as tecnologias de desenvolvimento web anteriores


que at� esquecemos de boa parte das caracter�sticas da web.

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 :

[Link]("onkeypress", "if ([Link] < 48 || [Link] > 57)


{[Link] = 0;}");

Os webControls do .NET nos permitem adicionar atributos client atrav�s do m�todo


[Link]. Neste exemplo estamos adicionando um tratamento para o evento
onkeypress de uma textbox, fazendo com que apenas n�meros sejam aceitos.

-----------------------------------------------------------------------------------
---------------------------------------------
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.

Ent�o ter�amos que fazer /aplicacao/image/[Link] , o que n�o � muito legal


pois estamos deixando fixo o nome do diret�rio virtual, que poderia mudar de acordo
com o deployment da aplica��o.

Outra alternativa seria utilizar um caminho relativo, ../image/[Link], mas se


o webform no qual fizemos isso tiver que mudar de local ent�o o caminho relativo se
tornar� inv�lido.

Para resolver esse problema os webControls do [Link] fornecem um s�mbolo a mais


para montarmos o path : ~

O ~ (til) representa a raiz da aplica��o, e n�o do site, como a / . Ent�o podemos


montar o path da seguinte forma : ~/images/[Link] e n�o teremos problemas nem
com a mudan�a do webform de local nem com a mudan�a do nome do diret�rio virtual da
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:

A FormsAuthentication nos permite configurar um form de login pelo [Link] e


este form de login ser� disparado sempre que as regras de autoriza��o que
indicarmos n�o forem cumpridas pelo usu�rio.

O formul�rio de login no [Link] ser� chamado em 2 casos : Quando o usu�rio n�o


estiver logado ou quando mesmo logado o usu�rio n�o tiver permiss�o de acessar a
p�gina.

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.

Tem uma solu��o bem simples para isso :


[Link]

A propriedade isauthenticated nos devolve um boolean dizendo se o usu�rio est�


autenticado ou n�o. Se estiver, a p�gina de login foi chamada por causa de acesso
negado, caso contr�rio simplesmente porque n�o tinha se logado ainda.

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 655


Assunto: [Link]
T�tulo: Use o [Link] para proteger o acesso a arquivos
Dica:

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 :

- Logar downloads de forma simples


- Proteger o acesso a arquivos, como gifs por exemplo, usando o sistema de
seguran�a do [Link]
- Impedir por completo o acesso a determinados arquivos, tal como .MDB

O primeiro passo para fazermos isso � vincularmos a extens�o do arquivo com o


[Link]. Para isso precisamos entrar nas configura��es do IIS.

Entrando nas propriedades de um diret�rio virtual, podemos entrar em Home Directory


e Configuration. Encontramos ent�o uma tela de configura��o de ISAPI Filters.

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$

Feito esse mapeamento j� podemos manipular o arquivo atrav�s do [Link]. Podemos,


por exemplo :

- Usar o [Link] para logar e controlar acessos diretos ao arquivo


- Usar o [Link] para permissionar os acessos ao arquivo

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:

Para impedirmos o cache da p�gina no browser do usu�rio normalmente usamos um HTTP


Header sinalizando que a p�gina n�o vai entrar no cache.

Como tudo no [Link], a implementa��o deste recurso ficou consideravelmente mais


simples do que no ASP 3. O objeto Response j� � capaz de fazer essa configura��o,
veja como fica :

[Link]([Link])

Basta esta instru��o e a p�gina n�o entrar� no cache do browser.

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 623


Assunto: [Link]
T�tulo: Trocando dados entre WebForms
Dica:

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.

Assim sendo, supondo que temos um webform1 e um webform2 e o webform2 precisar�


receber dados do WebForm1, ent�o podemos fazer com que o webform2 acesse
diretamente o webform1, desde que estejamos utilizando [Link] entre os 2.

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.

Veja um exemplo de um webform1 com os dois recursos :

Public Class WebForm1


Inherits [Link]
Dim v As Integer
Protected WithEvents TextBox1 As [Link]

Private Sub Button1_Click(ByVal sender As [Link], ByVal e As


[Link]) Handles [Link]
valor = 10
[Link]("[Link]")
End Sub
Public Property valor() As Integer
Get
Return (v)
End Get
Set(ByVal Value As Integer)
v = Value
End Set
End Property
End Class

Para tornar o webControl (textbox1) vis�vel ao webform2 � necess�rio trocar a


declara��o do controle de Protected para Public. Por�m o visual studio n�o
permitir� mantermos o public dentro da �rea de c�digo mantida pelo visual studio,
ent�o precisaremos recortar a linha de declara��o da �rea de c�digo do visual
studio e colocarmos fora desta �rea de c�digo.

J� para a passagem de um valor simples foi criada uma propriedade, Valor, para
manter esta informa��o.

No clique do bot�o a propriedade recebe o valor 10, que desejamos transmitir, e


fazemos o [Link].

Veja o c�digo do webform2 para recuperar a informa��o :

Private Sub Page_Load(ByVal sender As [Link], ByVal e As [Link])


Handles [Link]
'Put user code to initialize the page here
[Link] = CType([Link], WebForm1).valor
[Link] = CType([Link], WebForm1).[Link]
End Sub

O [Link] cont�m uma instancia do WebForm1. Podemos ent�o acessar tanto a


propriedade valor como a textbox que transformamos em p�blica.

O �nico por�m desta t�cnica � que o [Link] ignora os mecanismos de


autentica��o do [Link]. Veja detalhes deste problema na dica em
[Link]

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 641


Assunto: [Link]
T�tulo: Fazendo la�os em webControls
Dica:

Um recurso de programa��o muito �til � a realiza��o de la�os atrav�s dos


webControls para a realiza��o de tarefas repetitivas. Por exemplo, em um formul�rio
de cadastramento, a passagem de cada textBox para a cole��o parameters de um
command poderia ser feita com um la�o.

O problema � que os webControls n�o podem ser facilmente localizados utilizando


[Link] . Os webControls de um webform encontram-se normalmente dentro do
webForm, que � por si s� um control que encontra-se dentro da cole��o [Link]

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 :

Function acharForm() As [Link]


Dim obj As [Link]
For Each obj In [Link]
If TypeOf obj Is [Link] Then
Return (obj)
End If
Next
End Function

Veja um exemplo de uso desta fun��o para preencher o parameters de um command :

Private Sub cmdAtualizar_Click(ByVal sender As [Link], ByVal e As


[Link]) Handles [Link]
Dim obj As [Link]
Dim f As [Link]
f = acharForm()

For Each obj In [Link]


If TypeOf obj Is [Link] Then
[Link]([Link])).Value = DirectCast(obj, TextBox).Text
End If
Next
[Link]()
[Link]()
[Link]()

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

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 621


Assunto: [Link]
T�tulo: Importantes truques com o LoadControl
Dica:

Em uma dica anterior citamos algumas vantagens do uso do loadcontrol para carregar
web user control dinamicamente, em [Link]

Mas existem alguns detalhes a mais sobre o funcionamento do m�todo loadcontrol.


Quando o user control possui cache habilitado (@outputcache) o objeto retornado
pelo m�todo loadControl n�o � um objeto User Control mas sim um
PartialCachingControl.

De acordo com sua defini��o o LoadControl retorna um Control. Tanto UserControl


como PartialCachingControl herdam caracter�sticas de Control, mas UserControl n�o
possui uma rela��o direta com PartialCachingControl.
E que problemas isso pode nos causar ?

Se estivermos utilizando diretamente o [Link] da p�gina, nenhum, pois o


[Link] aceita ambos os tipos de componente. Mas se estivermos tentando
manipular o UserControl para alguma coisa teremos problema. Vamos supor que temos
um user control chamado [Link], veja este exemplo :

dim titulo1 as titulo

titulo1=loadcontrol("[Link]")
[Link]="qualquercoisa"
[Link](titulo1)

Se [Link] n�o estiver utilizando cache, tudo funcionar� corretamente. Mas se


[Link] estiver usando o controle de cache teremos um erro. O loadcontrol
devolver� um objeto do tipo PartialCachingControl, que n�o � compat�vel com o tipo
Titulo, que herdou caracter�sticas de user Control, por isso tudo falha (specified
cast not valid).

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.

Mas existem alguns pequenos truques para o uso da propriedade CachedControl. O


primeiro est� bem documentado : Nem sempre ela vai voltar um objeto. Quando pelas
regras do sistema de cache o controle estiver sendo obtido do cache e n�o
processado, n�o existe instancia do controle e essa propriedade estar� retornando
nothing.

O segundo truque n�o � documentado. CachedControl s� poder� retornar uma referencia


a um objeto depois do objeto haver sido processado. Antes disso sempre retornar�
nothing. O processamento do objeto � justamente causado pelo [Link] da
p�gina.

Ent�o o c�digo, anteriormente simples, tem agora que prever todas essas
possibilidades. Veja como fica o c�digo :

dim obj as control


dim titulo1 as titulo

obj=loadcontrol("[Link]")
[Link](obj)

if typeof obj is PartialCachingControl then


titulo1=[Link]
else
titulo1=obj
end if
if not isnothing(titulo1) then
[Link]="qualquercoisa"
end if

Observem os IFs que fizemos para contornar a quest�o do tipo de dados e a


possibilidade do controle estar em cache e voltar nothing...
-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 613


Assunto: [Link]
T�tulo: Desviando para o login ao t�rmino da sess�o
Dica:

Antigamente, no ASP 3, o login do usu�rio era controlado por vari�veis de sess�o.


Assim sendo, quando a sess�o encerra-se o usu�rio � naturalmente desviado para a
tela de login pelo c�digo que inserimos para testar se ele encontra-se logado.

No [Link], por�m, o processo de controle de login � bem diferente. A Forms


Authentication n�o usa a sess�o e sim um cookie tempor�rio no lado client para
autenticar o usu�rio (cookie muito bem criptografado).

� muito comum, por�m, ainda mantermos informa��es do usu�rio no ambiente de sess�o


do servidor. Mas o que ocorre � que a sess�o do usu�rio pode ser encerrada
(timeout), seus dados perdidos, mas o login do usu�rio ainda se manter, pois ele �
controlado por cookie e n�o pela sess�o.

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.

Ent�o vamos precisar destruir o cookie de autentica��o do usu�rio. Basicamente, um


logoff, que por estranho que pare�a, faremos no evento session_onstart, dentro do
[Link] . Precisaremos aicionar um imports para [Link] para em
seguida fazer o logoff :

[Link]()

Por�m ainda temos problemas. O evento session_onstart acontece depois do evento


application_authenticaterequest, ou seja, depois que o usu�rio j� foi identificado
pelo servidor. Isso faz com que o redirecionamento para a tela de login n�o
aconte�a.

� 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.

Mas existe um problema. Isso tamb�m acontecer� na inicializa��o normal do site. O


desvio para a tela de login transmite um par�metro via GET, returnUrl . Com esse
redirect rodando na inicializa��o da sess�o o par�metro se perde, ent�o precisamos
fazer um IF a mais :

if instr(ucase([Link]("script_name")),"[Link]")=0 then
[Link]()
[Link]([Link]("script_name"))
end if

Na inicializa��o da aplica��o a p�gina que estar� sendo chamada � a [Link], e o


redirect ser� evitado. Quando o usu�rio perder a sess�o, por�m, perder� tamb�m o
login e voltar� para a tela de autentica��o

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 591


Assunto: [Link]
T�tulo: Criando uma Grid com barra de rolagem
Dica:

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 :

<div style="height: 250px; overflow: auto;">


<asp:DataGrid runat="server" ...>
...
</asp:DataGrid>
</div>

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.

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 580


Assunto: [Link]
T�tulo: Exibindo Imagens com URL Gravada em Branco
Dica:

A DataGrid � realmente muito personaliz�vel. Um dos recursos para deixarmos a grid


bem personalizada � a Data Formatting Expression que todas as bound columns
possuem.

� muito comum guardarmos URLs de imagens dentro do banco de dados. Utilizando a


Data Formatting expression podemos fazer com que o campo seja exibido j� como uma
imagem. Veja como fica a express�o de formata��o :

<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.

INETA RoadShow acontecer� dia 11/09, as 14:00hs no hotel Gl�ria


Inscri��es e informa��es no sites: [Link] ou
[Link]

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 562


Assunto: [Link]
T�tulo: Fazendo upload de arquivos
Dica:

O upload de arquivos � um outro recurso que foi muito simplificado no [Link]. O


objeto input do tipo file, quando configurado com RunAt=Server, possui propriedades
que nos permitem fazer a grava��o do arquivo que foi transmitido.

A propriedade PostedFile deste objeto representa um HTTPPostedFile. Este objeto


possui as propriedades FileName, que nos fornece o nome do arquivo e o m�todo
SaveAs, que nos permite salvar o arquivo.

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.

Observe tamb�m os seguintes detalhes no c�digo abaixo :

- 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.

Vejam o exemplo de c�digo de upload :

<%@ Page Language="VB" %>


<script runat="server">

Sub File_Upload (Sender as Object, e as EventArgs)

Dim strFileName as string


Dim f as object

for each f in [Link]


if typeof f is [Link] then
strFileName = [Link]

Dim myFileName as string = [Link](f)

[Link]([Link]("/arqRecebidos") & myFileName)


end if
next
End Sub

</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>

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 553


Assunto: [Link]
T�tulo: Identificando e corrigindo problemas no [Link]
Dica:

Problemas nas configura��es do [Link] s�o dificeis de identificar e normalmente


impedem que a aplica��o seja executada. Podemos, por�m, utilizar alguns pequenos
truques para resolver esses problemas mais facilmente.

Primeiramente devemos identificar o problema. Isso � razoavelmente simples : A


mensagem de erro que � dada quando o [Link] encontra-se inv�lido � de que n�o
foi poss�vel iniciar a depura��o no servidor. Voc� deve ter o cuidado de selecionar
n�o (deseja tentar depurar posteriormente) e corrigir o [Link].

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 :

Sub Gerarmensagem(msg as string)


if not TemMensagem then
[Link]("function MSG() { alert('" & msg & "') }")
TemMensagem=true
end if
end Sub

Protected Function EventoLoad() as string


if TemMensagem then
return("MSG()")
else
return("")
end if
End Function

No ASPX :

<body onload=<%# eventoload() %>>

Observem a forma como o eventoload gera ou n�o a chamada da fun��o conforme o valor
da vari�vel boleana.

-----------------------------------------------------------------------------------
---------------------------------------------

Dica N�: 347


Assunto: [Link]
T�tulo: PopUp de confirma��o no bot�o delete de uma DataGrid
Dica:

A DataGrid sem d�vida � um componente fant�stico em termos de recursos, mas algumas


tarefas ainda precisam ser feitas pelo velho javascript como antigamente. Um
exemplo disso � a confirma��o de dele��o no bot�o delete da grid.

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)

Os valores 0 e 0 dependem do desenho da grid.


Em seguida definir o evento onclick neste bot�o :

[Link] ("onclick", "return confirm(\""Are you sure?\"");");

Feito isso teremos nossa mensagem de confirma��o ao tentar deletar um registro.

-----------------------------------------------------------------------------------
---------------------------------------------
Dica N�: 467
Assunto: [Link]
T�tulo: Criando uma confirma��o no bot�o excluir da GRID
Dica:

Na verdade esta dica � uma corre��o/complemento para a dica 347, na qual j�


haviamos mencionado isso.

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�.

Da mesma forma o evento itemcreated � executado para todas as linhas da grid,


incluindo a de t�tulo, que n�o tem o bot�o. Assim sendo torna-se necess�rio fazer
um teste antes de atribuir o evento ao bot�o. Supondo que o �ndice da c�lula do
bot�o � 5, ent�o veja como fica o c�digo :

if [Link] >=6 andalso [Link]>0 then


ctype([Link](5).controls(0),button).[Link] ("onclick", "return
confirm('Tem certeza?');");

end if

Na primeira checagem do IF verificamos se j� estamos na c�lula do bot�o, na 2a


verificamos se n�o estamos na linha de t�tulo (que n�o tem controle algum). Observe
o uso do ANDALSO, pouco documentado, que nos permite fazer uma avalia��o parcial do
if e consequentemente manter as duas checagens no mesmo if, do contr�rio, com o
AND, ter�amos que separar os ifs ou ter�amos um erro.

--------------------------------------------------------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.

� uma instru��o simples, que podemos fazer no inicio de nossa aplica��o :

[Link]([Link]
wsPrincipal)

Estamos pedindo que nossa aplica��o windows identifique o usu�rio do windows.


A partir deste ponto podemos acessar algumas informa��es sobre esse usu�rio.
Podemos definir uma vari�vel para isso :

dim user as [Link]

E ent�o preenchemos a vari�vel :

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")

Sendo "Admin" um grupo do sistema operacional

-----------------------------------------------------------------------------------
---------------------------------------------
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.

Veja como fica :

[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.

Por exemplo, podemos usar a propriedade Opacity para definir o n�vel de


transpar�ncia do formul�rio. Ent�o podemos usar os eventos do formul�rio e um
pequeno loop para fazer com que o formul�rio desapare�a gradativamente, ao inv�s de
simplesmente fechar, quando ocorrer um close.

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 :

Protected Overrides Sub OnClosing(ByVal e As [Link])

If [Link]("UsarEfeitos", 1) = 1 Then
Dim i As Decimal = 1

For i = 1 To 0 Step -0.01


[Link] = i
[Link]()
Next
End If
[Link](e)
End Sub
End Class

-----------------------------------------------------------------------------------
---------------------------------------------
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 :

Throw new Exception("Deu um erro qualquer")

E a forma de tratar este erro atrav�s do try/catch do [Link].


Mas com certeza deve ter sentido falta da possibilidade de criar um erro
personalizado.

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 :

Public Class MeuErroQualquer


Inherits [Link]

End class

A partir dai podemos disparar esse erro :

Throw New MeuErroQualquer()

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 :

Public Class MeuErroQualquer


Inherits [Link]

Sub New(msg as string)


[Link](msg)
end sub

End class

A partir dai podemos fazer :

Throw new MeuErroQualquer("Deu um erro em um local inesperado")

Observe que na cria��o do construtor n�s na verdade aproveitamos o construtor da


classe base, Exception.
-----------------------------------------------------------------------------------
--------------------------------------------

Dica N�: 328


Assunto: [Link]
T�tulo: Compilando condicionalmente
Dica:

� muito comum criarmos logs em tempo de depura��o de uma aplica��o para


identificarmos o que est� acontecendo. Quando compilarmos a vers�o final
desejaremos que esses logs n�o acompanhem a aplica��o.

O VB 6 j� possui compila��o condicional atrav�s de diretivas de compila��o #if


#endif que permite que facilmente excluamos uma determinada sub, por exemplo :

#if log
sub log(msg as string)
[Link] msg,1
end sub
#end if

Quando desejarmos que essa sub seja incluida, podemos ir em project->properties, no


item Make e inserir na caixa conditional compilation "log=1". Quando n�o desejarmos
basta retirar isso.

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.

No [Link] temos outra solu��o para obter esse efeito :

<Conditional("LOG")> Sub LogMsg(ByVal MsgText As String)


[Link](MsgText)
End Sub

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.

-----------------------------------------------------------------------------------
--------------------------------------------

Dica N�: 299


Assunto: [Link]
T�tulo: Criando menus em 2 colunas
Dica:

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

A diferen�a entre o Break e o BarBreak � apenas a presen�a de uma linha vertical


entre as colunas quando se utiliza BarBreak.

Veja um exemplo :

[Link] = True

Isso pode ser feito no form_load

-----------------------------------------------------------------------------------
--------------------------------------------

Dica N�: 343


Assunto: [Link]
T�tulo: Escrevendo no Registry
Dica:

Manipular o Registry no VB 6 era tarefa complexa, era necess�rio o uso de API's


para ler e escrever no registry.
No [Link] o namespace [Link] resolve esse problema e o objeto
application ainda d� uma m�ozinha a mais.

O objeto application possui as propriedades CommonAppDataRegistry() e


userAppDataRegistry() que respectivamente fazem grava��es nas �reas de registry da
aplica��o (comum a todos os usu�rios) e de um usu�rio espec�fico.

Ambas as propriedades devolvem um objeto RegistryKey, que pode ser manipulado para
a realiza��o de grava��es.

Veja um pequeno exemplo :

Dim x, y As [Link]
x = [Link]()
y = [Link]("teste")
[Link]("testando", 10)

-----------------------------------------------------------------------------------
--------------------------------------------

Dica N�: 345


Assunto: [Link]
T�tulo: Mais uma facilidade dos objetos Command
Dica:

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.

Outra possibilidade � o valor SingleRow, que melhora a performance quando estamos


recuperando um datareader de uma �nica linha.

Veja um exemplo :

reader = [Link]([Link]);

-----------------------------------------------------------------------------------
-------------------------------------------

Dica N�: 615


Assunto: [Link]
T�tulo: Forma simples de ler um site web via c�digo
Dica:

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 :

Dim obj As New WebClient


Dim b As Byte()
Dim x As Byte
Dim sb As New [Link]

b = [Link]("[Link]

For Each x In b
[Link](Chr(x))
Next

MsgBox([Link])

O retorno do webClient � um array de bytes, portanto ap�s o uso do WebClient �


necess�rio converter esse array de bytes em string. O la�o no c�digo faz isso
utilizando o StringBuilder.

-----------------------------------------------------------------------------------
-------------------------------------------

Dica N�: 530


Assunto: [Link]
T�tulo: Utilizando os eventos do CurrencyManager
Dica:

Uma caracter�stica do objeto CurrencyManager que certamente passar� despercebida a


muitos programadores s�o os seus eventos.

Para que os eventos do CurrencyManager fiquem dispon�veis � necess�rio definir a


vari�vel com a clausula withEvents, da seguinte forma :

dim withevents cm as currencymanager

CM � o nome de uma vari�vel, poderia ser qualquer vari�vel. Depois de termos


definido a vari�vel com withevents, os seguintes eventos se tornam dispon�veis :

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.

No Framework .NET n�s temos a classe SystemEvents ([Link])


que cont�m diversos eventos do sistema, entre eles o evento TimeChanged, que
identifica a altera��o do rel�gio do sistema.

Podemos ent�o, de forma bem simples, utilizar a instru��o AddHandler e tratarmos


este evento. Veja como fica o c�digo :

Private Sub Form1_Load(ByVal sender As [Link], ByVal e As [Link])


Handles [Link]
AddHandler [Link], AddressOf MudouHora
End Sub

Sub MudouHora(ByVal Sender As Object, ByVal e As [Link])


MsgBox("vc mudou o rel�gio !")
End Sub

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.

-----------------------------------------------------------------------------------
-------------------------------------------

Dica N�: 639


Assunto: [Link]
T�tulo: Tratamento de erros inesperados
Dica:

Por mais que utilizemos try/catch, sempre pode ocorrer algum erro imprevisto na
aplica��o.

� no m�nimo desagrad�vel quando a nossa aplica��o para inesperadamente e mostra uma


estranha tela de erro para o usu�rio, n�o permitindo que prossiga.

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.

Desta forma, capturando excess�es no application domain, continuamos podendo


utilizar try/catch a vontade, mas se alguma excess�o n�o prevista ocorrer ela ser�
tamb�m capturada pelo nosso c�digo, atrav�s do evento no application domain

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.

Veja como fica :

Module Module1
Public Sub main()
AddHandler [Link], _
AddressOf trataerro
Dim x As New Form1
[Link](x)
End Sub

Sub trataerro(ByVal sender As Object, ByVal e As _


[Link])
MsgBox("Ocorreu um erro, chame o suporte!")
[Link](CType([Link], Exception).ToString)
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.

Com isso, observe esse trecho de c�digo :

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

Desta forma a aplica��o se torna mais otimizada.

--------------------------------------------------------
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.

Veja um pequeno exemplo :

[Link] "[Link] "POST",strData, "Content-


Type: application/x-www-form-urlencoded"

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 :

Private Sub Inet1_StateChanged(ByVal State As Integer)


Dim vtdata As String
Dim res As String

If State = 12 Then
Do
vtdata = [Link](1024, icString)
res = res & vtdata
Loop While Len(vtdata) <> 0
[Link] res
End If

End Sub

-----------------------------------------------------------------------------------
----------------------------------------------

Dica N�: 253


Assunto: Visual Basic
T�tulo: Acessando um servidor remotamente (WEB)
Dica:

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.

Para isso devemos montar a string de conex�o normal, como se estivessemos


trabalhando localmente no servidor. Substituimos o "Provider" por "Remote
Provider", acrescentamos um "Provider" como sendo MS Remote e "Remote Server" para
indicarmos o nome do servidor remoto. Desta forma podemos acessar um banco de dados
em um servidor web, por exemplo.

Veja como fica a string :

Provider=MS Remote;Data Source=aluno02;Remote Provider=SQLOLEDB;Remote


Server=[Link] Catalog=pubs;User ID=sa;Password=
Veja o c�digo em Vb para fazer esse acesso :

Dim cn As New Connection


Dim rs As New Recordset

Private Sub Form_Load()


[Link] "Provider=MS Remote;Data Source=aluno02;Remote Provider=SQLOLEDB;Remote
Server=[Link] Catalog=pubs;User ID=sa;Password="
[Link] "Select * from authors", cn
MsgBox [Link]
End Sub

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.

Elementar, meu caro. Veja algumas caracter�sticas da configura��o do servidor :

- O IIS tem que estar rodando na porta 80


- Precisa existir uma pasta virtual (diret�rio virtual sem aplica��o) apontando
para program files\commom\system\msadc
- A pasta virtual precisa ter permiss�o de script e execu��o
- A pasta program files\commom\system\msadc precisa dar permiss�o de leitura para o
usu�rio do IIS. Pode-se utilizar Everyone:Read. Lembre-se que esse n�o � o default
da pasta, voc� precisa corrigir essa permiss�o
- A pasta virtual n�o pode ter filtragem de IP's (ou pelo menos n�o pode filtrar o
seu). Se ela foi criada pela instala��o do RDS ent�o ela TEM estes filtros e voc�
precisa elimina-los.

Veja alguns endere�os �teis :

[Link]
[Link]

[Link]

[Link]
oledbprovusing_the_ole_db_remoting_provider__a_closer_look.asp

[Link]

-----------------------------------------------------------------------------------
----------------------------------------------

-----------------------------------------------------------------------------------
----------------------------------------------

-----------------------------------------------------------------------------------
----------------------------------------------
-----------------------------------------------------------------------------------
----------------------------------------------

Você também pode gostar