tag:blogger.com,1999:blog-88419827049918864862024-03-05T06:17:33.295-08:00A Lixeira do DriSe eu não apertei Shift + Del...Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.comBlogger25125tag:blogger.com,1999:blog-8841982704991886486.post-13676801810814504452010-09-13T06:50:00.000-07:002010-09-13T06:54:10.487-07:00Feliz dia do Programador<p>Pena que no Brasil ainda não temos essa cultura =)</p>
<p>Mas hoje é <a href="http://pt.wikipedia.org/wiki/Dia_do_Programador" target="_blank">dia do programador</a>, então, parabéns à todos que tem essa profissão!!! Ou tentam ter hahahahahaha.</p>
<p>Abraços!</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com0tag:blogger.com,1999:blog-8841982704991886486.post-81958120916438425722010-08-10T07:26:00.000-07:002010-08-10T08:26:24.077-07:00SELECT com NULL no MS SQL<p>Uma postagem rápida para falar sobre SQL e aproveitar para dizer que tive 2 artigos publicados na SQL Magazine deste mês de <a href="http://www.devmedia.com.br/resumo/default.asp?ed=78&site=2" target="_blank">Agosto (Edição 78)</a>. \o/ hehehehe!!!! </p>
<p>Então... Acabei de me deparar com um problema bobo hoje. Estava criando um procedure que tinha um status do tipo Bit.</p>
<p>Para chamar a procedure passava 0 ou 1... Maravilha!</p>
<p>Entretanto, no sistema no qual a procedure ia ser chamada, poderia listar os ativos, inativos ou os ativos (E) inativos.</p>
<p>Poxa que fácil, basta apenas passar no parâmetro do status o valor NULL.</p>
<p>Vamos ao exemplo:</p>
<pre class="brush: sql">
CREATE PROCEDURE [dbo].[ListarNulo]
@Status BIT
AS
BEGIN
SELECT
[ParceiroCodigo]
,[CPF]
,[NumMatricula]
FROM [ListaBranca]
WHERE
([Status] = @Status OR @Status = NULL)
END
</pre>
<p>Poxa, que nada de diferente, pronto acabou! Éééé... não, infelizmente quando rodei a procedure passando NULL no parâmetro... Não me trouxe nada! Mas pq???</p>
<p>Bom, foram 10 minutos revisando a procedure (não era essa acima, era uma maiorzinha) e mas 10 minutos para descobrir e bater a mão na testa dizendo "nossa como eu sou burro".</p>
<p>A frase do que eu precisa me dizia a resposta. "Preciso verificar se o parâmetro <b>(É)</b> nulo." "É" nulo e não "Igual" a Nulo. Vamos alterar a procedure.</p>
<pre class="brush: sql">
ALTER PROCEDURE [dbo].[ListarNulo]
@Status BIT
AS
BEGIN
SELECT
[ParceiroCodigo]
,[CPF]
,[NumMatricula]
FROM [ListaBranca]
WHERE
([Status] = @Status OR @Status IS NULL)
END
</pre>
<p>Podemos ver que tirei o igual e coloquei a cláusula IS, apenas para verificar se é nulo. Resolvido! IS um lixo mesmo... Abraços!</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com1tag:blogger.com,1999:blog-8841982704991886486.post-41901999119705769282010-07-26T06:51:00.000-07:002010-07-26T07:48:56.050-07:00Diferenças entre ASP.Net Web Services e WCF (Windows Comunication Fundation)<p>
Encontro poucas informações sobre WCF atualmente na Internet. Na verdade pouco usei
esta tecnologia, mas quando começei a pesquisar sobre a maior dúvida era: O que WCF
tem de diferente dos Web Services.</p>
<p>
Para um conteúdo completo, recomendo o blog do MVP <a href="http://www.israelaece.com/post/WCF-Video-A-Estrutura-de-um-Servico.aspx" target="_blank">
Israel Aece</a>. Ele fez alguns vídeos e explica muitas coisas do WCF, falando
também as diferenças entre as tecnologias.</p>
<p>
A partir do blog dele, tentei fazer uma tabela básica com o que existe em Web Services
e o que existe no WCF. O Resultado é o lixo abaixo:</p>
<table class="post-table">
<thead>
<tr>
<td>
Ação
</td>
<td>
Web Services
</td>
<td>
WCF
</td>
</tr>
</thead>
<tbody>
<tr>
<td class="act">
Estrutura de<br />Projeto
</td>
<td>
Arquivos .asmx, trabalha com métodos de serviço.
</td>
<td>
Arquivos .srv, trabalha com contratos de serviços.
</td>
</tr>
<tr>
<td class="act">
Contratos
</td>
<td>
Obrigatório o uso atributo [WebMethod] em cada método que estará disponível para
o acesso.
</td>
<td>
Interfaces determinam os contratos, decoradas com [ServiceContract]. Pode ter tipos
complexos vinculados aos serviços.
</td>
</tr>
<tr>
<td class="act">
Serialização/<br />Deserialização
</td>
<td>
Serializa todos os membros públicos com <i>XmlSerializer</i>.
</td>
<td>
Utiliza o DataContractSerializer, parecido com <i>XmlSerializer</i> porém persiste
membros private e protected e gera um XML mais simplificado, melhorando a interoperabilidade
entre as plataformas.
</td>
</tr>
<tr>
<td class="act">
Protocolo/<br />Hosting
</td>
<td>
Pode somente ser hospedado no IIS, utilizando o protocolo HTTP/HTTPS.
</td>
<td>
Arquitetura muito mais flexível e é independente do protocolo, ou seja, ele pode
rodar em HTTP, HTTPS, TCP, MSMQ, etc. Pode usar o IIS como host ou ser um serviço
instalado no Windows.
</td>
</tr>
<tr>
<td class="act">
Extensibilidade
</td>
<td>
Interceptar as requisições através de SOAP Extensions.
</td>
<td>
Inúmeros pontos de extensibilidade tanto do lado do serviço quanto do cliente.
</td>
</tr>
<tr>
<td class="act">
Segurança
</td>
<td>
Segurança baseada no transporte, ou seja, ele somente será seguro se você expor
o serviço através de HTTPS. Pode utilizar SoapHeader com usuário e senha. Funciona
bem, mas é vulnerável.
</td>
<td>
É seguro por padrão. Para utilizar a autenticação baseada em UserName/Password que
o WCF fornece sob o protocolo HTTP, será necessário utilizar um certificado.
</td>
</tr>
<tr>
<td class="act">
Configuração
</td>
<td>
Utiliza a Web.config de forma declarativa
</td>
<td>
Seção de configurações são extremamente ricas. Segurança, transações, know types,
behaviors, bindings, endpoints, contratos, etc. É um pouco complexo. Grande parte
do que temos no WCF não existe nativamente no ASMX.
</td>
</tr>
<tr>
<td class="act">
Interoperabilidade
</td>
<td>
Interoperabilidade O ASMX não possui nativamente suporte a especificações que foram
definidas por grandes "players" do mercado. Precisa da instalação de um Add-on para
o Visual Studio .NET.
</td>
<td>
Padrões já foram implementados nativamente e são configuráveis. Consegue facilmente
conversar com serviços construídos em ASMX em ambos os lados.
</td>
</tr>
<tr>
<td class="act">
Cliente
</td>
<td>
Pode ser integrado com muitas aplicações.
</td>
<td>
Muito mais flexível que o ASMX.
</td>
</tr>
<tr>
<td class="act">
Desempenho
</td>
<td colspan="2">
<a href="http://msdn.microsoft.com/en-us/library/bb310550.aspx" target="_blank">http://msdn.microsoft.com/en-us/library/bb310550.aspx</a>
</td>
</tr>
<tr>
<td class="act">
Resultado <br />Final
</td>
<td>
Gera WSDL
</td>
<td>
Gera WSDL
</td>
</tr>
<tr>
<td class="act">
Conclusão
</td>
<td colspan="2">
Muitas funcionalidades ainda são de forma idêntica entre o WS e o WCF.<br /><br />
Quanto a questões de configuração, segurança, desempenho e Interoperabilidade o
WCF ganha por ter todos os padrões de XML adicionados nativamente, englobar todas
as tecnologias de computação distribuída da Microsoft e ser mais flexível a alterações
e extensibilidade.
<br /><br />
Os Web Services são pouco mais fáceis de se trabalhar quanto a questão de criação
de projeto e análise de erros. Entretanto a questão de desenvolvimento o WCF é bem
mais avançado. Por fim, os dois geram WSDL para o cliente consumir os dados.
</td>
</tr>
</tbody>
</table>
<p>
Se colocarmos em uma balança as duas tecnologias. Realmente pouca coisa parece
ter mudado.</p>
<p>
Entretanto, pensando no seguinte fato: Se hoje minha empresa vai começar a criar
algo orientado a serviços, deveriamos usar o WCF, pois é uma nova tecnologia que
vai substituir o Web Services.</p>
<p>
Agora, fazer a migração das tecnologias, talvez isso ainda (atualmente) não vale
tanto a pena. Pelo mesmo motivo de "parecer" o mesmo da mesma coisa.</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com2tag:blogger.com,1999:blog-8841982704991886486.post-70978948186157174492010-07-20T17:14:00.001-07:002010-07-20T18:35:15.890-07:00Como funcionam as Arrays (Matrizes) Multidimensionais no C#?<a href="http://www.adrianogalesso.com.br/images/blog/Matriz.jpg" rel="lightbox"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNSFUZFG3XRNkLefDkyjvmHsBXzsbNoWLn7QADf3p1KiMcHaSUH-e6dIx7FLkvbkDiSre9VCw5sKVTR6vD9M6EUOVST7SQibocoqSanDbXMMc5oPyHTXsZeeK8IjvHgDOtVC8GcTFH4lc/s400/Matriz.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5496148295331113154" /></a>
<p>Bem simples essa resposta. Funciona como esta na imagem acima =).</p>
<p>Ok, não é tão simples. Mas ai está o ponto deste lixo de post. As matrizes, ou como chamamos no C# arrays, multidimensionais são, como muitos professores de faculdade dizem, uma caixa de Biz, ou melhor, linha e coluna igual na matemática.</p>
<p>E eles estão certos. É isso mesmo. Mas não é como o C# trata isso internamente. </p>
<p>Arrays são <b>Reference Types</b>, traduzindo, variáveis por referência (para quem não sabe, existem 2 tipos, os tipos por referência e os por valor, os Value Types). Os Reference Types guardão, ao invés do valor da variável, o endereço de memória no qual este valor está disponível.</p>
<p>Entendendo isso, vamos a Array. Imaginando a seguinte entrada do programa:</p>
<pre class="brush: c#">
int[,] x = new int[2, 3];
x[1, 2] = 10;
</pre>
<p>Na primeira linha, criamos uma matriz “x” de inteiros com 2 linhas e 3 colunas. Na realidade, inserimos na memória stack (Pilha) um endereço, podemos ver essa ação na imagem acima (e todas as outras ações também =P). Podemos ver que “x” guarda o endereço de memória “adew:12ws”.</p>
<p>A partir dessa posição de memória podemos entender como o C# se comporta. </p>
<p>Como temos uma array de 2 por 3, vamos ter primeiro neste endereço (“adew:12ws”) outros dois endereços conforme solicitamos na “linha” [<b>2</b>, 3], e esses dois endereços terão as quantidades (três neste caso) de VALORES que solicitamos na "coluna" [2, <b>3</b>].</p>
<p>Eu disse valores em maiúscula pois realmente na última instrução da array não teremos mais apontamento para memória e sim o valor real guardado. Esse valor é iniciado zero para todas as 6 possibilidades.</p>
<p>E como funciona a troca de valor, como a segunda linha de instrução diz x[1, 2] = 10? Na imagem podemos ver passo a passo como funciona. </p>
<p>A variável "x", guarda o endereço “adew:12ws” que em 0 guarda o endereço “apop:1234” e em 1 guarda o endereço “eeee:uuuu” (lembrando que as posições da array sempre começam com 0 e terminam em valor - 1). Vamos trocar o valor na linha 1 (“apop:1234” em “adew:12ws”) da coluna 2 (valor 0 em “apop:1234”) para 10 (risca o zero e coloca o 10). Pronto assim o C# trata as arrays multidimensionais.</p>
<p>E se tivéssemos mais uma dimensão?</p>
<pre class="brush: c#">
int[,,] x = new int[2, 3, 2];
</pre>
<p>A mesma idéia iria se aplicar, onde "x" apontaria para um endereço de memória (como na pilha vista) com 2 endereços de memória [<b>2</b>, 3, 2]. Esses dois endereços apontariam para mais três endereços de memória [2, <b>3</b>, 2] e cada um desses endereços de memória teriam 2 valores [2, 3, <b>2</b>]. Como muita coisa na informática é feita uma árvore de dados.</p>
<p>Esse post foi um pedaço da aula de orientação a objetos avançada que fiz junto com minha empresa com o professor Agnaldo no centro de treinamento <a href="http://www.50minutos.com.br/" target="_blank">50 minutos</a>. Achei realmente muito interessante.</p>
<p>Abraços.</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com0tag:blogger.com,1999:blog-8841982704991886486.post-50289282674497267322010-07-05T11:48:00.001-07:002010-07-05T11:55:12.869-07:00Charges<p>Ok, isso acontece em todas empresas =)</p>
<a href="http://www.adrianogalesso.com.br/images/blog/Floresta_Desenvolvimento.jpg" rel="lightbox"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 298px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXUQn2bvcpp02wUbk8SOkJZFmcd2TqGj_DYB7OTtsiUcd40QK01WwivL19mcqh9NIfUDI8-_Okdv3mZ6YvYVfMDP36SYMWX_2ZskGSvwLDjUe-EDYlUuzlaPx6dNNTg1oYlItB_J8sXF4/s400/Floresta.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5490496218148056978" /></a>
<p>Esse eu editei pois o ratinho estudava C++, agora é um ratinho que estuda C#!</p>
<a href="http://www.adrianogalesso.com.br/images/blog/Ratinho_Programador_CSharp.jpg" rel="lightbox"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 333px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3BI30pwuutxgsPxCFACDLXMRasLbxWBHBRFBcKXq3uqF0ObqqniW22Rjs7GCMU0owZ0CGgORdHIywwQ7HHosrSgjX1RSof6GSwWN678yGw4I1-9O7X0IlRUbxuNSCp2STg-8a9ZbDsRA/s400/Ratinho.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5490497163299523026" /></a>
<p>Lixo para descontrair...</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com0tag:blogger.com,1999:blog-8841982704991886486.post-5965090569110935672010-06-24T09:21:00.000-07:002010-06-30T18:46:27.522-07:00Procurando elementos em uma lista genérica (Exists(), Find(), FindAll(), RemoveAll())<p>Temos listas genéricas no Framework do .Net desde a versão 2.0. A primeira vez que eu vi já adorei pelo fato de aumentar o desempenho devido a não necessidade de conversão de tipos. Outro ponto é a segurança, pelo mesmo motivo da tipagem, antigamente nos ArrayLists poderíamos sem querer colocar uma string dentro de uma lista de inteiros, e só descobrir isso em execução. Por fim, também temos um código enxuto.</p>
<p>Então, lista genérica não é novidade, encontramos vários exemplos na Internet de como criá-las. Também encontramos exemplos de como fazer filtros ou encontrar objetos dentro das listas, mas são um pouco mais complexos de se achar e quando encontrados não são muito explicativos. Por isso então, este post vai pro lixo.</p>
<p>Vamos criar uma Lista de Pessoas, básico para estudar esse tipo de assunto (Vou usar um ConsoleApplication):</p>
<pre class="brush: c#">
public class Pessoa
{
private string Nome { get; set; }
private Int16 Idade { get; set; }
private char Sexo { get; set; }
public Pessoa(string nome, Int16 idade, char sexo)
{
Nome = nome;
Idade = idade;
Sexo = sexo;
}
public Pessoa()
{
Nome = string.Empty;
Idade = 0;
Sexo = char.MinValue;
}
}
</pre>
<pre class="brush: c#">
class Program
{
static void Main(string[] args)
{
List<Pessoa> lstPessoas = new List<Pessoa>();
lstPessoas.Add(new Pessoa("Adriano Galesso", 23, 'M'));
lstPessoas.Add(new Pessoa("Manuela Bognar", 21, 'F'));
lstPessoas.Add(new Pessoa("Pedro Alberto Braga", 44, 'M'));
lstPessoas.Add(new Pessoa("Rosalinda da Silva", 75, 'F'));
Existe(lstPessoas);
Procura(lstPessoas);
Remove(lstPessoas);
Console.ReadLine();
}
}
</pre>
<p>Temos uma lista com 4 objetos Pessoa. Agora vamos começar a “brincar” com nossa lista.</p>
<p>Primeiramente vamos criar um método que verifica se existem alguns nomes em nossa Lista. Para isso vamos utilizar a função Exists da lista genérica.</p>
<pre class="brush: c#">
private static void Existe(List<Pessoa> lstPessoas)
{
string[] nomePesquisa = new string[] { "Adriano", "Margarida", "Pedro", "Marcos", "Graciele" };
for (int i = 0; i < nomePesquisa.Length; i++)
{
Console.WriteLine(lstPessoas.Exists(
delegate(Pessoa pessoa)
{
return pessoa.Nome.IndexOf(nomePesquisa[i]) >= 0;
}) ?
nomePesquisa[i] + " Existe na Lista" :
nomePesquisa[i] + " Não Existe na Lista");
}
Console.WriteLine("\n");
}
</pre>
<p>Neste método temos uma array de strings com nomes para pesquisar na lista. Para cada string vamos mostrar se existe ou não o nome da lista (mesmo que parte do nome).</p>
<p>Passamos uma lista de pessoas para o método fazer a verificação. Para a verificação foi utilizada a função Exists. Esta função espera um System.Predicate tipado, ou seja, um delegate que contém a regra para a busca dentro da lista. Sendo mais especifico, devemos delegar uma função para fazer qualquer condição que gostaríamos.</p>
<p>Neste caso o delegate fará a verificação de cada objeto pessoa em nossa lista, vendo se parte do Nome contém as strings da nossa array de pesquisa. Se tiver escrevemos uma coisa e se não tiver escrevemos outra.</p>
<p>Basicamente o mais importante de toda a busca é o delegate. Em uma função delegate, deve-se retornar sempre um boleano. Neste caso usamos o delegate junto com o próprio método, mas podemos fazer separadamente com um método qualquer. Vamos ver isso mais para frente.</p>
<p>Agora vamos conhecer a função Find() e FindAll(). A diferença entre as duas é bem simples. O Find() busca na lista, crescente, um resultado válido, caso encontre, ele para de buscar e retorna um resultado. Em contraponto o FindAll() procura por todos valores da lista e retorna uma outra lista de resultados válidos.</p>
<p>Vamos estudar o método Procura.</p>
<pre class="brush: c#">
private static void Procura(List<Pessoa> lstPessoas)
{
//Função Find retornando uma pessoa pelo Nome
Pessoa pessoa = lstPessoas.Find(PorNome);
Console.WriteLine(
pessoa != null ?
"Pessoa Encontrada (No Find): " + pessoa.Nome + ", " + pessoa.Idade + ", " + pessoa.Sexo :
"Nenhuma pessoa Encontrada");
//Função FindAll retornando uma lista de pessoas pelo Sexo
foreach (Pessoa pessoaLocal in lstPessoas.FindAll(PorSexo))
{
Console.WriteLine("Pessoa Encontrada (No FindAll): " + pessoaLocal.Nome + ", " + pessoaLocal.Idade + ", " + pessoaLocal.Sexo);
}
Console.WriteLine("\n");
}
</pre>
<p>Este método começa utilizando a função Find da lista genérica. Assim como o método anterior, passamos a lista carregada.</p>
<p>Criamos um objeto pessoa, pois já sabemos que o Find retorna um resultado único. Podemos notar que não é utilizado o delegate, entretanto o Find também espera um System.Predicate. </p>
<p>Isto porque, agora chamamos direto um método, o PorNome. </p>
<pre class="brush: c#">
private static bool PorNome(Pessoa pessoa)
{
if (pessoa.Nome == "Adriano Galesso")
{
return true;
}
return false;
}
</pre>
<p>O método PorNome retorna um boleano (como dito anteriormente). E recebe uma pessoa, mas como isso se não passamos nada na chamada do método?</p>
<p>Como o predicate é tipado, automaticamente se sabe que objeto você está tentando procurar. Então no parâmetro do método é passado o objeto da lista (funciona como um foreach).</p>
<p>No método PorNome simplesmente fazemos uma validação qualquer e retornamos ao método Procura. Que verificará se o objeto pessoa não esta nulo e escrever que foi encontrado na lista.</p>
<p>Continuando no método Procura. Agora vamos utilizar a função FindAll() da lista genérica. Como já sabemos teremos uma lista de resultados, pois ele irá procurar em todos objetos da lista. O predicate que utilizaremos é o método PorSexo.</p>
<pre class="brush: c#">
private static bool PorSexo(Pessoa pessoa)
{
if (pessoa.Sexo == 'F')
{
return true;
}
return false;
}
</pre>
<p>Nada de diferente neste método, simplesmente vamos procurar em nossa lista todas as mulheres. </p>
<p>Voltando novamente no método Procura, como temos uma lista de resultados vamos usar o foreach para escrever os resultados com sucesso de nossa lista.</p>
<p>Por fim, vamos ver o método Remove. </p>
<pre class="brush: c#">
private static void Remove(List<Pessoa> lstPessoas)
{
lstPessoas.Remove(new Pessoa("Adriano Galesso", 23, 'M'));
lstPessoas.RemoveAll(Jovens);
foreach (Pessoa pessoa in lstPessoas)
{
Console.WriteLine("Velhos: " + pessoa.Nome + ", " + pessoa.Idade + ", " + pessoa.Sexo);
}
Console.WriteLine("\n");
}
</pre>
<p>Como anteriormente, passamos nossa lista de pessoas como parâmetro. Inicialmente usamos a função Remove da lista genérica. Que não tem nada de novo, simplesmente passamos um objeto que gostaríamos de remover e pronto, nada de predicate.</p>
<p>Depois disso vamos Remover todos os Jovens da Lista com o RemoveAll. Assim como o FindAll teremos uma lista de resultados. A única diferença é que uma vez removido da lista, não poderemos mais encontrar o objeto removido. (Por exemplo, como a lista é por referencia de memória, se chamássemos o método Remove antes dos outros, nossa lista estaria com menos objetos).</p>
<p>Utilizaremos como predicate o método Jovens.</p>
<pre class="brush: c#">
private static bool Jovens(Pessoa pessoa)
{
if (pessoa.Idade <= 30)
{
return true;
}
return false;
}
</pre>
<p>Vamos remover da lista, todas as pessoas com menos de 30 anos. Voltando ao método Remove, escrevemos a lista com os novos resultados.</p>
<p>Por fim, o mais legal das “buscas” em listas genéricas são os predicates. Mas ainda fica uma dúvida no ar. E se eu quiser passar mais parâmetros para um método delegate?</p>
<p>Bom, tem como, mas não fique todo felizão como eu fiquei quando descobri. Primeiro saiba que isso só é possível a partir do Framework 3.5 (meu projeto era no 2.0 =/). </p>
<p>Primeiramente se estivermos usando o Framework 3.5, podemos utilizar os Lambda Expression. <b>Lambda Expression</b> é a evolução dos delegates com pequenas notações, ou seja, se for só para retornar um valor simples, como por exemplo:</p>
<p>
Método:<br />
Double MultiplicaPorCinco(int x)<br />
{<br />
return x * 5;<br />
}
</p>
<p>
Lambda Expression:<br />
x => x * 5;
</p>
<p>Vamos aplicar no método Remove:</p>
<pre class="brush: c#">
private static void Remove(List<Pessoa> lstPessoas)
{
//lstPessoas.Remove(new Pessoa("Adriano Galesso", 23, 'M'));
lstPessoas.RemoveAll(pessoa => pessoa.Idade <= 30);
foreach (Pessoa pessoa in lstPessoas)
{
Console.WriteLine("Velhos: " + pessoa.Nome + ", " + pessoa.Idade + ", " + pessoa.Sexo);
}
Console.WriteLine("\n");
}
</pre>
<p>Se olharmos acima, veremos que foi substituído, o método Jovem pelo Lambda Expression. </p>
<p>Legal, e os 2 parâmetros na função?</p>
<p>Bom, isso vai ficar para o próximo Post, quando o lixo estiver cheio de Func =P e mais Lambda Expression</p>
<p>Abraços... PS: Recorri a um script para ajustar os códigos, é bem mais fácil =)</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com0tag:blogger.com,1999:blog-8841982704991886486.post-1059516778490463122010-05-23T14:07:00.000-07:002010-06-24T10:35:10.738-07:00Recuperando QueryStrings com TryParse<p>Ultimamente tenho escrito alguns artigos para revistas e sites de tecnologia e a lixeira acaba ficando um pouco vazia.</p>
<p>Entretanto, sempre tem alguma coisa velha que é uma boa nova idéia. Digo velho porque recuperar QueryStrings e variáveis de Sessão em C# até minha tia vó já sabe fazer. Mas será que ela faz da melhor maneira?</p>
<p>Imaginado minha Query String “teste”. “Teste” sempre será a identificação de um elemento que eu gostaria de passar pelas páginas. E outra, eu sei que “teste” é um inteiro.</p>
<p>Como recuperar?</p>
<div class="codigo">
<p><span class="rvts9">int</span> meuTeste = <span class="rvts22">Convert</span>.ToInt32(Request.QueryString[<span class="rvts23">"teste"</span>]);</p>
</div>
<p>Isso é realmente fácil (minha tia vó que postou). Agora vamos falar pra minha tia vó que infelizmente o mundo não é perfeito e podemos ter engraçadinhos que tentam trocar o valor da QueryString manualmente (eu sou um deles). Por Exemplo, colocar um “teste=a” na URL.</p>
<p>Neste ponto minha tia vó sai de cena, isso ela já não sabe. Vamos ser espertos e colocar um Try pra pegar esses engraçadinhos. Mas não podemos ter um Try sem Catch e também não podemos parar a execução da página só porque temos uma variável sem valor (só se a página inteira for em torno desse valor). Neste caso então, vamos verificar se existe o valor da variável na Sessão “teste”, quem sabe o valor não está lá dentro!</p>
<div class="codigo">
<p><span class="rvts9">int</span> meuTeste = 0;</p>
<p><span class="rvts9">try</span><br />
{<br />
meuTeste = <span class="rvts22">Convert</span>.ToInt32(Request.QueryString[<span class="rvts23">"teste"</span>]);<br />
}<br />
<span class="rvts9">catch</span><br />
{<br />
meuTeste = <span class="rvts22">Convert</span>.ToInt32(Session[<span class="rvts23">"teste"</span>]);<br />
}</p>
</div>
<p>Legal, mas e sem não existir QueryString e não existir a Sessão? Minha página às vezes tem essa QueryString e às vezes tem essa Sessão? Vamos aninhar os Trys ai nos Catches nós pegamos zero da variável bla bla bla bla...</p>
<p>Nada disso. Esquece todos os códigos postados até aqui, pois para resolver qualquer problema para recuperar QueryString ou Sessão de tipos nativos <strong>devemos</strong> usar o TryParse. Digo devemos porque não há o que fazer se o valor que tentamos atribuir à uma variável não for de um tipo valido para mesma, assim evitamos exceções e obtemos valores válidos em qualquer tipo de ambiente.</p>
<p>Como não gosto de ficar sozinho em uma opinião, tenho dois link que além de me defenderem, eles fazem testes de desempenho entre o parse e o TryParse</p>
<p><a target="_blank" href="http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=523">http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=523</a></p>
<p><a target="_blank" href="http://www.codinghorror.com/blog/2005/08/tryparse-and-the-exception-tax.html">http://www.codinghorror.com/blog/2005/08/tryparse-and-the-exception-tax.html</a></p>
<p>Entretanto a questão deste post não é escrever sobre conversões de tipos e sim recuperar valores de QueryStrings ou Sessões. Então, como fazer isso de maneira limpa e prática.</p>
<p>Vamos voltar ao mesmo cenário onde a variável de QueryString “teste” pode existir ou não em uma página, assim como a Sessão “teste” pode existir ou não. Lembro também que não podemos esquecer de testar se o valor da QueryString é um inteiro e não vai me jogar uma exceção.</p>
<p>Chegamos as seguintes linhas de código:</p>
<div class="codigo">
<p><span class="rvts9">in</span>t meuTeste = 0;</p>
<p><span class="rvts9">if</span> (!<span class="rvts9">int</span>.TryParse(Request.QueryString[<span class="rvts23">"teste"</span>], <span class="rvts9">out</span> meuTeste))<br />
{<br />
<span class="rvts9">int</span>.TryParse(Session[<span class="rvts23">"teste"</span>], <span class="rvts9">out</span> meuTeste);<br />
}</p>
</div>
<p>O código diz que, se não for convertido a QueryString “teste” para minha variável de saída, que é um inteiro, ele tentará converter a Sessão “teste”. Não vamos verificar se ele consegue converter a Sessão, pois se não o valor da variável vai ser 0 de qualquer maneira.</p>
<p>E porque não usar o Convert.ToInt32? Justamente porque vamos ter que ficar testando os valores pra ver se realmente é um inteiro. E fazer esse processo deixa o código cheio e “chato”.</p>
<p>Por fim, podemos fazer o TryParse além de inteiros, em Decimal, DateTime, Float ou Double.</p>
<p>Até a próxima!</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com1tag:blogger.com,1999:blog-8841982704991886486.post-60909163590813761452010-05-19T12:38:00.000-07:002010-05-23T17:20:04.450-07:00Um pouco de usabilidade<p>Após a publicação do Blog do meu amigo <a href='http://tadanori.blogspot.com.br' target="_blank">Tadanori</a> sobre usabilidade, mais precisamente voltado à e-Commerce, achei essa imagem na net que diz muito sobre a realidade de uma empresa e como cada membro de uma determinada equipe tem uma opnião sobre como deve ser a usabilidade de um site.</p>
<a target="_blank" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8GdJNCoi5sv60po2rMa3kd8tgGq4d9ZJIswPcNUH2mR4MUWLYhP8Oa787zBUdte_1blsLHS7a7yaZ7CV6D_o9-CMKWlKHFE3H5Kotm7Bz1dYtaYMhSz6KHUfUrU06UM25fkJPLsWpGJE/s1600/usabilidade.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 234px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8GdJNCoi5sv60po2rMa3kd8tgGq4d9ZJIswPcNUH2mR4MUWLYhP8Oa787zBUdte_1blsLHS7a7yaZ7CV6D_o9-CMKWlKHFE3H5Kotm7Bz1dYtaYMhSz6KHUfUrU06UM25fkJPLsWpGJE/s400/usabilidade.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5474609226602466626" /></a>
<p>De acordo com Jakob Nielsen, o maior análista de usabilidade atualmente, dono do lindo site <a href="http://www.useit.com/" target="_blank">http://www.useit.com/</a>, pesquisas de usabilidade ajudam muito na modo de como um site pode ou não fazer sucesso na Web. Ou seja, usabilidade terá mais espaço aqui na Lixeira futuramente.</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com0tag:blogger.com,1999:blog-8841982704991886486.post-5694963151640291082010-01-25T09:49:00.000-08:002010-12-26T10:47:48.362-08:00Férias<p>Olá pessoal, desculpe a falta de lixo neste dias que se passaram. Depois de 2 anos eu tirei minhas férias! \o/</p>
<p>Bom, este ano, vou voltar com a parte de padrões de projeto e outros assuntos que vão bomabar a lixeira.</p>
<!--<p>Então até logo! Abaixo algumas fotos da minha viajem para Argentina (recomendo).</p>
<p><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5430737262356420530" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCbtDXpfyI3-JsVn1bwMTnvrg88-OsfMiX7PgjLFq7B7iYSHg0ylSZecRNqF43mzuAawErue8s4Gyc-KjKzUR5Nflcuav4yMDB5BM9AaP0_d2grA-G-zczdkmU1mIk4E6ck2F5JU5eFiA/s400/SDC10446.JPG" />
<img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 300px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHs_HV_CIr2_qxbUDmGDBF8f0O8MCsBSarWh_CoQcjJ0wDyKjYHNdJXDbKPv9QNcPzdoQ9ndTHH7d0Tkt_8_Q6KxqFstFZZWy4bp43Y09YwjvtWOFn5nS61C81TxPsz3MQ7MC-5rVZDIg/s400/SDC10476.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5430738581776358850" />
<img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsdeJ2thLZdGqZuJ76by5lBK3EsOEiJLl-0qmL2I47G-spL9rUwrLDh5N2FLF-cXa3oC9914apLFY1u623mFssFZ0h0RyCkNRoCkvknM3Md0lGgO6UpmX5rfLgRWGPLGC7BTxvLjnQxf4/s400/SDC10555.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5430738572014512258" />
<img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaV-erZFwgJfxOWBaRp-XBxBekpy0NZHGLgdMjwxdg5ElU7miOHPJuRKbJ4NRWgQSG5QIHTPizLDF0XkymVGYmDGz3HFXTGoymrLSgYMVreolRsYzdW9T7jB6XEudIy3nC4olB3pnY0rY/s400/SDC10494.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5430738569229279362" />
<img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEintlNUgj4vP8WYZVhEP9A4oZgzpppdY6ZSe0yrqZ_Hzwovyq68lJHEQh7k9tke1Z1r4H0GRwqBKn6Wxz8QKXRWu3VuX6j0ArFn8SBj9MpdsWhy5UtuavkJuADSTWdldqJnU_QesgFnt5o/s400/SDC10670.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5430738585163389874" />
<img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDW-5bT3cDVun6opki-iYtQBImKPhBU7oovhWbPxkHGbnrkLCm8tFBrdlucivurAFEtWmLwkQGxXf-58Or7VMiAzsuxfdT_BGrIccsxUsSvC8dJZjWGJoYg5S3K36BGoK1gvIasxPcGtw/s400/SDC10100.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5430740196988289266" />
<img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBUtiwX-OrhlFOMzjUZyxeomd_mBneG-3HebU3BuVaKqP4ppF0iGjIFDpAEiCi8G6ciMCihQWUH_vW3ymVGonDYqL6IrOOTUNftKXvzYS06KudABWIrFtSa7SS9LCEncnVnc-m9bgjIuI/s400/SDC10126.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5430740188242126402" />
<img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeX-EU_TxIcPn_jhs8vmRqCJ0ACGthgjHp2r-A92kzf-2IDrF3fnpPnrFU24yCKtlnlsY54pd1ii4XL4c5QM-TZh34dOB_XpY17B9gjCoIyMh1KGyFFlsqQ3nPcjf7xgD5zUow8qqoBMY/s400/SDC10034.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5430740184050127394" />
<img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbu33Im9oQGA4I3IujG6HsAaPZv1r0I-Tl8q83aLWh4NlNK6Ke2NKE-sB416mhVG0acNaz8Q64Eng-toFs_WW_W5THc8TDUEcOeXxU45FbtXkOSLA_TO4UxhSsGZ37xM4DkjP6jU8Wsog/s400/SDC10146.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5430741947055422754" />
<img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9h_4CKpRThEu1tCW9z0vh4cn6CEaVhN4As2An3YcWZkb4Qat6CkKOCmfkp0jdsksIigwHClBz1MFoJ7AGlONexaZYuckrVO20uatjY5Iv6AtUeEEuEfb5n-LymjPzQDBVuY2PmfW38OQ/s400/SDC10313.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5430741934057358994" />
<img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJkn3se1AeVhr2VPiJOEsfXG3K3gaMKqUNVd5svl3TuESm8rGEFpPl0PL0poW_QJQcngeB-xlQlR4oh5RTcsiXorqi-Cr4lS7CJ0qi6ytVLJ0zc_rioQUONZy7VhR1eI4qojywNM_s_rk/s400/SDC10164.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5430741940292805650" />
<img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkyb0Y9w82HoYXLq3Mh81EjS-0j4L_CVf5SLjXgnzPNGHmj48pzcTLlRclZwAGTm_vRjLHJ9YH3hmcwp7KduLgQTlMMjIwm7JW3ImnXwtXOi_OxQ_qcSIOVcSPnwSxRy8TajUqxIR4aOQ/s400/SDC103q7.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5430741930386932370" /></p>-->Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com0tag:blogger.com,1999:blog-8841982704991886486.post-39345799928878487742009-11-24T10:16:00.000-08:002009-12-11T07:18:15.107-08:00Gerar XMLs pelo SQL Server (FOR XML)<div class="nospace"><p class=rvps3><span class=rvts8>Depois de 3 meses de muita quebradeira em casa, agora tenho meu espaço de volta e talvez consiga postar mais facilmente hahahahahaha.</span></p><p class=rvps3><span class=rvts8>Hoje vou falar, mais uma vez, sobre XML... É não tem como escapar. </span></p><p class=rvps3><span class=rvts8>Vamos ao seguinte cenário, temos 3 tabelas em nosso banco de dados, são elas: Conta, Usuario, Endereço. Meu cliente tem um sistema interno que recebe os novos usuários de seu site, ele quer receber diariamente todos os usuário do site em formato XML. Porém não só os usuários novos, ele quer todos os dias TODOS os usuário (É isso existe).</span></p><p class=rvps3><span class=rvts8>Meu cliente (Bão de venda), tem pré</span><span class=rvts7>-</span><span class=rvts8>cadastrados 100.000 usuários, ele pretende ter cerca de 500 novos por dia =O. Se minha calculadora estiver certa 182</span><span class=rvts7>.</span><span class=rvts8>500 por ano, pouco até, mas já precisa-se pensar sobre a performance.</span></p><p class=rvps3><span class=rvts8>O XML deve ter o seguinte formato:</span></p><p class=rvps3><span class=rvts8><Usuario></span><br><span class=rvts8> <Nome>Teste</Nome></span><br><span class=rvts8> ... *</span><br><span class=rvts8></Usuario></span></p><p class=rvps3><span class=rvts8>* São os campos: Nome, Sobrenome, Login, E-mail, Sexo, DataCadastro, Tipo, CPF, CNPJ, Razão Social, RG, DataNascimento, Logadouro, Numero, Complemento, Referencia, Bairro, Cidade, Estado, Pais, Telefone1, Telefone2, Celular, Fax... E assim vai porque isso é só para exemplificar que é "campo pra caramba"!!!</span></p><p class=rvps3><span class=rvts8>Então, podemos fazer de 2 modos:</span></p><p class=rvps3><span class=rvts8>O 1º é fazer uma view e após uma procedure que retorna todos esses carinhas para o meu objeto (1 objeto? Sei lá acho que vão ser 3 objetos ^^, ou um DataSet talvez, não importa) no C#, lá eu varro a lista e vou escrevendo o XML de uma das N maneiras que o C# tem de escrever um XML. Pronto...</span></p><p class=rvps3><span class=rvts8>Ou podemos deixar 60% mais rápido</span><span class=rvts7>.</span></p><p class=rvps3><span class=rvts8>Podemos até criar a view, porém é a procedure que vai retornar para o C# um XML formatado, o C# vai jogar em um arquivo e vai salvar. Joiá! Mas como?</span></p><p class=rvps3><span class=rvts8>Para exemplificar vamos trabalhar com Nome, Sobrenome e E</span><span class=rvts7>-</span><span class=rvts8>mail. Assim pulamos a parte da View e vamos direto para a procedure:</span></p><div class="codigo"><p class=rvps4><span class=rvts9>CREATE</span><span class=rvts10> </span><span class=rvts9>PROCEDURE</span><span class=rvts10> GerarXMLUsuarios</span></p><p class=rvps4><span class=rvts9>AS</span></p><p class=rvps4><span class=rvts9>BEGIN</span></p><p class=rvps4><span class=rvts10> </span><span class=rvts9>SELECT</span><span class=rvts10> [UsuNome]</span></p><p class=rvps4><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuSobrenome]</span></p><p class=rvps4><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuEmail]</span></p><p class=rvps4><span class=rvts10> </span><span class=rvts9>FROM</span><span class=rvts10> [tbUsuarios]</span></p><p class=rvps5><span class=rvts9>END</span></p></div><br /><p class=rvps3><span class=rvts8>Agora utilizaremos a cláusula </span><span class=rvts12>FOR XML</span><span class=rvts7>.</span></p><p class=rvps3><span class=rvts8>O </span><span class=rvts12>FOR XML</span><span class=rvts8> simplesmente organiza e retorna as informações em formato XML.</span></p><p class=rvps3><span class=rvts8>Temos as seguintes opções no </span><span class=rvts12>FOR XML:</span></p><p class=rvps3><span class=rvts12>1 </span><span class=rvts14>–</span><span class=rvts12> FOR XML AUTO:</span></p><p class=rvps3><span class=rvts8>O modo AUTO retorna os resultados da consulta como elementos XML simples e aninhados, ou seja, cada tabela indicada depois da cláusula FROM é um elemento do XML, as colunas indicadas no SELECT são atributos. Utilizamos o AS para nomear os elementos:</span></p><div class="codigo"><p><span class=rvts10> </span><span class=rvts9>SELECT</span><span class=rvts10> [UsuNome] </span><span class=rvts9>AS</span><span class=rvts10> Nome</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuSobrenome] </span><span class=rvts9>AS</span><span class=rvts10> Sobrenome</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuEmail] </span><span class=rvts9>AS</span><span class=rvts10> Email</span></p><p><span class=rvts10> </span><span class=rvts9>FROM</span><span class=rvts10> [tbUsuarios] </span><span class=rvts9>AS</span><span class=rvts10> UsuariosGerais</span></p><p class=rvps3><span class=rvts10> </span><span class=rvts9>FOR</span><span class=rvts10> </span><span class=rvts9>XML</span><span class=rvts10> </span><span class=rvts9>AUTO</span></p></div><br /><p class=rvps3><span class=rvts8>Resultado:</span></p><div class="codigo"><p><span class=rvts15><</span><span class=rvts16>UsuariosGerais</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Adriano</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Sobrenome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Teste</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Email</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>adriano.galesso@teste.com.br</span><span class=rvts18>"</span><span class=rvts15> /></span></p><p><span class=rvts15><</span><span class=rvts16>UsuariosGerais</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>renata</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Sobrenome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Teste</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Email</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>renata@teste.com.br</span><span class=rvts18>"</span><span class=rvts15> /></span></p><p><span class=rvts15><</span><span class=rvts16>UsuariosGerais</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Christiano</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Sobrenome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Teste</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Email</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>web@teste.com.br</span><span class=rvts18>"</span><span class=rvts15> /></span></p><p class=rvps3><span class=rvts15><</span><span class=rvts16>UsuariosGerais</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>suporte</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Sobrenome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Teste</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Email</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>suporte@teste.com.br</span><span class=rvts18>"</span><span class=rvts15> /></span></p></div><br /><p class=rvps3><span class=rvts8>Se alguma coluna do SELECT for de uma tabela já identificada ela é colocada como atributo (conforme visto acima), se for de uma tabela diferente será adicionada como elemento dentro do elemento pai, que é a 1º tabela especificada:</span></p><div class="codigo"><p><span class=rvts10> </span><span class=rvts9>SELECT</span><span class=rvts10> UsuariosGerais</span><span class=rvts11>.</span><span class=rvts10>[UsuNome] </span><span class=rvts9>AS</span><span class=rvts10> Nome</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>UsuariosGeraisIntro</span><span class=rvts11>.</span><span class=rvts10>[UsuSobrenome] </span><span class=rvts9>AS</span><span class=rvts10> Sobrenome</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>UsuariosGerais</span><span class=rvts11>.</span><span class=rvts10>[UsuEmail] </span><span class=rvts9>AS</span><span class=rvts10> Email</span></p><p><span class=rvts10> </span><span class=rvts9>FROM</span><span class=rvts10> [tbUsuarios] </span><span class=rvts9>AS</span><span class=rvts10> UsuariosGerais </span><span class=rvts11>INNER</span><span class=rvts10> </span><span class=rvts11>JOIN</span><span class=rvts10> </span></p><p><span class=rvts10> [tbUsuarios] </span><span class=rvts9>AS</span><span class=rvts10> UsuariosGeraisIntro </span></p><p><span class=rvts10> </span><span class=rvts9>ON</span><span class=rvts10> UsuariosGerais</span><span class=rvts11>.</span><span class=rvts10>UsuCodigo </span><span class=rvts11>=</span><span class=rvts10> UsuariosGeraisIntro</span><span class=rvts11>.</span><span class=rvts10>UsuCodigo</span></p><p class=rvps3><span class=rvts10> </span><span class=rvts9>FOR</span><span class=rvts10> </span><span class=rvts9>XML</span><span class=rvts10> </span><span class=rvts9>AUTO</span><span class=rvts8> </span></p></div><br /><p class=rvps3><span class=rvts8>Resultado:</span></p><div class="codigo"><p><span class=rvts15><</span><span class=rvts16>UsuariosGerais</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Adriano</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Email</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>adriano.galesso@teste.com.br</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>UsuariosGeraisIntro</span><span class=rvts15> </span><span class=rvts17>Sobrenome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Teste</span><span class=rvts18>"</span><span class=rvts15> /></span></p><p><span class=rvts15></</span><span class=rvts16>UsuariosGerais</span><span class=rvts15>></span><br><span class=rvts15><</span><span class=rvts16>UsuariosGerais</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>renata</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Email</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>renata@teste.com.br</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>UsuariosGeraisIntro</span><span class=rvts15> </span><span class=rvts17>Sobrenome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15> Teste</span><span class=rvts18> "</span><span class=rvts15> /></span></p><p><span class=rvts15></</span><span class=rvts16>UsuariosGerais</span><span class=rvts15>></span><br><span class=rvts15><</span><span class=rvts16>UsuariosGerais</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Christiano</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Email</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>web@teste.com.br</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>UsuariosGeraisIntro</span><span class=rvts15> </span><span class=rvts17>Sobrenome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15> Teste</span><span class=rvts18> "</span><span class=rvts15> /></span></p><p><span class=rvts15></</span><span class=rvts16>UsuariosGerais</span><span class=rvts15>></span><br><span class=rvts15><</span><span class=rvts16>UsuariosGerais</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>suporte</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Email</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>suporte@teste.com.br</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>UsuariosGeraisIntro</span><span class=rvts15> </span><span class=rvts17>Sobrenome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15> Teste</span><span class=rvts18> "</span><span class=rvts15> /></span></p><p class=rvps3><span class=rvts15></</span><span class=rvts16>UsuariosGerais</span><span class=rvts15>></span></p></div><br /><p class=rvps3><span class=rvts8>Vejam que, como estou pegando o Sobrenome de uma “tabela diferente”</span><span class=rvts7>,</span><span class=rvts8> ele criou uma nova Tag dentro da principal e aplicou o atributo Sobrenome a ela.</span></p><p class=rvps3><span class=rvts8>Assim funciona o FOR XML AUTO.</span></p><p class=rvps3><span class=rvts12>2 </span><span class=rvts14>–</span><span class=rvts12> FOR XML RAW:</span></p><p class=rvps3><span class=rvts8>No modo RAW cada resultado da instrução SELECT vem em linha de acordo com o nome fornecido ao RAW (que se não for fornecido é raw mesmo):</span></p><div class="codigo"><p><span class=rvts10> </span><span class=rvts9>SELECT</span><span class=rvts10> [UsuNome] </span><span class=rvts9>AS</span><span class=rvts10> Nome</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuSobrenome] </span><span class=rvts9>AS</span><span class=rvts10> Sobrenome</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuEmail] </span><span class=rvts9>AS</span><span class=rvts10> Email</span></p><p><span class=rvts10> </span><span class=rvts9>FROM</span><span class=rvts10> [tbUsuarios] </span><span class=rvts9>AS</span><span class=rvts10> UsuariosGerais</span></p><p class=rvps3><span class=rvts10> </span><span class=rvts9>FOR</span><span class=rvts10> </span><span class=rvts9>XML</span><span class=rvts10> </span><span class=rvts9>RAW</span></p></div><br /><div class="codigo"><p><span class=rvts10> </span><span class=rvts9>SELECT</span><span class=rvts10> [UsuNome] </span><span class=rvts9>AS</span><span class=rvts10> Nome</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuSobrenome] </span><span class=rvts9>AS</span><span class=rvts10> Sobrenome</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuEmail] </span><span class=rvts9>AS</span><span class=rvts10> Email</span></p><p><span class=rvts10> </span><span class=rvts9>FROM</span><span class=rvts10> [tbUsuarios] </span><span class=rvts9>AS</span><span class=rvts10> UsuariosGerais</span></p><p class=rvps3><span class=rvts10> </span><span class=rvts9>FOR</span><span class=rvts10> </span><span class=rvts9>XML</span><span class=rvts10> </span><span class=rvts9>RAW</span><span class=rvts11>(</span><span class=rvts19>'Teste'</span><span class=rvts11>)</span></p></div><br /><p class=rvps3><span class=rvts8>Resultado:</span></p><div class="codigo"><p class=rvps3><span class=rvts15><</span><span class=rvts16>row</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Adriano</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Sobrenome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Teste</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Email</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>adriano.galesso@teste.com.br</span><span class=rvts18>"</span><span class=rvts15> /></span><br><span class=rvts15><</span><span class=rvts16>row</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>renata</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Sobrenome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Teste</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Email</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>renata@teste.com.br</span><span class=rvts18>"</span><span class=rvts15> /></span><br><span class=rvts15><</span><span class=rvts16>row</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Christiano</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Sobrenome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Teste</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Email</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>web@teste.com.br</span><span class=rvts18>"</span><span class=rvts15> /></span><br><span class=rvts15><</span><span class=rvts16>row</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>suporte</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Sobrenome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Teste</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Email</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>suporte@teste.com.br</span><span class=rvts18>"</span><span class=rvts15> /></span></p></div><br /><div class="codigo"><p class=rvps3><span class=rvts15><</span><span class=rvts16>Teste</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Adriano</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Sobrenome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Teste</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Email</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>adriano.galesso@teste.com.br</span><span class=rvts18>"</span><span class=rvts15> /></span><br><span class=rvts15><</span><span class=rvts16>Teste</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>renata</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Sobrenome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Teste</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Email</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>renata@teste.com.br</span><span class=rvts18>"</span><span class=rvts15> /></span><br><span class=rvts15><</span><span class=rvts16>Teste</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Christiano</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Sobrenome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Teste</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Email</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>web@teste.com.br</span><span class=rvts18>"</span><span class=rvts15> /></span><br><span class=rvts15><</span><span class=rvts16>Teste</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>suporte</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Sobrenome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Teste</span><span class=rvts18>"</span><span class=rvts15> </span><span class=rvts17>Email</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>suporte@teste.com.br</span><span class=rvts18>"</span><span class=rvts15> /></span></p></div><br /><p class=rvps3><span class=rvts8>Nota-se que diferente do AUTO, podemos nomear nossas elementos de acordo com o que colocamos no RAW e tabelas diferentes não são criadas como novos elementos filhos.</span></p><p class=rvps3><span class=rvts8>Assim funciona o FOR XML RAW</span></p><p class=rvps3><span class=rvts12>3 </span><span class=rvts14>–</span><span class=rvts12> FOR XML PATH:</span></p><p class=rvps3><span class=rvts8>O modo PATH tem uma maneira simples de misturar nós de elementos e atributos, e para propriedades mais complexas o PATH pode ser utilizado para trazer resultados com mais facilidade. Os nomes ou alias de colunas são tratados como expressões XPath</span><span class=rvts7>.</span></p><p class=rvps3><span class=rvts8>Vamos ao teste com nome de colunas:</span></p><div class="codigo"><p><span class=rvts10> </span><span class=rvts9>SELECT</span><span class=rvts10> [UsuNome] </span><span class=rvts9>AS</span><span class=rvts10> </span><span class=rvts19>'@Nome'</span><span class=rvts10> </span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuSobrenome] </span><span class=rvts9>AS</span><span class=rvts10> Sobrenome</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuEmail] </span><span class=rvts9>AS</span><span class=rvts10> Email</span></p><p><span class=rvts10> </span><span class=rvts9>FROM</span><span class=rvts10> [tbUsuarios] </span><span class=rvts9>AS</span><span class=rvts10> Usuarios</span></p><p class=rvps3><span class=rvts10> </span><span class=rvts9>FOR</span><span class=rvts10> </span><span class=rvts9>XML</span><span class=rvts10> </span><span class=rvts9>PATH</span></p></div><br /><p class=rvps3><span class=rvts8>Resultado:</span></p><div class="codigo"><p><span class=rvts15> <</span><span class=rvts16>row</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Adriano</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>adriano.galesso@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>row</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>row</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>renata</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>barbosa</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>renata@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>row</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>row</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>Christiano</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>web@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>row</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>row</span><span class=rvts15> </span><span class=rvts17>Nome</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>suporte</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>suporte@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p class=rvps3><span class=rvts15> </</span><span class=rvts16>row</span><span class=rvts15>></span></p></div><br /><p class=rvps3><span class=rvts8>Nota-se que onde colocamos o @ temos um Atributo, os que estão sem o @ são Elementos.</span></p><p class=rvps3><span class=rvts8>Outro teste, pra mim o mais legal, é o seguinte:</span></p><div class="codigo"><p><span class=rvts10> </span><span class=rvts9>SELECT</span><span class=rvts10> [UsuCodigo] </span><span class=rvts9>AS</span><span class=rvts10> </span><span class=rvts19>'@ID'</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuNome] </span><span class=rvts9>AS</span><span class=rvts10> </span><span class=rvts19>'Nome/Nome'</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuSobrenome] </span><span class=rvts9>AS</span><span class=rvts10> </span><span class=rvts19>'Nome/Sobrenome'</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuEmail] </span><span class=rvts9>AS</span><span class=rvts10> </span><span class=rvts19>'Email'</span></p><p><span class=rvts10> </span><span class=rvts9>FROM</span><span class=rvts10> [tbUsuarios] </span><span class=rvts9>AS</span><span class=rvts10> Usuarios</span></p><p class=rvps3><span class=rvts10> </span><span class=rvts9>FOR</span><span class=rvts10> </span><span class=rvts9>XML</span><span class=rvts10> </span><span class=rvts9>PATH</span><span class=rvts11>(</span><span class=rvts19>'Usuarios'</span><span class=rvts11>)</span><span class=rvts8> </span></p></div><br /><p class=rvps3><span class=rvts8>Resultado:</span></p><div class="codigo"><p><span class=rvts15><</span><span class=rvts16>Usuarios</span><span class=rvts15> </span><span class=rvts17>ID</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>216562</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>Adriano</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>adriano.galesso@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15></</span><span class=rvts16>Usuarios</span><span class=rvts15>></span></p><p><span class=rvts15><</span><span class=rvts16>Usuarios</span><span class=rvts15> </span><span class=rvts17>ID</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>216562</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>renata</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>renata@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15></</span><span class=rvts16>Usuarios</span><span class=rvts15>></span></p><p><span class=rvts15><</span><span class=rvts16>Usuarios</span><span class=rvts15> </span><span class=rvts17>ID</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>216563</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>Christiano</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>web@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15></</span><span class=rvts16>Usuarios</span><span class=rvts15>></span></p><p><span class=rvts15><</span><span class=rvts16>Usuarios</span><span class=rvts15> </span><span class=rvts17>ID</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>216566</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>suporte</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>suporte@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p class=rvps3><span class=rvts15></</span><span class=rvts16>Usuarios</span><span class=rvts15>></span></p></div><br /><p class=rvps3><span class=rvts8>Nota-se que quando colocado “/” entre os nomes dos elementos, o elemento anterior a “/” é o pai e o posterior é o elemento filho.</span></p><p class=rvps3><span class=rvts8>Outro ponto é o @, ele só pode ser usado se for o 1º elemento, ou se o elemento anterior for @ também. No caso se colocássemos o @ no Email daria um erro.</span></p><p class=rvps3><span class=rvts8>Por fim, o PATH pode ser nomeado assim como o RAW.</span></p><p class=rvps3><span class=rvts8>Assim funciona o FOR XML PATH.</span></p><p class=rvps3><span class=rvts12>4 </span><span class=rvts14>–</span><span class=rvts12> FOR XML EXPLICIT:</span></p><p class=rvps3><span class=rvts8>O mais avançado das 4 opções, o EXPLICIT especifica a forma que terá a arvore XML, assim você consegue manipular e ter mais controle em qualquer nó que será criado, no nosso caso por exemplo, o Sobrenome pode ser um nó filho de Nome sem precisarmos manipular tabelas conforme fiz em exemplos anteriores.</span></p><p class=rvps3><span class=rvts8>Porém o EXPLICIT tem algumas obrigações:</span></p><p class=rvps3 style="margin-left: 0; text-indent: 0px"><span class=rvts8>- “A primeira coluna deve fornecer o número da marca, o tipo de inteiro, do elemento atual, e o nome da coluna deve ser </span><span class=rvts12>TAG</span><span class=rvts8>.”</span></p><p class=rvps3 style="margin-left: 0; text-indent: 0px"><span class=rvts8>- “A segunda coluna deve fornecer um número de marca do elemento pai e esse nome de coluna deve ser </span><span class=rvts12>PARENT</span><span class=rvts7>.</span><span class=rvts8> Assim criando uma hierarquia.”</span></p><p class=rvps3><span class=rvts8>Também precisamos especificar os nomes das colunas em um formato geral:</span></p><p class=rvps3><span class=rvts20>Nome do Elemento</span><span class=rvts8> !</span><span class=rvts20> Numero da TAG </span><span class=rvts8>! </span><span class=rvts20>Nome do Atributo </span><span class=rvts8>!</span><span class=rvts20> Diretiva</span></p><p class=rvps3><span class=rvts8>Onde:</span></p><p class=rvps3><span class=rvts20>Nome do Elemento: </span><span class=rvts8>Identificador da Tag, exemplo Usuario = <Usuario></span></p><p class=rvps3><span class=rvts20>Numero da TAG:</span><span class=rvts8> Assim como Tag e o Parent, ajuda a determinar a aninhamento do XML.</span></p><p class=rvps3><span class=rvts20>Nome do Atributo: </span><span class=rvts8>Fornece o nome do atributo a ser construído no</span><span class=rvts20> Nome do Elemento </span><span class=rvts8>especificado, se existir a diretiva, ai esse se torna um elemento filho.</span></p><p class=rvps3><span class=rvts20>Diretiva: </span><span class=rvts8>É opcional e você pode usá-la para fornecer informações adicionais para construção do XML. Com o propósito de codificar valores e mapear os dados de cadeia de caracteres para XML</span><span class=rvts7>.</span></p><p class=rvps3><span class=rvts8>Não vou me aprofundar muito no EXPLICIT, pois o mesmo tem muitas informações. Uma boa leitura está </span><a class=rvts21 href="http://msdn.microsoft.com/pt-br/library/ms189068.aspx">aqui</a><span class=rvts8> para quem quiser ou precisar se aprofundar no assunto. Entretanto vamos ver alguns exemplos:</span></p><div class="codigo"><p><span class=rvts10> </span><span class=rvts9>SELECT</span><span class=rvts10> 1 </span><span class=rvts9>AS</span><span class=rvts10> TAG</span></p><p><span class=rvts10> </span><span class=rvts11>,NULL</span><span class=rvts10> </span><span class=rvts9>AS</span><span class=rvts10> PARENT</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuNome] </span><span class=rvts9>as</span><span class=rvts10> [Usuario!1!Nome!Element]</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuSobrenome] </span><span class=rvts9>as</span><span class=rvts10> [Usuario!1!Sobrenome!Element]</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuEmail] </span><span class=rvts9>as</span><span class=rvts10> [Usuario!1!Email!Element]</span></p><p><span class=rvts10> </span><span class=rvts9>FROM</span><span class=rvts10> [tbUsuarios]</span></p><p class=rvps3><span class=rvts10> </span><span class=rvts9>FOR</span><span class=rvts10> </span><span class=rvts9>XML</span><span class=rvts10> </span><span class=rvts9>EXPLICIT</span></p></div><br /><p class=rvps3><span class=rvts8>Resultado:</span></p><div class="codigo"><p><span class=rvts15><</span><span class=rvts16>Usuario</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>Adriano</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>adriano.galesso@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15></</span><span class=rvts16> Usuario</span><span class=rvts15> ></span></p><p><span class=rvts15><</span><span class=rvts16> Usuario</span><span class=rvts15> ></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>renata</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>renata@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15></</span><span class=rvts16> Usuario</span><span class=rvts15> ></span></p><p><span class=rvts15><</span><span class=rvts16> Usuario</span><span class=rvts15> ></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>Christiano</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>web@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15></</span><span class=rvts16> Usuario</span><span class=rvts15> ></span></p><p><span class=rvts15><</span><span class=rvts16> Usuario</span><span class=rvts15> ></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>suporte</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>suporte@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p class=rvps3><span class=rvts15></</span><span class=rvts16>Usuario</span><span class=rvts15> ></span></p></div><br /><p class=rvps3><span class=rvts8>Nota-se que obriguei todas as </span><span class=rvts12>TAG</span><span class=rvts8> serem 1 e todas as </span><span class=rvts12>PARENT </span><span class=rvts8>serem NULL, e Order é o nome do Elemento, 1 é o número da Tag (que só temos 1 mesmo), depois temos os nomes dos atributos e por fim digo que esses atributos são Elementos ( se não tivesse especificado isso, eles viriam em linha como se fosse o RAW).</span></p><p class=rvps3><span class=rvts8>Assim até que é fácil, mas e se quisermos fazer o que eu disse acima? Colocar o Sobrenome como elemento filho de Nome?</span></p><p class=rvps3><span class=rvts8>Temos uma tabela (retirada do site do MSDN) ela mostra como trabalha o TAG e o PARENT.</span></p><p class=rvps7><a rel="lightbox" href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/sxml1.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 81px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNI_lEcP3WtcKba5V4DtfriD9m_0dh06pmighyphenhyphenH68LT2tLzWaEfWL_afyv-hUJe8KFeJxVPkAXi_b8IAWPZUrgqmzL43Q89InepDwlqh1naYTqDUaihUqjj5SO5qZ0NOWXL7ZWftzW_Qw/s400/sxml1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5408198862973221890" /></a></p><p class=rvps3><span class=rvts8>Vendo assim parece simples, mas ficar manipulando essas duas colunas é bem complicado.</span></p><p class=rvps3><span class=rvts8>Então podemos usar o Campo chave para organizar meu XML:</span></p><div class="codigo"><p><span class=rvts10> </span><span class=rvts9>SELECT</span><span class=rvts10> 1 </span><span class=rvts9>AS</span><span class=rvts10> TAG</span></p><p><span class=rvts10> </span><span class=rvts11>,NULL</span><span class=rvts10> </span><span class=rvts9>AS</span><span class=rvts10> PARENT</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuCodigo] </span><span class=rvts11>*</span><span class=rvts10> 100 </span><span class=rvts9>AS</span><span class=rvts10> [Usuario!1!UsuCodigo]</span></p><p><span class=rvts10> </span><span class=rvts11>,NULL</span><span class=rvts10> </span><span class=rvts9>as</span><span class=rvts10> [Nome!2!Nome!Element]</span></p><p><span class=rvts10> </span><span class=rvts11>,NULL</span><span class=rvts10> </span><span class=rvts9>as</span><span class=rvts10> [Nome!2!Sobrenome!Element]</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuEmail] </span><span class=rvts9>as</span><span class=rvts10> [Usuario!1!Email!Element]</span></p><p><span class=rvts10> </span><span class=rvts9>FROM</span><span class=rvts10> [tbUsuarios]</span></p><p><span class=rvts10> </span><span class=rvts9>UNION</span></p><p><span class=rvts10> </span><span class=rvts9>SELECT</span><span class=rvts10> 2 </span><span class=rvts9>AS</span><span class=rvts10> TAG</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>1 </span><span class=rvts9>AS</span><span class=rvts10> PARENT</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuCodigo] </span><span class=rvts11>*</span><span class=rvts10> 100 </span><span class=rvts11>+</span><span class=rvts10> 1</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuNome]</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuSobrenome]</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuEmail]</span></p><p><span class=rvts10> </span><span class=rvts9>FROM</span><span class=rvts10> [tbUsuarios]</span></p><p><span class=rvts10> </span><span class=rvts9>ORDER</span><span class=rvts10> </span><span class=rvts9>BY</span><span class=rvts10> [Usuario!1!UsuCodigo]</span></p><p class=rvps3><span class=rvts10> </span><span class=rvts9>FOR</span><span class=rvts10> </span><span class=rvts9>XML</span><span class=rvts10> </span><span class=rvts9>EXPLICIT</span></p></div><br /><p class=rvps3><span class=rvts8>Resultado:</span></p><div class="codigo"><p><span class=rvts15><</span><span class=rvts16>Usuario</span><span class=rvts15> </span><span class=rvts17>UsuCodigo</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>21656000</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>renata @teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>renata</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15></</span><span class=rvts16>Usuario</span><span class=rvts15>></span></p><p><span class=rvts15><</span><span class=rvts16>Usuario</span><span class=rvts15> </span><span class=rvts17>UsuCodigo</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>21656200</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>renata@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>renata</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15></</span><span class=rvts16>Usuario</span><span class=rvts15>></span></p><p><span class=rvts15><</span><span class=rvts16>Usuario</span><span class=rvts15> </span><span class=rvts17>UsuCodigo</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>21656300</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>web@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>Christiano</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p class=rvps3><span class=rvts15></</span><span class=rvts16>Usuario</span><span class=rvts15>></span></p></div><br /><p class=rvps3><span class=rvts8>Agora nota-se muita coisa =)</span></p><p class=rvps3><span class=rvts8>Bom vemos que apareceu o UsuCodigo, ele vai ajudar a ordenação dos resultados</span><span class=rvts7>,</span><span class=rvts8> e mostro o porquê:</span></p><p class=rvps3 style="margin-left: 0; text-indent: 0px"><span class=rvts8>Sem ele os resultados viriam ordenados do 1º SELECT e depois os do 2º SELECT:</span></p><p class=rvps5><a rel="lightbox" href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/sxml2.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 154px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg69DowU95gp8fbeYmo_qGFJCkK8balZgKdZouSop4erOCZHtmas0KCBfFWcVXVB_A2qHCgBNrcgJdhozMorWLrdI1aB1RX44Q5yEs1YsfWa3KCy0_o7-aMct-ETxiTZz3g1E3qLBGnUDc/s400/sxml2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5408198949442920274" /></a></p><p class=rvps3 style="margin-left: 0; text-indent: 0px"><span class=rvts8>Com ele temos como organizar</span></p><p class=rvps5><a rel="lightbox" href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/sxml3.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 155px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1OWP5O-gt9rJq93xeaEF83l1P7DvsZJ_1Dl2ISIlg6zRrNxReaf7B-Q81fdJgBQuQCmDEVe0WLRhoGGYvbrTqsqtO_umaJQGVY802rLBghNK6-D9nb_f_7zZj5EKnIMJGiaKCcJwDpRY/s400/sxml4.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5408203204646041554" /></a></p><p class=rvps3><span class=rvts8>Por isso fazemos a utilização da coluna chave e nela fazemos uma determinada conta para os números próximos não se repetirem. </span></p><p class=rvps3><span class=rvts8>O outro SELECT está para trazer os resultados da TAG 2 e PARENT 1, porque queremos que o Nome seja um nó filho dentro do nó principal. Se precisássemos de outro nó, novamente teríamos que usar o SELECT.</span></p><p class=rvps3><span class=rvts8>Não termino o FOR XML EXPLICIT dizendo que é assim que funciona pois tem N maneiras e N atribuições que podemos fornecer ao mesmo. Mas garanto uma boa leitura no site da MSDN.</span></p><p class=rvps3><span class=rvts12>5 </span><span class=rvts14>–</span><span class=rvts12> OUTROS ARGUMENTOS DO FOR XML (AUTO, RAW e PATH apenas)</span></p><p class=rvps3><span class=rvts8>Podemos aplicar a diretiva ELEMENTS após o FOR XML, assim o XML será todo ajustado a base de elementos (os valores não serão mais atributos):</span></p><div class="codigo"><p><span class=rvts10> </span><span class=rvts9>SELECT</span><span class=rvts10> UsuariosGerais</span><span class=rvts11>.</span><span class=rvts10>[UsuNome] </span><span class=rvts9>AS</span><span class=rvts10> Nome</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>UsuariosGeraisIntro</span><span class=rvts11>.</span><span class=rvts10>[UsuSobrenome] </span><span class=rvts9>AS</span><span class=rvts10> Sobrenome</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>UsuariosGerais</span><span class=rvts11>.</span><span class=rvts10>[UsuEmail] </span><span class=rvts9>AS</span><span class=rvts10> Email</span></p><p><span class=rvts10> </span><span class=rvts9>FROM</span><span class=rvts10> [tbUsuarios] </span><span class=rvts9>AS</span><span class=rvts10> UsuariosGerais </span><span class=rvts11>INNER</span><span class=rvts10> </span><span class=rvts11>JOIN</span><span class=rvts10> </span></p><p><span class=rvts10> [tbUsuarios] </span><span class=rvts9>AS</span><span class=rvts10> UsuariosGeraisIntro </span></p><p><span class=rvts10> </span><span class=rvts9>ON</span><span class=rvts10> UsuariosGerais</span><span class=rvts11>.</span><span class=rvts10>UsuCodigo </span><span class=rvts11>=</span><span class=rvts10> UsuariosGeraisIntro</span><span class=rvts11>.</span><span class=rvts10>UsuCodigo</span></p><p class=rvps3><span class=rvts10> </span><span class=rvts9>FOR</span><span class=rvts10> </span><span class=rvts9>XML</span><span class=rvts10> </span><span class=rvts9>AUTO</span><span class=rvts11>,</span><span class=rvts10> </span><span class=rvts9>ELEMENTS</span></p></div><br /><p class=rvps3><span class=rvts8>Resultado:</span></p><div class="codigo"><p><span class=rvts15><</span><span class=rvts16>UsuariosGerais</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>Adriano</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>adriano.galesso@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>UsuariosGeraisIntro</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>UsuariosGeraisIntro</span><span class=rvts15>></span></p><p><span class=rvts15></</span><span class=rvts16>UsuariosGerais</span><span class=rvts15>></span></p><p><span class=rvts15><</span><span class=rvts16>UsuariosGerais</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>renata</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>renata@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>UsuariosGeraisIntro</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>barbosa</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>UsuariosGeraisIntro</span><span class=rvts15>></span></p><p><span class=rvts15></</span><span class=rvts16>UsuariosGerais</span><span class=rvts15>></span></p><p><span class=rvts15><</span><span class=rvts16>UsuariosGerais</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>Christiano</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>web@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>UsuariosGeraisIntro</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>UsuariosGeraisIntro</span><span class=rvts15>></span></p><p><span class=rvts15></</span><span class=rvts16>UsuariosGerais</span><span class=rvts15>></span></p><p><span class=rvts15><</span><span class=rvts16>UsuariosGerais</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>suporte</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>suporte@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>UsuariosGeraisIntro</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>UsuariosGeraisIntro</span><span class=rvts15>></span></p><p class=rvps3><span class=rvts15></</span><span class=rvts16>UsuariosGerais</span><span class=rvts15>></span></p></div><br /><p class=rvps3><span class=rvts8>Nota-se que está tudo como Tag e seus valores não estão mais como atributos, também nota-se o novo nó que se criou com a tabela “diferente”.</span></p><p class=rvps3><span class=rvts8>Outra diretiva que podemos aplicar é o ROOT</span><span class=rvts7>.</span><span class=rvts8> Com ela atribuímos um elemento pai ao elemento geral:</span></p><div class="codigo"><p><span class=rvts10> </span><span class=rvts9>SELECT</span><span class=rvts10> [UsuCodigo] </span><span class=rvts9>AS</span><span class=rvts10> </span><span class=rvts19>'@ID'</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuNome] </span><span class=rvts9>AS</span><span class=rvts10> </span><span class=rvts19>'Nome/Nome'</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuSobrenome] </span><span class=rvts9>AS</span><span class=rvts10> </span><span class=rvts19>'Nome/Sobrenome'</span></p><p><span class=rvts10> </span><span class=rvts11>,</span><span class=rvts10>[UsuEmail] </span><span class=rvts9>AS</span><span class=rvts10> </span><span class=rvts19>'Email'</span></p><p><span class=rvts10> </span><span class=rvts9>FROM</span><span class=rvts10> [tbUsuarios] </span><span class=rvts9>AS</span><span class=rvts10> Usuarios</span></p><p class=rvps3><span class=rvts10> </span><span class=rvts9>FOR</span><span class=rvts10> </span><span class=rvts9>XML</span><span class=rvts10> </span><span class=rvts9>PATH</span><span class=rvts11>(</span><span class=rvts19>'Usuarios'</span><span class=rvts11>),</span><span class=rvts10> </span><span class=rvts9>ROOT</span><span class=rvts11>(</span><span class=rvts19>'Teste'</span><span class=rvts11>)</span></p></div><br /><p class=rvps3><span class=rvts8>Resultado:</span></p><div class="codigo"><p><span class=rvts15> <</span><span class=rvts16>Usuarios</span><span class=rvts15> </span><span class=rvts17>ID</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>216562</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>renata</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>renata@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>Usuarios</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Usuarios</span><span class=rvts15> </span><span class=rvts17>ID</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>216562</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>renata</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>renata@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>Usuarios</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Usuarios</span><span class=rvts15> </span><span class=rvts17>ID</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>216563</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>Christiano</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>web@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>Usuarios</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Usuarios</span><span class=rvts15> </span><span class=rvts17>ID</span><span class=rvts15>=</span><span class=rvts18>"</span><span class=rvts15>216566</span><span class=rvts18>"</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Nome</span><span class=rvts15>></span><span class=rvts18>suporte</span><span class=rvts15></</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span><span class=rvts18>Teste</span><span class=rvts15></</span><span class=rvts16>Sobrenome</span><span class=rvts15>></span></p><p><span class=rvts15> </</span><span class=rvts16>Nome</span><span class=rvts15>></span></p><p><span class=rvts15> <</span><span class=rvts16>Email</span><span class=rvts15>></span><span class=rvts18>suporte@teste.com.br</span><span class=rvts15></</span><span class=rvts16>Email</span><span class=rvts15>></span></p><p class=rvps3><span class=rvts15> </</span><span class=rvts16>Usuarios</span><span class=rvts15>></span></p></div><br /><p class=rvps3><span class=rvts8>Temos outras diretivas como o TYPE, ELEMENTXSINIL, BINARY BASE64</span><span class=rvts7>,</span><span class=rvts8> XMLSCHEMA... Mas essas são mais avançadas, fogem do nosso artigo principal.</span></p><p class=rvps3><span class=rvts8>Bom, agora sabemos como gerar XMLs pelo SQL e formata-los da maneira que precisamos. </span></p><p class=rvps3><span class=rvts8>Mas para onde vai esse resultado?</span></p><p class=rvps3><span class=rvts8>Você pode gravar em uma coluna de uma tabela qualquer do tipo XML no SQL, ou pode mandar pro C# fazer alguma coisa. E é isso que vamos fazer, já que é este o cenário.</span></p><p class=rvps3><span class=rvts8>Vamos imaginar o projeto criado, e lá na nossa classe de dados temos os NAMESPACES:</span></p><div class="codigo"><p><span class=rvts9>using</span><span class=rvts10> System.Xml;</span></p><p class=rvps3><span class=rvts9>using</span><span class=rvts10> System.Xml.XPath;</span><br><span class=rvts9>using</span><span class=rvts10> System.Data.SqlClient;</span></p></div><br><p class=rvps3><span class=rvts8>Vamos ter os atributos:</span></p><div class="codigo"><p><span class=rvts9>#region</span><span class=rvts10> " Atributos "</span></p><p><span class=rvts10><br></span></p><p><span class=rvts9>private</span><span class=rvts10> </span><span class=rvts22>SqlConnection</span><span class=rvts10> oConn;</span></p><p><span class=rvts9>private</span><span class=rvts10> </span><span class=rvts22>SqlCommand</span><span class=rvts10> oCmd;</span></p><p><span class=rvts9>private</span><span class=rvts10> </span><span class=rvts22>XmlReader</span><span class=rvts10> xmlReader;</span></p><p><span class=rvts9>private</span><span class=rvts10> </span><span class=rvts22>XPathDocument</span><span class=rvts10> xpathDoc;</span></p><p><span class=rvts10><br></span></p><p class=rvps3><span class=rvts9>#endregion</span></p></div><br /><p class=rvps3><span class=rvts8>Um construtor:</span></p><div class="codigo"><p><span class=rvts9>#region</span><span class=rvts10> " Construtor "</span></p><p><span class=rvts10><br></span></p><p><span class=rvts9>public</span><span class=rvts10> MinhaClasse()</span></p><p><span class=rvts10>{</span></p><p><span class=rvts10> oConn = </span><span class=rvts9>new</span><span class=rvts10> </span><span class=rvts22>SqlConnection</span><span class=rvts10>(</span><span class=rvts22>ConfigurationManager</span><span class=rvts10>.AppSettings[</span><span class=rvts23>"MinhaConn"</span><span class=rvts10>]);</span></p><p class=rvps9><span class=rvts10>oConn.Open();</span></p><p><span class=rvts10> oCmd = oConn.CreateCommand();</span></p><p><span class=rvts10>}</span></p><p><span class=rvts10><br></span></p><p class=rvps3><span class=rvts9>#endregion</span></p></div><br /><p class=rvps3><span class=rvts8>E por fim, o meu método que retorna um XPathDocument:</span></p><div class="codigo"><p><span class=rvts9>#region</span><span class=rvts10> " Métodos "</span></p><p><span class=rvts10><br></span></p><p><span class=rvts9>protected</span><span class=rvts10> </span><span class=rvts9>internal</span><span class=rvts10> </span><span class=rvts22>XPathDocument</span><span class=rvts10> SalvarXML()</span></p><p><span class=rvts10>{</span></p><p class=rvps9><span class=rvts10> oCmd.CommandType = </span><span class=rvts22>CommandType</span><span class=rvts10>.StoredProcedure;</span></p><p><span class=rvts10> oCmd.CommandText = </span><span class=rvts23>"GerarXMLUsuarios”</span><span class=rvts10>;</span></p><p><span class=rvts10><br></span></p><p class=rvps9><span class=rvts9> try</span></p><p class=rvps9><span class=rvts10> {</span></p><p class=rvps10><span class=rvts10></span><span class=rvts10> xmlReader = oCmd.ExecuteXmlReader();</span></p><p class=rvps11><span class=rvts10> </span><span class=rvts10>xpathDoc = </span><span class=rvts9>new</span><span class=rvts10> </span><span class=rvts22>XPathDocument</span><span class=rvts10>(xmlReader, </span><span class=rvts22>XmlSpace</span><span class=rvts10>.Preserve);</span></p><p><span class=rvts10> }</span></p><p><span class=rvts10> </span><span class=rvts9>catch</span><span class=rvts10> (</span><span class=rvts22>Exception</span><span class=rvts10> ex)</span></p><p><span class=rvts10> {</span></p><p><span class=rvts10> </span><span class=rvts9>throw</span><span class=rvts10> </span><span class=rvts9>new</span><span class=rvts10> </span><span class=rvts22>Exception</span><span class=rvts10>(ex.ToString());</span></p><p><span class=rvts10> }</span></p><p><span class=rvts10> </span><span class=rvts9>finally</span></p><p><span class=rvts10> {</span></p><p><span class=rvts10> oConn.Close();</span></p><p><span class=rvts10> }</span></p><p><span class=rvts10><br></span></p><p><span class=rvts10> </span><span class=rvts9>return</span><span class=rvts10> xpathDoc;</span></p><p><span class=rvts10>}</span></p><p><span class=rvts10><br></span></p><p class=rvps3><span class=rvts9>#endregion</span></p></div><br /><p class=rvps3><span class=rvts8>Nada de novo até esse método. Chamamos a procedure e damos um ExecuteXMLReader.</span></p><p class=rvps3><span class=rvts8>O XmlReader fornece uma acesso somente leitura e somente para frente de um fluxo de dados Xml</span></p><p class=rvps3><span class=rvts8>O XPathDocument fornece representação em memória de um documento, também somente leitura e somente para frente de um Xml</span><span class=rvts7>.</span></p><p class=rvps3><span class=rvts8>Sabendo isso, temos um acesso ao XML gerado pela base, e uma representação em memória deste XML, preservando espaços.</span></p><p class=rvps3><span class=rvts8>Agora na nossa classe de negócios:</span></p><p class=rvps3><span class=rvts8>Temos os NAMESPACES:</span></p><div class="codigo"><p><span class=rvts9>using</span><span class=rvts10> System.Xml.XPath;</span></p><p class=rvps3><span class=rvts9>using</span><span class=rvts10> System.Xml;</span></p></div><br /><p class=rvps3><span class=rvts8>Temos atributos:</span></p><div class="codigo"><p class=rvps3><span class=rvts9>private</span><span class=rvts10> </span><span class=rvts9>string</span><span class=rvts10> diretorio = </span><span class=rvts22>ConfigurationManager</span><span class=rvts10>.AppSettings[</span><span class=rvts23>"Diretorio"</span><span class=rvts10>];</span><br><span class=rvts9>private</span><span class=rvts10> </span><span class=rvts9>string</span><span class=rvts10> URL = </span><span class=rvts22>ConfigurationManager</span><span class=rvts10>.AppSettings[</span><span class=rvts23>"URL"</span><span class=rvts10>];</span></p></div><br /><p><span class=rvts8>E temos um método que gera e salva um XML:</span></p><div class="codigo"><p><span class=rvts9>public</span><span class=rvts10> </span><span class=rvts9>string</span><span class=rvts10> GerarXML()</span></p><p><span class=rvts10>{</span></p><p><span class=rvts10> </span><span class=rvts9>string</span><span class=rvts10> arquivo = </span><span class=rvts23>"teste.xml"</span><span class=rvts10>;</span></p><p><span class=rvts10> </span><span class=rvts9>string</span><span class=rvts10> dirArq = diretorio + arquivo;</span></p><p><span class=rvts10><br></span></p><p><span class=rvts10> </span><span class=rvts22>TesteDAO</span><span class=rvts10> oTesteDao = </span><span class=rvts9>new</span><span class=rvts10> </span><span class=rvts22>TesteDAO</span><span class=rvts10> ();</span></p><p><span class=rvts10> </span><span class=rvts22>XPathDocument</span><span class=rvts10> oXPdoc = oTesteDao.ListarXML(tipoXML);</span></p><p><span class=rvts10> </span><span class=rvts22>XPathNavigator</span><span class=rvts10> oXPNav = oXPdoc.CreateNavigator();</span></p><p><span class=rvts10><br></span></p><p><span class=rvts10> </span><span class=rvts22>XmlTextWriter</span><span class=rvts10> Xwriter = </span><span class=rvts9>new</span><span class=rvts10> </span><span class=rvts22>XmlTextWriter</span><span class=rvts10>(dirArq, System.Text.</span><span class=rvts22>Encoding</span><span class=rvts10>.UTF8);</span></p><p><span class=rvts10> Xwriter.Formatting = </span><span class=rvts22>Formatting</span><span class=rvts10>.Indented;</span></p><p><span class=rvts10> Xwriter.Indentation = 3;</span></p><p><span class=rvts10> Xwriter.WriteStartDocument();</span></p><p><span class=rvts10> Xwriter.WriteNode(oXPNav, </span><span class=rvts9>true</span><span class=rvts10>);</span></p><p><span class=rvts10> Xwriter.WriteEndDocument();</span></p><p><span class=rvts10> Xwriter.Close();</span></p><p><span class=rvts10><br></span></p><p><span class=rvts10> </span><span class=rvts9>return</span><span class=rvts10> URL + arquivo;</span></p><p class=rvps3><span class=rvts10>}</span></p></div><br /><p class=rvps3><span class=rvts8>Nada de novo até esse método. Criamos um XPathDocument, que recebe o retorno do meu método na classe de acesso a dados vista acima. </span></p><p class=rvps3><span class=rvts8>Criamos um XPathNavigator que é uma classe abstrata, onde temos um modelo de cursor para navegar (como o próprio nome diz) em nosso XML.</span></p><p class=rvps3><span class=rvts8>Como não temos nada para editar no XML então vamos salvar o mesmo com o XmlTextWriter, onde passamos o caminho que queremos salvar e a codificação (no construtor). Depois podemos fornecer o tipo da formatação, indentação, começo e documento XML, nós (que nesse caso é o nosso XML inteiro), o fim do documento XML e fechamos o arquivo. Vamos ser bonzinhos e vamos retornar o caminho do XML em formato Web.</span></p><p class=rvps3><span class=rvts8>Pronto!</span></p><p class=rvps3><span class=rvts8>Fiz este artigo baseado em um problema real, o problema era bem parecido com o colocado aqui, mas não era 1 XML e sim 4, claro, não tem tantos usuários quanto o que eu falei, mas é um calculo baseado em possibilidades.</span></p><p class=rvps3><span class=rvts8>Esses 4 XMLs, atualmente com 25 MB somados, são gerados diariamente. </span></p><p class=rvps3><span class=rvts8>A 1º tentativa foi usando um framework e escrevendo os XML pelo C#</span><span class=rvts7>,</span><span class=rvts8> o servidor travava graças aos inúmeros acessos ao banco que o componente (framework) fazia. </span></p><p class=rvps3><span class=rvts8>A 2º tentativa foi criar procedures especificas que já traziam o resultado perfeito e no C# jogadas em objetos específicos também</span><span class=rvts7>,</span><span class=rvts8> os objetos eram listados e assim os XMLs eram escritos, não tinha estress, mas ainda demorava cerca de 30 minutos para gerar por completo.</span></p><p class=rvps3><span class=rvts8>A 3º tentativa esta da forma que eu falei neste artigo, uso o FOR XML PATH, trago pro C# e escrevo o arquivo.</span></p><p class=rvps3><span class=rvts8>Por isso este artigo está aqui. Gero 25 MB de arquivos XML em </span><span class=rvts12>28 SEGUNDOS</span><span class=rvts8>... Um lixo mesmo! hahahahahha</span></p><p class=rvps3><span class=rvts8>Até a próxima.</span></p></div>
<p><a href="http://www.linhadecodigo.com.br/Artigo.aspx?id=2659" target="_blank">Artigo publicado no Linha de Código</a></p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com2tag:blogger.com,1999:blog-8841982704991886486.post-27914534117601090382009-08-19T19:27:00.000-07:002009-09-29T06:00:23.402-07:00Visual Studio Debugger x IE 8<p>Olá pessoal,</p>
<p>Deixo este pequeno e rápido lixo apenas para matar algum possível problema de desenvolvedores que utilizam o VS 2005/03 com o Internet Explorer 8.<p>
<p>Bom, a pequena história é a seguinte.</p>
<p>Estavamos todos programando, quando chega um carinha do suporte avisando que, por ordens superiores, todos os PCs deveriam ser atualizados para IE 8, e que o IE 7 ficaria disponível em uma máquina virtual.</p>
<p>Maravilha, bacana.<p/>
<p>O problema começou quando resolvemos debugar um métodozinhu no projeto lá, colocavamos os breakpoints, porém quando rodava o projeto o IE 8 simplesmente ignorava, passava reto, nem ligava para os coitados do breakpoints.</p>
<p>Depois de muito mexer aqui, mexer de lá, troca options no VS, troca options no IE, nada de chamar os malditos breakpoints, achamos a sulução/erro/treta/lixo.</p>
<p>Simplemente o que ocorre, técnicamente, desculpe não sei explicar, mas o debugger só irá funcionar se não tivermos nenhuma janela do IE 8 préviamente aberta, ou seja, nada de janela aberta antes de iniciar o debug.</p>
<p>Ri muito quando achei o problema, já tinha gente com dedos no Regedit (tem um blog que fala que tem que mexer no Regedit).</p>
<p>Não sei se existe um solução melhor para isso, mas bom ou mal... é estranho.</p>
<p>Só isso... Até mais...</p>
<p style="color:red; text-align:center">-------------------------------------------------------------<br>Editado dia 28/09<br>-------------------------------------------------------------
</p>
<p>Pessoal, de acordo com o post do Anônimo temos sim como debuggar com prévias janelas do IE 8 aberta, e realmente é muito simples:</p>
<p><b>Anônimo</b>: Quando vc rodar o sistema realmente ele não vai cair no break, para cair vc tem que ir Debug - Attach to process e atachar o IIS virtual que foi criado (aquele do lado do relogio que aprece quando damos reun no VS)</p>
<p>Eu testei e consegui, apenas após de dar o attach no processo do WebDev.WebServer.exe precisamos dar um reload na página para cair no break!</p>
<p>Obrigado, Anônimo!</p>
<p>Abraços</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com3tag:blogger.com,1999:blog-8841982704991886486.post-71449377079364532192009-08-17T17:36:00.000-07:002010-06-24T11:13:21.436-07:00Upload/Leitura de Arquivos no C#<p>Antes de continuarmos falando de camadas e padrões, vamos fazer alguns uploads e ler alguns arquivos nos diretórios.</p>
<p>Para isso vamos basicamente fazer uma galeria de imagens.</p>
<p>Nossa galeria de imagens terá a seguinte forma:</p>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic4kJMOTXAAHpNKceWd6C13bjCfzQ6nnmbLBEGXZeORo4ifTGLvITPEC3pHKCN6hK2s2Lfbp145DLISDeMdavDWgelr0wNfPgOzZtWwJCg-SaQwYgweqH2GF_y4KlvsJpYukWUunU7BXU/s1600-h/up1.jpg"><img id="BLOGGER_PHOTO_ID_5371096997377484290" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 217px; TEXT-ALIGN: center" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic4kJMOTXAAHpNKceWd6C13bjCfzQ6nnmbLBEGXZeORo4ifTGLvITPEC3pHKCN6hK2s2Lfbp145DLISDeMdavDWgelr0wNfPgOzZtWwJCg-SaQwYgweqH2GF_y4KlvsJpYukWUunU7BXU/s400/up1.jpg" border="0" /></a>
<p>Onde teremos um objeto do tipo <b>File Upload</b>, um <b>Text Box</b> para darmos um nome para a imagem, um <b>Button</b> para enviar os dados, e um <b>Label</b> para mostrarmos as imagens.</p>
<p>Devemos importar:</p>
<p class='codigo'><span style="color: #0000FF">using</span> System.IO;
<span style="color: #0000FF">using</span> System.Text;</p>
<p>Nosso 1º passo será criar a ação do botão, que ficará da seguinte maneira:</p>
<p style="font-size: 12px" class='codigo'><span style="color: #0000FF">protected void</span> btnSalvar_Click(<span style="color: #0000FF">object</span> sender, <span style="color: #2B91AF">EventArgs</span> e)<br />
{<br />
<span style="color: #0000FF">if</span> (VerificaDadosArquivo(fuArquivos, txtNome.Text))<br />
{<br />
<span style="color: #0000FF">try</span><br />
{<br />
SalvarArquivos(fuArquivos, txtNome.Text);<br />
}<br />
<span style="color: #0000FF">catch</span>(<span style="color: #2B91AF">Exception</span> ex)<br />
{<br />
  ClientScript.RegisterStartupScript(<span style="color: #0000FF">typeof</span>(<span style="color: #0000FF">string</span>), <span style="color: #A31515">"Erro"</span>, "<span style="color: #A31515"><script>alert('</span>" + ex.Message + "<span style="color: #A31515">')</script>"</span>);<br />
}<br />
}<br />
}</p>
<p>Verificamos que temos dois métodos nessa chamada, o VerificaDadosArquivo que retorna um bool e o SalvarArquivo que é void.</p>
<p>O método VerificaDadosArquivo irá fazer a validação das informações enviadas e a validação dos arquivos que eu quero liberar para upload.</p>
<p style="font-size: 12px" class='codigo'><span style="color: #0000FF">private bool</span> VerificaDadosArquivo(<span style="color: #2B91AF">FileUpload</span> fuArquivos, <span style="color: #0000FF">string</span> nome)<br />
{<br />
<span style="color: #0000FF">if</span> (fuArquivos.PostedFile == <span style="color: #0000FF">null</span> || nome == <span style="color: #0000FF">string</span>.Empty)<br />
{<br />
ClientScript.RegisterStartupScript(<span style="color: #0000FF">typeof</span>(<span style="color: #0000FF">string</span>), <span style="color: #A31515">"Erro"</span>, <span style="color: #A31515">"<script>alert('Preencha todos os dados')</script>"</span>);<br />
<span style="color: #0000FF"> return false</span>;<br />
}<br />
<span style="color: #0000FF">if</span> (fuArquivos.PostedFile.ContentType.IndexOf(<span style="color: #A31515">"gif"</span>) < 0 && fuArquivos.PostedFile. ContentType.IndexOf(<span style="color: #A31515">"jpeg"</span>) < 0)<br />
{<br />
ClientScript.RegisterStartupScript(<span style="color: #0000FF">typeof</span>(<span style="color: #0000FF">string</span>),<span style="color: #A31515"> "Erro"</span>, "<span style="color: #A31515"><script>alert('Escolha imagens tipo .gif ou .jpg')</script></span>");<br />
<span style="color: #0000FF"> return false</span>;<br />
}<br />
<span style="color: #0000FF">return true</span>;<br />
}</p>
<p>Na 1º validação é verificado se o usuário digitou todos os dados, na 2º validação é verificado se o arquivos que o usuário quer enviar é do tipo “gif” ou “jpeg”, verificamos no ContentType pois é mais seguro que apenas verificar a extensão do arquivo, já que a mesma pode ser alterada.</p>
<p>Passado pelas nossas validações o arquivo é salvo:</p>
<p style="font-size: 12px" class='codigo'><span style="color: #0000FF">private void</span> SalvarArquivo(<span style="color: #2B91AF">FileUpload</span> fuArquivos, <span style="color: #0000FF">string</span> nome)<br />
{<br />
<span style="color: #0000FF">string</span> diretorio = <span style="color: #2B91AF">ConfigurationManager</span>.AppSettings[<span style="color: #A31515">"Diretorio"</span>];<br />
<span style="color: #2B91AF">DirectoryInfo</span> infoDir = <span style="color: #0000FF">new</span> <span style="color: #2B91AF">DirectoryInfo</span>(diretorio);<br /><br />
<span style="color: #0000FF">if</span> (!infoDir.Exists)<br />
{<br />
infoDir.Create();<br />
}<br /><br />
<span style="color: #2B91AF">FileInfo</span> infoFile = <span style="color: #0000FF">new</span> <span style="color: #2B91AF">FileInfo</span>(fuArquivos.PostedFile.FileName);<br />
fuArquivos.PostedFile.SaveAs(diretorio + nome + infoFile.Extension);<br /><br />
ListarImagensDiretorio();<br />
}</p>
<p>Neste método, falamos qual é o diretório que queremos salvar o arquivo, deixo na Web.Config para poder ser alterado a qualquer hora.</p>
<p>Depois disso, criamos uma variável do tipo DirectoryInfo para termos todas as informações do diretório que usaremos. Após, se ele não existir, é criado.</p>
<p>Outra variável é criada, uma variável do tipo FileInfo para agora termos as informações do arquivo que o usuário quer salvar.</p>
<p>Já sabemos que o arquivo é do tipo que queremos e está tudo certinho, então vamos salvar, no diretório criado, com o nome fornecido pelo usuário e a extensão correta.</p>
<p>Perfeito, o upload está pronto!</p>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdsuZDMPDV9pV9ZawcOfL_rWlO5vnaYfCYAgxKYDj7fptOAoeZ61CAOdFt8V-Ix4xnUYzQtEA9qQVihxyvai8a-0sN7Y0w4uHZqJ6cTbvhGRuokKDUF4nf2G_m1H8Wzco_lU0vLyMwt_0/s1600-h/up2.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 229px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdsuZDMPDV9pV9ZawcOfL_rWlO5vnaYfCYAgxKYDj7fptOAoeZ61CAOdFt8V-Ix4xnUYzQtEA9qQVihxyvai8a-0sN7Y0w4uHZqJ6cTbvhGRuokKDUF4nf2G_m1H8Wzco_lU0vLyMwt_0/s400/up2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5371860466904088338" /></a>
<p>Precisamos agora listar as nossas imagens. Abaixo do texto de listar imagens, vamos ajustar o Label que tinhamos colocado.</p>
<p>No PageLoad e no Método SalvarArquivo vamos chamar o método ListarImagensDiretorio (como visto acima, no fim do método de Salvar):</p>
<p style="font-size: 12px" class='codigo'><span style="color: #0000FF">protected void</span> Page_Load(<span style="color: #0000FF">object</span> sender, <span style="color: #2B91AF">EventArgs</span> e)<br />
{<br />
<span style="color: #0000FF">if</span> (!IsPostBack)<br />
{<br />
ListarImagensDiretorio();<br />
} <br />
} </p>
<p>O método é o seguinte:</p>
<p style="font-size: 12px" class='codigo'><span style="color: #0000FF">private void </span>ListarImagensDiretorio()<br />
{<br />
<span style="color: #0000FF">string</span> diretorio = <span style="color: #2B91AF">ConfigurationManager</span>.AppSettings[<span style="color: #A31515">"Diretorio"</span>];<br />
<span style="color: #0000FF">string</span> url = <span style="color: #2B91AF">ConfigurationManager</span>.AppSettings[<span style="color: #A31515">"URL"</span>];<br />
<span style="color: #2B91AF">StringBuilder</span> oSbImages = <span style="color: #0000FF">new</span> <span style="color: #2B91AF">StringBuilder</span>();<br />
<span style="color: #0000FF">bool</span> hasFiles = <span style="color: #0000FF">false</span>;<br />
<span style="color: #2B91AF">DirectoryInfo</span> oDirec = new <span style="color: #2B91AF">DirectoryInfo</span>(diretorio);<br /><br />
oSbImages.Append(<span style="color: #A31515">"<div style='width:500px'>"</span>);<br /><br />
<span style="color: #0000FF">foreach</span> (<span style="color: #2B91AF">FileInfo</span> oFile <span style="color: #0000FF">in</span> oDirec.GetFiles())<br />
{<br />
<span style="color: #0000FF">if</span> (oFile.Extension.Equals(<span style="color: #A31515">".gif"</span>) || oFile.Extension.Equals(<span style="color: #A31515">".jpg"</span>))<br />
{<br />
oSbImages.Append(<span style="color: #A31515">"<div class='imagens'>"</span>);<br />
oSbImages.Append(<span style="color: #A31515">" <a href='"</span> + url + oFile.Name + <span style="color: #A31515">"' target='_blank'>"</span>);<br />
oSbImages.Append(<span style="color: #A31515">" <img src='"</span> + url + oFile.Name + <span style="color: #A31515">"' width='85' height='52' border='0'><br>"</span>);<br />
oSbImages.Append(<span style="color: #A31515">" <span class='titulo'>"</span> + oFile.Name.Replace(oFile.Extension, <span style="color: #0000FF">string</span>.Empty) + <span style="color: #A31515">"</span>"</span>);<br />
oSbImages.Append(<span style="color: #A31515">" </a>"</span>); <br />
oSbImages.Append(<span style="color: #A31515">"</div>"</span>);
hasFiles = <span style="color: #0000FF">true</span>;<br />
}<br />
}<br /><br />
oSbImages.Append(<span style="color: #A31515">"</div>"</span>);<br /><br />
<span style="color: #0000FF">if</span> (hasFiles)<br />
{<br />
lblImagens.Text = oSbImages.ToString();<br />
}<br />
<span style="color: #0000FF">else</span><br />
{<br />
lblImagens.Text =<span style="color: #A31515"> "Nenhuma Imagem no Diretório."</span>;<br />
}<br />
}</p>
<p>Vamos navegar neste método.</p>
<p>Primeiramente temos as declarações das variáveis: "diretorio" (Podemos também fazer apenas um MapPath da variável "url") com o conteúdo da Web.Config, "url" que será o caminho virtual para a pasta, uma variável StringBuilder para criarmos a lista de imagens, um bool para checarmos se existem imagens, e, por fim, uma variável do tipo DirectoryInfo que possui as informações do diretório.</p>
<p><strong>OBS:</strong> Algumas dessas variáveis poderiam ser globais, mas como exemplificar assim fica mais fácil eu fiz dessa maneira.</p>
<p>Com minha StringBuilder eu crio umas frescurinhas para a apresentação das imagens.</p>
<p>No laço, para cada arquivo em meu diretório, se a extensão for .gif ou .jpg apresento a imagem. (Para não pegar arquivos como thumb.db)</p>
<p><strong>OBS:</strong> No método GetFiles, eu poderia ter colocado para pegar apenas os gifs desta maneira GetFiles(“.gif”), porém como precisaremos pegar todos os .gif e .jpg não poderemos usar esse esquema.</p>
<p>No final do método, se existir um arquivo apresento a StringBuilder se não apresenta a mensagem.</p>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGxkCMf-N_QbydtbMlZMw9S8-kSqYRbDmEntxwk8rleRl6xy08_ATxGhldO6-aPf7QFfzNNq1VuQSBlktUpQPCGGbr8tSmg_WOyan1LT10kL2yMx-4UDZJKFHBL4XuXh1fmYyItKEUVl8/s1600-h/up3.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 381px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGxkCMf-N_QbydtbMlZMw9S8-kSqYRbDmEntxwk8rleRl6xy08_ATxGhldO6-aPf7QFfzNNq1VuQSBlktUpQPCGGbr8tSmg_WOyan1LT10kL2yMx-4UDZJKFHBL4XuXh1fmYyItKEUVl8/s400/up3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5371862129716611826" /></a>
<p>Prontinho, rápido e sem dores... No caso sem odores já que jogamos no Lixo =)</p>
<p><a target="_blank" href="http://rapidshare.com/files/268210344/Upload.rar">Link para baixar o projeto.</a> Está pesado pois mando junto as imagens!</p>
<p>Abraços pessoal! Bons estudos...</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com1tag:blogger.com,1999:blog-8841982704991886486.post-15343970015470610972009-08-07T18:56:00.001-07:002009-08-23T19:18:22.967-07:00Programação em N Camadas - MVC - Padrões de Projeto – Parte 1<p>Depois de um tempinho sem lixo, e algumas cobranças de colegas programadores por novos posts (até minha namorada estava sedenta de atualizações por aqui =P). Gostaria de deletar algo sobre padrões de projetos e/ou criação de soluções OO.</p>
<p>Quem, como eu, já pesquisou sobre programação em camadas pela Web deve ter sentido a falta de informação coerente, pois parece que cada um acaba fazendo do seu jeito, criando nomes diferentes, utilizado frameworks para acertar no padrão e tendo uma visão diferente da necessidade de se programar em camadas.</p>
<p>Bom, jogo no lixo hoje o que entendo sobre padrão de projeto, o motivo de se programar assim e como fazer (na parte 2).</p>
<p><b>O MVC (Model-View-Controller) e as camadas</b></p>
<p>Quando aplicamos técnicas de programação orientada a objetos com padrões de desenvolvimento a escrita da linguagem pode se tornar uma ferramenta poderosa para a construção de produtos de software.</p>
<p>O MVC (Model-View-Controller) é um padrão e o C# é a nossa linguagem. Então temos nossas ferramentas para a criação do nosso produto.</p>
<p>E o que diz o MVC? </p>
<p>O MVC diz que, devido à complexidade de grandes aplicações, devemos separa nossas classes de nossos layouts. Assim, independentes, podem ser alterados sem se afetarem.</p>
<p>E como funciona esse padrão?</p>
<p>O MVC tem base a divisão em camadas. Camadas são projetos dentro de uma solução (não são pastas dentro de um projeto). Essas camadas do MVC são as seguintes:<p>
<a href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/camadas1.jpg" rel="lightbox"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 302px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigz8CXbzTG7pcRIQDiq2xfV39WlB4kwrerBNkw3jsTp6T-Y-pewriIk02pL4f1OjPdoHLiHebn__iVN388Wx9MDp4z9nY8ZtrOh44X4RD-IS8qDfhqES6D-GJKibkGLWOU3Jz2aMhgEQA/s320/mvc-rails.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5367408208579326610" /></a>
<p>Na imagem acima, no lado do servidor, temos 3 camadas, são elas:</p>
<ul><li>View: onde fica a interface do usuário, dados e informações desconhecidas, não tratadas, no caso de aplicações web, são os .aspx, .ascx...;</li>
<li>Controller: chamada classe de negócios, onde ficaram nossas regras, verificações, métodos de ação da aplicação e; </li>
<li>Model: muito discutida, pois, alguns dizem ser a camada de acesso a dados, outros dizem ser outra camada de negócios (Neste caso onde o Model é considerado outra camada de negócios, mais uma camada é criada, a camada de Persistência, onde no caso, faz acesso aos dados).</li></ul>
<p>A partir deste momento então conhecemos uma prática de padrão de projetos. Sabendo essa prática podemos partir para nossa forma de programação em camadas.</p>
<p><b>Porque usar camadas na aplicação? </b></p>
<p>Como vimos no MVC, podemos programar em 3 camadas, ou 4, ou em 5 se formos pensar bem, ou em uma só.</p>
<p>Sim, porque não programar em uma camada só, qual o problema disso?</p>
<p>Nenhum problema desde que você seja o único que vai programar, ou sua aplicação não vai crescer e se tornar um bicho papão.</p>
<p>As camadas ajudam na organização das informações, métodos, objetos, heranças, polimorfismo. Também permite varias mãos em uma só solução, onde vários programadores podem mandar bala em código independente de outro.</p>
<p>Outro ótimo ponto sobre a programação em camadas é que caso algum novo programador for adicionado ao projeto, se o mesmo conhecer pelo menos o MVC (e deve) ele vai ficar por dentro de toda a solução muito mais rapidamente.</p>
<p>Por fim também temos a questão da segurança, já que os níveis de acesso aos dados ficam bem longe das peripécias dos usuários.</p>
<p><b>E quais são essas camadas?</b></p>
<p>Podemos usar o MVC? Sim claro é ele o padrão. Mas podemos a partir dele criar o nosso padrão.</p>
<p>Adoro ver esses gráficos que encontramos pela web falando de camadas e tecnologias em geral, então fiz um gráfico explicativo com as camadas que particularmente gosto da fazer e já vi em muitos projetos.</p>
<a href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/camadas2.jpg" rel="lightbox"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 364px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOjYMye6XZmEWyzeuaEvW66deU5k_eZPYbslEjICsZDRg_TkgdPipUE1aCUK061TvFHMvh5fGA_V8rTxar4xXFXejK46sD2l3y-uE9XYKuPSFZq1_4QQYZ3BcN54nKyVxwt7wvCPwDcjA/s400/Camadas.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5367411622195539570" /></a>
<p>No gráfico acima “powered by A Lixeira do Dri” hehehehe, temos o modelo MVC com três camadas e adicionamos mais uma, a camada de informação.</p>
<p>Vamos entender melhor:</p>
<ul><li>Interface (projeto do tipo Web Application ou Windows Application): Camada de apresentação das informações aos usuários;</li>
<li>Info (projeto do tipo Class Library): Nesta camada vamos deixar todos nossos objetos (atributos, propriedades), enumeradores e estruturas;</li>
<li>Bussines Logic Layer (projeto do tipo Class Library): BLL, nossas regras de negócio, métodos poderosos que sabem de tudo, acessam a classe de dados e fazem acontecer;</li>
<li>Data Access Layer (projeto do tipo Class Library): DAO, classe que tem o poder de acessar dados de uma base. Super protegida e persistente.</li></ul><p>E seus acessos:</p>
<ul><li>A camada de interface acessa a camada de informação para criar/preencher objetos e a camada de negócios para realizar as regras;</li>
<li>A camada de negócios acessa a camada de informação para criar/preencher objetos e a camada de dados pra fazer requisições a base de dados;</li>
<li>A camada de dados tem acesso apenas a camada de informação para retornar objetos preenchidos ou receber parâmetros dos mesmos;</li>
<li>A camada de informação não acessa nada, já que a mesma é acessada por todos.</li></ul><p>Nossa solução com os 4 projetos fica dessa maneira:</p>
<a href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/camadas3.jpg" rel="lightbox"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 312px; height: 174px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigO40feB5PzkXdUVLK9Jg0aMIst5CnsRD7M0Dex2e6qCNJXeCqMIWY5y6Eg2uxRGVL1Qvdhp3_S8rRPrPT-j-fdjRmDx2-t1gCk-Ny6CDVkwKDjWf36r9tgGGH6RM-paLXDQDs2V6Sm8M/s320/projeto.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5367413646733555730" /></a>
<p>E como ficam as referências e as classes?</p>
<p>Isso vai ficar para a próxima parte, já que o importante desta parte 1 é entender os porquês e não por a mão na massa.</p>
<p>Até mais!</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com5tag:blogger.com,1999:blog-8841982704991886486.post-88184177157468462312009-07-09T05:35:00.000-07:002009-07-09T05:55:27.861-07:00Informação rápida sobre índices no MS SQL<p>Olá Pessoal.</p>
<p>Não querendo transformar esse blog de C# em um blog de SQL =P, mas achei um informação muito interessante e gostaria de deixar postado aqui.</p>
<p>A questão é a seguinte: <b>Qual o valor máximo de índices que podemos ter em uma tabela?</b>.</p>
<p>E a resposta para isso é...</p>
<p><b>No SQL 2005</b>: 1 clusterizado + 249 não clusterizado = 250 índices</p>
<p><b>No SQL 2008</b>: 1 clusterizado + 999 não clusterizado = 1000 índices</p>
<p>Não apenas isso, nos links abaixo poderemos encontrar as capacidades máximas de várias especificações do SQL, como quantidade máxima de Triggers, Conexões, quantidade máxima de tabelas em um SELECT, Locks por conexão, entre muitos outros.</p>
<p><a href="http://msdn.microsoft.com/en-us/library/ms143432(SQL.90).aspx" target="_blank">SQL 2005</a> | <a href="http://msdn.microsoft.com/en-us/library/ms143432.aspx" target="_blank">SQL 2008</a></p>
<p>Encontrei essa informação "Lixo" \o/ no ótimo blog do Guro do SQL, o Indiano Pinal Dave, o <a href="http://blog.sqlauthority.com/" target="_blank">SQL Authority</a>. Esse merece umas visitas semanais com certeza!</p>
<p>Até a próxima!</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com0tag:blogger.com,1999:blog-8841982704991886486.post-43868448517261707522009-05-23T09:27:00.000-07:002009-09-12T15:52:45.900-07:00DELETE com INNER JOIN<p>Olá pessoal.</p>
<p>Hoje quero jogar fora um mito no MS SQL Server, esse mito está relacionado à instrução DELETE.</p>
<p>Existe DELETE com INNER JOIN no MS SQL... Repito, no MS SQL???</p>
<p>Não... Ou melhor... Sim... Ou melhor... Bom, existe, mas acho que não funciona da maneira que gostaríamos que funcionasse hehe.</p>
<p>Vamos ao seguinte cenário.</p>
<a href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/sql1.gif" rel="lightbox"><img id="BLOGGER_PHOTO_ID_5339057945196116066" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 171px; TEXT-ALIGN: center" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxjiN6jWuMTZWS7kH8bzZkWHl5MmBPTRKg0kIXwNTWj81eJxuu6T2VQN5dDzociE96J-aChyphenhyphenKnbgOBEIf7vBMr2CDwehfi24rVHSAnf8wFiy1QxiqalLxfZ8bCPiX_4NhwVhl4OjoHIGc/s320/sql1.gif" border="0" /></a>
<p>Temos uma tabela de usuários e uma tabela que faz a relação do usuário com as empresas. Uma relação N pra N normalizada onde um usuário pode ter relação com N empresas e uma empresa pode estar relacionada com N usuários.</p>
<p>Eu quero deletar o usuário 1 da tabela MailerUsuario.</p>
<p class='codigo'><span style="font-family:courier new;"><span style="color:#000099;">DELETE FROM</span> MailerUsuarios <span style="color:#000099;">WHERE</span> UserId = 1</span></p>
<p>Ops… Isso não é possível</p>
<p class='codigo'><span style="font-family:courier new;color:#cc0000;">A instrução DELETE conflitou com a restrição do REFERENCE "FK_MailerUserEmpresa_MailerUsuarios".<br> O conflito ocorreu no banco de dados "Mailer", tabela "dbo.MailerUserEmpresa", coluna 'UserId'.
A instrução foi finalizada.</span></p>
<p>Isso estava previsto. Não podemos deletar um usuário que tem referencia em uma outra tabela. Mas como vamos deletar esse usuário?</p>
<p>“Oras Bolas”, vamos juntar as tabelas e mandar pau nelas =)</p>
<p class='codigo'><span style="font-family:courier new;"><span style="color:#000099;">DELETE FROM</span> MailerUserEmpresa MUE <span style="color:#666666;">INNER JOIN </span>
MailerUsuarios MU <span style="color:#000099;">ON</span> MUE.UserId = MU.UserId
<span style="color:#000099;">WHERE</span> MUE.UserId = 1</span></p>
<p>É... Assim não funciona =(, Ahhhh!!! vamos tentar igual no MY SQL</p>
<p class='codigo'><span style="font-family:courier new;"><span style="color:#000099;">DELETE</span> MailerUserEmpresa, MailerUsuarios
<span style="color:#000099;">FROM</span> MailerUserEmpresa MUE <span style="color:#666666;">INNER JOIN</span>
MailerUsuarios MU <span style="color:#000099;">ON</span> MUE.UserId = MU.UserId
<span style="color:#000099;">WHERE</span> MUE.UserId = 1</span></p>
<p>#@$=(!%, também não funcionou… Devo estar digitando alguma coisa errada… Mas o que??? Vou deixar só uma tabela antes do FROM.</p>
<p class='codigo'><span style="font-family:courier new;"><span style="color:#000099;">DELETE</span> MailerUserEmpresa
<span style="color:#000099;">FROM</span> MailerUserEmpresa MUE <span style="color:#666666;">INNER JOIN</span>
MailerUsuarios MU ON MUE.UserId = MU.UserId
<span style="color:#000099;">WHERE</span> MUE.UserId = 1
(4 linha(s) afetadas)</span></p>
<p>Eeeeeee funcionou!!! Mas será que deletou mesmo???</p>
<p>Sim, mas não como eu gostaria...</p>
<p>A instrução DELETE não consegue deletar registros em tabelas diferentes ao mesmo tempo no MS SQL. A minha instrução com INNER JOIN funcionou, mas o que ela fez foi deletar da tabela MailerUserEmpresa os registros 1 que também existiam na tabela MailerUser.</p>
<p>Se não tivessemos colocado o WHERE, teria deletado todos os registros que existiam ligação entre uma tabela e outra... Neste caso deletaria todos, mas em outros casos, de 3 ou mais tabelas, seria até bem utilizavél.</p>
<p>Mas e agora, como vou deletar os meus registros das duas tabelas???</p>
<p>Muito simples, basta deletar primeiro as de chave estrangeira e depois as de chave primária.</p>
<p class='codigo'><span style="font-family:courier new;"><span style="color:#000099;">DELETE FROM</span> MailerUserEmpresa <span style="color:#000099;">WHERE</span> UserId = 1</span></p>
<p class='codigo'><span style="font-family:courier new;"><span style="color:#000099;">DELETE FROM</span> MailerUsuario <span style="color:#000099;">WHERE</span> UserId = 1</span></p>
<p>É realmete, isso é um lixo huahuahuahua deveria estar aqui mesmo!</p>
<p>Até a próxima.</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com6tag:blogger.com,1999:blog-8841982704991886486.post-87752508922917843002009-05-04T17:50:00.000-07:002010-06-24T11:17:37.869-07:00Validações de Dados no C#<p>Frequentemente precisamos fazer validações em dados providos de usuários. Geralmente essas validações são por meio de linguagens <strong>client script </strong>como o JavaScript.</p>
<p>Porém, e se quisermos fazer essas validações no C#, deixando o trabalho para o servidor? Como saber se o dado de input do usuário é do tipo que esperamos? <p>
<p>Podemos, para solucionar essas questões, utilizar o método TryParse dos tipos de dados. Esse método existe na maioria dos tipos de dados nativos do C#.</p>
<p>Esse método, como o próprio nome já diz, tenta dar um Parse em uma string para o valor a qual o método é chamado. Se o Parse for realizado com sucesso ele retorna o valor para uma variável do mesmo tipo.</p>
<p>Vamos criar um método para verificar se meu tipo de dado realmente é um inteiro:</p>
<p class='codigo'><span style="color:#000099;">public bool</span> IsInteiro(<span style="color:#000099;">string</span> Valor, <span style="color:#000099;">out int</span> Resultado)<br />
{<br />
<span style="color:#000099;"> return int</span>.TryParse(Valor, <span style="color:#000099;">out</span> Resultado);<br />
}</p>
<p>O Método fica muito simples, recebe o valor que será testado e outro valor que será a saída, caso o resultado for um realmente um inteiro.</p>
<p>Para testar, no nosso Page Load vamos fazer a validação:</p>
<p class='codigo'><span style="color:#000099;"><span style="color:#000099;">protected</span> void</span> Page_Load(<span style="color:#000099;">object</span> sender, <span style="color:#339999;">EventArgs</span> e)<br />
{<br />
<span style="color:#000099;"> int</span> numI;<br /><br />
Response.Write((IsInteiro<span style="color:#000000;">(</span><span style="color:#990000;">"5"</span>, <span style="color:#000099;">out</span> numI)) ? numI.ToString() : <span style="color:#990000;">"Não é um Inteiro"</span>);<br />
}</p>
<p>Neste caso, seria exibido o número 5 normalmente. Se alterarmos o “5” para “5aa” seria exibido a mensagem “Não é um Inteiro”.</p>
<p>Poderíamos validar, como disse antes, outros tipos de dados, como o DateTime por exemplo:</p>
<p class='codigo'><span style="color:#000099;">public bool</span> IsData(<span style="color:#000099;">string</span> Valor, <span style="color:#000099;">out</span> <span style="color:#336666;">DateTime</span> DataResult)<br />
{<br />
return <span style="color:#336666;">DateTime</span>.TryParse(Valor, <span style="color:#000099;">out</span> DataResult);<br />
}</p>
<p>Assim, aprimorando nossa validação:</p>
<p class='codigo'><span style="color:#000099;">protected void</span> Page_Load(<span style="color:#000099;">object</span> sender, <span style="color:#336666;">EventArgs</span> e)<br />
{<br />
<span style="color:#000099;"> int</span> numI;<br />
<span style="color:#336666;"> DateTime</span> data;<br /><br />
Response.Write((IsInteiro(<span style="color:#990000;">"5"</span>, <span style="color:#000099;">out</span> numI)) ? numI.ToString() : <span style="color:#990000;">"Não é um Inteiro"</span>);<br />
Response.Write((IsData(<span style="color:#990000;">"30/02/2009"</span><span style="color:#000000;">, </span><span style="color:#000099;">out</span> data)) ? data.ToString() : <span style="color:#990000;">"Não é um Data valida"</span>);<br />
}</p>
<p>Onde, neste caso, seria exibida a mensagem "Não é um Data valida".</p>
<p>Conclui-se que podemos fazer verificações de dados em qualquer linguagem, e no C# não é diferente, basta o desenvolvedor ver qual ação apropriada para seu projeto e utilizá-la do modo mais simples e reutilizável possível.</p>
<p>Abraços, até a próxima!</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com0tag:blogger.com,1999:blog-8841982704991886486.post-29262074744832750242009-03-30T16:54:00.000-07:002010-06-24T11:37:50.317-07:00Tempo de Estudo...Pessoal,
<br /><br />
Desculpe a falta de lixo neste blog! Estou estudando para tirar a certifição da Microsoft (70-315
Developing and Implementing Web Applications with Microsoft Visual C# .NET and Microsoft Visual Studio .NET).
<br /><br />
Amanhã é o último dia para eu tentar =).
<br /><br />
Espero também meu novo Notebook!!! Este meu está um "Lixo" hauhauhauhahuauhahua
<br /><br />
Abaixo, falando em certificações, deixo o link das que serão descontinuadas amanhã!
<br /><br />
<a target="_blank" href="http://www.microsoft.com/learning/mcpexams/status/examstoretire.mspx">http://www.microsoft.com/learning/mcpexams/status/examstoretire.mspx</a>
<br /><br />
Abraços! E até logo....Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com1tag:blogger.com,1999:blog-8841982704991886486.post-12898216928105060732009-03-01T06:44:00.000-08:002010-06-24T11:44:25.165-07:00Um pouco sobre Style (CSS)<p>Estes dias estava na minha empresa programando e tal. Olhei para o a baia ao lado e tinha 3 caras na mesma máquina olhando e tentando...</p>
<p>O que será que eles estavam olhando? Será aquele método que faz milagre em C#? Ou será aquela procedure imensa criada pelo DBA doidão?... Nada disso, eles estavam tentando arrumar o CSS do site em Tableless.</p>
<p>É fato que programador (C#, Java, ...) odeia CSS, não sei o motivo, particularmente gosto bastante, mas vejo que isso acaba sendo um problema grande dentro de um projeto Web de prazo curto.</p>
<p>Bom, para ajudar a questão, hoje vamos deleter esse tal de CSS (Tableless).</p>
<p><b>O que é CSS e Tableless</b></p>
<p>CSS é uma linguagem para estilizar o HTML e também o XML. Para isso, é criado um arquivo .css e feita a ligação entre a página e este arquivo.</p>
<p>o Tableless, é uma forma de desenvolver os sites sem a utilização de tabelas na sua estrutura, como vi uma vez: "Defender o HTML para seu propósito, tabelas foram criadas para mostrar dados de forma tabular". Para saber mais sobre o Tableless segue uma lista de site muito bons: <a href="http://www.tableless.com.br/" target="_blank">Tableless</a>, <a href="http://w3c.br/" target="_blank">w3c</a>, <a href="http://maujor.com/index.php" target="_blank">Maujor</a>.</p>
<p>Uma pena que ainda usamos navegadores antigos como o <a href="http://ripie6.com/" target="_blank">Internet Explorer 6</a>, é como "andar para trás" quando falamos nas tecnologias em questão.</p>
<p><b>As propriedades do CSS</b></p>
<p>Não quero aqui explicar todas as propriedades do CSS, mas as mais importantes quanto a questão de layout.</p>
<h2 style="FONT-SIZE: 16px; COLOR: #339933">Float / Clear</h2><p>A propriedade float, posiciona o elemento, podendo este ir apenas para esquerda ou para direita.Vejamos o exemplo: </p><p>
<span style="color:#ffccff;"><span style="color:#ff99ff;">div.topleft<br />
{</span><br />
</span><span style="color:#333399;"> border</span><span style="color:#ff99ff;">:</span><span style="color:#3366ff;">1px solid #000000</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#333399;"> width</span><span style="color:#ff99ff;">:</span><span style="color:#3366ff;">150px</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#333399;"> float</span><span style="color:#ff99ff;">:</span><span style="color:#3366ff;">left</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#333399;"> background-color</span><span style="color:#ff99ff;">:</span><span style="color:#3366ff;">#0099FF</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#ff99ff;">}<br /><br />
div.topright<br />
{<br />
</span><span style="color:#333399;"> border</span><span style="color:#ff99ff;">:</span><span style="color:#3366ff;">1px solid #000000</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#000099;"> width</span>:<span style="color:#3333ff;">150px</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#333399;"> float</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">right</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#333399;"> background-color</span><span style="color:#3333ff;"><span style="color:#ff99ff;">:</span>#0099FF</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#ff99ff;">}</span> </p>
<p>Agora crio as divs no meu HTML, e coloco a class="meuelementocss", <a href="http://www.morcegosweb.com/morcegos/arquivos/css/float1.html" target="_blank">Veja como fica</a>.</p>
<p>Nota-se que as divs ficaram posicionadas de acordo com o Float. Se não tivesse especificado a propriedade float para elas ficariam uma embaixo da outra. Se colocasse duas divs com float:left ficariam <a href="http://www.morcegosweb.com/morcegos/arquivos/css/float2.html" target="_blank">uma após a outra</a>.</p>
<p>Agora quero criar uma div abaixo das que havia criado.</p>
<p>Criamos a div rodape e estilizamos.</p><p>
<span style="color:#ff99ff;">div.rodape<br />
{<br />
</span><span style="color:#333399;"> border</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">1px solid #000000</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#000099;"> background-color</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">#00FFCC</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#ff99ff;">}</span>
</p>
<p>A propriedade float, deixa as divs acima do plano de fundo normal, como se estivessem flutuando sobre todas as outras, com isso a nossa nova div criada ficaria abaixo das que estão flutuando. </p>
<p><a href="http://www.morcegosweb.com/morcegos/arquivos/css/float3.html" target="_blank">Veja como fica</a>.</p>
<p>Para não deixar sobrepor as divs com float, nossa nova div rodape precisa da propriedade clear.</p>
<p>A propriedade clear pode ter os seguintes valores:</p>
<p><b>left</b> - Não flutuar sobre as divs com float:left;
<b>right</b> - Não flutuar sobre as divs com float:right e;
<b>both</b> - Não flutuar sobre nenhuma div. </p>
<p>Adicionado a classe rodape:</p><p>
<span style="color:#ff99ff;">div.rodape<br />
{<br />
</span><span style="color:#333399;"> clear</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">both</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#333399;"> border</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">1px solid #000000</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#000099;"> background-color</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">#00FFCC</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#ff99ff;">}</span>
</p>
<p><a href="http://www.morcegosweb.com/morcegos/arquivos/css/float4.html" target="_blank">Veja como fica</a>.</p>
<h2 style="FONT-SIZE: 16px; COLOR: #339933">Overflow</h2><p>A propriedade Overflow define o que irá acontecer caso o conteúdo de um elemento <a href="http://www.morcegosweb.com/morcegos/arquivos/css/overflow1.html" target="_blank">ultrapasse seu tamanho</a>.</p><p><span style="color:#ff99ff;">
div.myoverflowhid<br />
{</span><br />
<span style="color:#333399;"> background-color</span><span style="color:#3333ff;">:#FFFFCC</span><span style="color:#ff99ff;">;<br />
</span><span style="color:#333399;"> border</span>:<span style="color:#3333ff;">1px solid #000000</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#333399;"> height</span>:<span style="color:#3333ff;">150px</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#333399;"> overflow</span>:<span style="color:#3333ff;">hidden</span><span style="color:#ff99ff;">;<br />
}</span></p>
<p>Ela pode ter os seguintes valores:</p>
<p><b>hidden</b> - Esconde o conteúdo que ultrapassa, porém é possível copia-lo;
<b>scroll</b> - Cria scroll horizontal e vertical na div e;
<b>auto</b> - Verifica a necessidade de scroll, se há ele coloca. </p>
<p><a href="http://www.morcegosweb.com/morcegos/arquivos/css/overflow2.html" target="_blank">Veja como ficam todos</a>.</p>
<h2 style="FONT-SIZE: 16px; COLOR: #339933">Position</h2><p>A propriedade Position, como o próprio nome diz, define o posicionamento do elemento na página, diferente do float, para qualquer lado e com tipos de posicionamentos diferentes.</p><p>
<span style="color:#ff99ff;">div.positionarea<br />
{<br />
</span><span style="color:#333399;"> height</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">400px</span><span style="color:#ff99ff;">;<br />
</span><span style="color:#333399;"> background-color</span><span style="color:#3333ff;"><span style="color:#ff99ff;">:</span>#CCFFFF</span><span style="color:#ff99ff;">;<br />
} </span></p><p>
<span style="color:#ff99ff;"> div.positionarea div.positionrelative<br />
{</span><br />
<span style="color:#333399;"> background-color</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">#CCCCCC</span><span style="color:#ff99ff;">;<br />
</span><span style="color:#333399;"> border</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">1px solid</span> <span style="color:#3333ff;">#000000</span><span style="color:#ff99ff;">;<br />
</span><span style="color:#333399;"> position</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">relative</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#333399;"> left</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">30px</span><span style="color:#ff99ff;">;<br />
</span><span style="color:#333399;"> top</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">100px</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#333399;"> width</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">400px</span><span style="color:#ff99ff;">;<br />
}</span>
<br /><br />
<span style="color:#ff99ff;"> div.positionarea div.positionrelative p<br />
{<br />
</span><span style="color:#333399;"> color</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">#CC0000</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#ff99ff;"> }<br /><br />
</span>
<span style="color:#ff99ff;"> div.positionarea div.positionabsolute<br />
{<br />
</span><span style="color:#333399;"> background-color</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">#CCCCCC</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#333399;"> border</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">1px solid #000000</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#333399;"> position</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">absolute</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#333399;"> left</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">30px</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#333399;"> top</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">100px</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#333399;"> width</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">400px</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#ff99ff;"> }
<br /><br />
div.positionarea div.positionabsolute p<br />
{</span><br />
<span style="color:#333399;"> color</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">#006600</span><span style="color:#ff99ff;">;<br />
</span><span style="color:#ff99ff;"> }
<br /><br />
div.positionarea div.positionfixed<br />
{<br />
</span><span style="color:#333399;"> background-color</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">#CCCCCC</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#333399;"> border</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">1px solid #000000</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#333399;"> position</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">fixed</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#333399;"> left</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">30px</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#333399;"> top</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">80px</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#333399;"> width</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">400px</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#ff99ff;"> }
<br /><br />
div.positionarea div.positionfixed p<br />
{<br />
</span><span style="color:#333399;"> color</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">#CC33FF</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#ff99ff;"> }
<br /><br />
div.positionarea div.positionstatic<br />
{<br />
</span><span style="color:#333399;"> background-color</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">#CCCCCC</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#333399;"> border</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">1px solid #000000</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#333399;"> position</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">static</span><span style="color:#ff99ff;">; </span><br />
<span style="color:#333399;"> width</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">400px</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#ff99ff;"> }
<br /><br />
div.positionarea div.positionstatic p<br />
{</span><br />
<span style="color:#333399;"> color</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">#000000</span><span style="color:#ff99ff;">;<br />
}
</span></p>
<p>Acima 4 divs foram estilizadas, uma para cada tipo de position, também foi passado, todos os estilos das tags parágrafo de cada div. Muito importante pois consigo alterar o estilo apenas de 1 pequeno elemento de uma div, assim ele perde uma possivél <a href="http://imasters.uol.com.br/artigo/4699/css/compreendendo_a_heranca_nas_css/" target="_blank">herança</a>.</p>
<p>Position pode ter os seguintes valores:</p>
<p><b>static</b> - posicionamento comum de todos os elementos, ou seja, não precisa declarar. Ele ignora qualquer valor para top, left, right ou bottom;
<b>relative</b> - pega o elemento em sua posição normal, e ativa os valores top, left, right ou bottom;
<b>absolute</b> - pega o elemento em sua posição absoluta, ou seja, como se fosse o 1º elemento após a tag body e aplica os valores top, left, right ou bottom e;
<b>fixed</b> - fixa um valor top, left, right ou bottom de acordo com parte visível do browser. Ou seja, mesmo com scroll o elemento ficará fixo.</p>
<p><a href="http://www.morcegosweb.com/morcegos/arquivos/css/position1.html" target="_blank">Veja como ficam todos</a>.</p>
<h2 style="FONT-SIZE: 16px; COLOR: #339933">!important</h2><p>!important não é uma propriedade e sim uma regra. Esta regra funciona da seguinte maneira, se em um CSS muito grande houver conflitos de declarações, sobrescreve-se a que está com a regra.</p><p>
<span style="color:#ff99ff;">div.important h2<br />
{<br />
</span><span style="color:#333399;"> color</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">#0000FF</span> <span style="color:#ff0000;">!important</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#333399;"> text-align</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">center</span><span style="color:#ff99ff;">;<br />
} </span>
<br /><br />
<span style="color:#ff99ff;">div.important h2<br />
{<br />
</span><span style="color:#333399;"> color</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">#CCCCCC</span><span style="color:#ff99ff;">;<br />
}
</span></p>
<p>No caso acima o h2 da div important teve duas declarações, a última é a que vale de acordo com o processamento do documento, porém como a propriedade color está com a regra !important ela é a valida, outra coisa é que todas as propriedades que existem em uma e não existem na outra são válidas, neste exemplo a propriedade text-align. </p>
<p><a href="http://www.morcegosweb.com/morcegos/arquivos/css/important1.html" target="_blank">Veja como fica</a>.</p>
<h2 style="FONT-SIZE: 16px; COLOR: #339933">Hacks</h2><p>Bom, para finalizar um pouco de gambiarra =P. Bricadeira, infelizmente nem todos os navegadores se comportam da mesma maneira, sendo assim nos obriga a tomar decisões mais rápidas. Os hacks de CSS, utilizados com moderação e consciência, ajudam muito a resolver esse problema de guerra de navegadores.</p><p>
<span style="color:#ff99ff;">body<br />
{</span><br />
<span style="color:#333399;"> margin</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">0</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#333399;"> padding</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">0</span><span style="color:#ff99ff;">;</span><br />
<span style="color:#333399;"> background-color</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">#999999</span><span style="color:#ff99ff;">; </span><span style="color:#999999;">/*Firefox*/<br />
</span><span style="color:#333399;"> *background-color</span><span style="color:#3333ff;">:#FFFFFF</span><span style="color:#ff99ff;">;</span> <span style="color:#999999;">/*IE 7*/<br />
</span><span style="color:#333399;"> _background-color</span><span style="color:#ff99ff;">:</span><span style="color:#3333ff;">#000000</span><span style="color:#ff99ff;">;</span> <span style="color:#999999;">/*IE 6*/<br />
</span><span style="color:#ff99ff;">}
</span></p>
<p>No exemplo acima temos 3 declarações para a propriedade background-color. Sem nada na frente usaremos para o Firefox, o asterisco para o Internet Explorer 7 e o underline para o malvado Internet Explorer 6.</p>
<p><a href="http://www.morcegosweb.com/morcegos/arquivos/css/hacks1.html" target="_blank">Teste o Exemplo</a>.</p>
<p>Isso é tudo por hoje. Lixeira cheia e nossa página ficou "Linda" =)! Mas queria deixar uma frase, quando estava fazendo o curso de SQL, tinha um Design muito conceituado, quando um aluno falou que odiava CSS/Tableless (no curso de SQL teve esse papo!) porque era fácil e perda de tempo ele disse:</p>
<p>"O fácil e o chato é o que vai fazer a diferença no final do seu projeto. Não subestime o que é fácil em TI."</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com2tag:blogger.com,1999:blog-8841982704991886486.post-47611761436227182572009-02-04T16:02:00.000-08:002010-06-24T12:00:31.531-07:00Tudo sobre o RAISERROR<p>Olá pessoal,</p>
<p>Vocês já ouviram falar no RAISERROR?</p>
<p>Hoje, jogando fora algo de SQL, vamos falar dessa função.</p>
<p>O RAISERROR retorna uma mensagem, assim como a função PRINT, aos aplicativos. Porém, em forma de erro, ou seja, como uma Exception só que gerada pelo SQL.</p>
<p>Essa função pode ser usada para várias finalidades como: verificar problemas no código T-SQL, mostrar textos com variáveis ou fazer que, quando estiver num bloco TRY, a execução pule para o bloco CATCH.</p>
<p>A construção de uma função do RAISERROR é a seguinte:</p>
<p><strong>ERRO:</strong></p>
<p>Texto definido pelo usuário, número do erro definido pelo usuário (acima de 50.000 pela procedure sp_addmessage) ou uma variável do tipo CHAR ou VARCHAR.</p>
<p><strong>GRAVIDADE:</strong></p>
<p>Indica uma faixa de gravidade, que sobrepõe a definida usando o sp_addmessage.</p>
<p><strong>ESTADO:</strong></p>
<p>Utilizado para ajuda o usuário a encontrar onde o código está gerando erros. (Raramente vejo algo diferente de 1).</p>
<p><strong>ARGUMENTOS:</strong></p>
<p>Textos, variáveis a serem adicionados na mensagem de Erro.</p>
<p>Vamos aos Testes...</p>
<p style="font-family:Courier New; font-size:12px"><span style="color: #0000FF">RAISERROR</span>(<span style="color: #FF0000">'Você gerou um Erro'</span>, 16, 1)</p>
<p>Erro simples... Agora vamos ver sendo utilizado em uma procedure, vamos inserir um usuário, porém, se ele já existir na base, deve-se retornar um erro.</p>
<p style="font-family:Courier New; font-size:12px"><span style="color: #0000FF">CREATE PROCEDURE</span> [dbo].[Usuario_Inserir]<br />
@Nome <span style="color: #0000FF">VARCHAR</span>(100)<br />
@Email <span style="color: #0000FF">VARCHAR</span>(100)<br />
<span style="color: #0000FF">AS<br />
BEGIN</span><br />
<span style="color: #0000FF">IF</span> <span style="color: #666666">NOT EXISTS</span> (<span style="color: #0000FF">SELECT</span> Email <span style="color: #0000FF">FROM</span> Usuarios <span style="color: #0000FF">WHERE</span> Email = @Email)<br />
<span style="color: #0000FF">BEGIN<br />
INSERT INTO</span> [dbo].[Usuarios]<br />
([Nome]<br />
,[Email])<br />
<span style="color: #0000FF">VALUES</span><br />
(@Nome<br />
,@Email)<br />
<span style="color: #0000FF"> END<br />
ELSE<br />
BEGIN</span><br />
<span style="color: #0000FF">RAISERROR</span>(<span style="color: #FF0000">'Usuário já cadastrado'</span>, 16, 1)<br />
<span style="color: #0000FF">END<br />
END</span></p>
<p>Se estivéssemos criando uma aplicação .Net e tentássemos usar a procedure dentro de um TRY...CATCH... e caísse no RAISERROR então a execução iria para o bloco CATCH, e se pegássemos a mensagem de erro a mesma seria o texto adicionado acima.</p>
<p>Mas, caso tenha muitos erros do tipo, poderemos adicionar com a procedure sp_addmessage (que adiciona valores na tabela sys.messages) um erro acima de 50.000 (ao contrário é exibido um erro, esse erro agente não quer =P);</p>
<p style="font-family:Courier New; font-size:12px"><span style="color: #0000FF">EXEC</span> <span style="color: #800000">sp_addmessage</span> 50010,<br />
18,<br />
<span style="color: #FF0000">'%s already registered'</span>,<br />
<span style="color: #FF0000">'us_english'</span></p><br />
<p style="font-family:Courier New; font-size:12px"><span style="color: #0000FF">EXEC</span> <span style="color: #800000">sp_addmessage</span> 50010,<br />
18,<br />
<span style="color: #FF0000"> 'Usuário %s já cadastrado'</span>,<br />
<span style="color: #FF0000"> 'Português'</span></p>
<p>Bom, acima eu criei um erro em inglês e português, agora vou alterar a procedure que tinha criado.</p>
<p style="font-family:Courier New; font-size:12px"><span style="color: #0000FF">ALTER PROCEDURE</span> [dbo].[Usuario_Inserir] <br />
@Nome <span style="color: #0000FF">VARCHAR</span>(100),<br />
@Email <span style="color: #0000FF">VARCHAR</span>(100)<br />
<span style="color: #0000FF">AS<br />
BEGIN<br />
IF</span><span style="color: #666666"> NOT EXISTS</span> (<span style="color: #0000FF">SELECT</span> Email <span style="color: #0000FF">FROM</span> Usuarios <span style="color: #0000FF">WHERE</span> Email = @Email)<br />
<span style="color: #0000FF"> BEGIN<br />
INSERT INTO</span> [dbo].[Usuarios]<br />
([Nome]<br />
,[Email])<br />
<span style="color: #0000FF">VALUES</span><br />
(@Nome<br />
,@Email)<br />
<span style="color: #0000FF"> END<br />
ELSE<br />
BEGIN</span><br />
<span style="color: #0000FF">RAISERROR</span>(50010, 16, 1, @Nome)<br />
<span style="color: #0000FF"> END<br />
END</span></p>
<p>Podemos ver que na chamada do RAISERROR passamos a Id do erro que criamos e passamos um argumento no formato de String. (String: %s, Int: %d).</p>
<p>Talvez o mais interessante do RAISERROR seja as mensagens que ela pode retornar, mas, a gravidade também é interessante e podemos fazer algo diferente com ela.</p>
<p>Existe uma faixa de gravidade onde:
0 – 18: Pode ser definido por qualquer usuário.
19 – 25: Apenas sysadmin, esta precisa ser chamada com a opção WITH LOG, pois grava um erro no arquivo de LOG, além de ter a conexão com o cliente encerrada.</p>
<p>Por fim, deixo um exemplo com o uso em um TRY...CATCH do SQL, juntamente com o RAISERROR que possui uma gravidade acima de 19.</p>
<p style="font-family:Courier New; font-size:12px"><span style="color: #0000FF">BEGIN TRY<br />
PRINT</span> 1<br />
RAISERROR (<span style="color: #FF0000">'Aqui gerou Erro antes de imprimir 2'</span>, <br />
22,<br />
1 <br />
) <span style="color: #0000FF">WITH</span> <span style="color: #FF33FF">LOG</span><br />
<span style="color: #0000FF">PRINT</span> 2<br />
<span style="color: #0000FF">END TRY<br />
BEGIN CATCH<br />
DECLARE</span> @ErrorMessage <span style="color: #0000FF">NVARCHAR</span>(4000);<br />
<span style="color: #0000FF">DECLARE</span> @ErrorSeverity <span style="color: #0000FF">INT</span>;<br />
<span style="color: #0000FF">DECLARE</span> @ErrorState <span style="color: #0000FF">INT</span>;</p>
<p style="font-family:Courier New; font-size:12px"> <span style="color: #0000FF">SELECT</span> @ErrorMessage = <span style="color: #FF33FF">ERROR_MESSAGE</span>(),<br />
@ErrorSeverity = <span style="color: #FF33FF">ERROR_SEVERITY</span>(),<br />
@ErrorState = <span style="color: #FF33FF">ERROR_STATE</span>();</p><br />
<p style="font-family:Courier New; font-size:12px"> <span style="color: #0000FF">RAISERROR</span> (@ErrorMessage, <br />
@ErrorSeverity,<br />
@ErrorState)<br />
<span style="color: #0000FF">END CATCH</span></p>
<p>No lixo! Até mais. </p>
<p>OBS: <a href="http://www.linhadecodigo.com.br/Colaborador.aspx?id=481">Artigo publicado no linha de código</a>.</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com2tag:blogger.com,1999:blog-8841982704991886486.post-90043040577563545912009-01-26T14:48:00.000-08:002010-06-24T12:17:30.053-07:00Verificar tipo de dado<p>Olá pessoal,</p>
<p>Hoje jogo fora algo simples, rápido e de bom uso...Algo que existe em todas as classes, o método GetType().</p>
<p>Este método retorna o tipo de uma variável, podendo ser ela dos nossos dados primitivos:</p><p>
<span style="color:#3333ff;">string</span> texto = <span style="color:#cc0000;">"Eu sou uma string mesmo"</span>;</p><p>
<span style="color:#3333ff;">if</span> (texto.GetType() == <span style="color:#3333ff;">typeof</span>(<span style="color:#3333ff;">string</span>))<br />
{<br />
Response.Write(texto);<br />
}</p>
<p>Ou um tipo de dado que está no Framework:</p><p>
<span style="color:#339999;">DBNull</span> nullBd = <span style="color:#339999;">DBNull</span>.Value; </p>
<p>
Response.Write((nullBd.GetType() == <span style="color:#3333ff;">typeof</span>(<span style="color:#339999;">DBNull</span>)) ? <span style="color:#cc0000;">"Sou Nulo"</span> : <span style="color:#cc0000;">"Não sou Nulo"</span>);</p>
<p>Ou, o melhor de todos, do tipo que você criar:</p><p>
<span style="color:#3333ff;">public class</span> <span style="color:#339999;">MyFavoriteType<br />
</span>{<br />
<span style="color:#3333ff;"> public string</span> MyFavoriteTypeWriter()<br />
{<br />
<span style="color:#3333ff;"> return</span> <span style="color:#cc0000;">"Esta é minha classe!"</span>;<br />
}<br />
}</p><p>
<p>Sabendo o tipo que eu criei:</p>
<p>Response.Write(myType.GetType());</p>
<p style="font-size:10px;"><b>Output:</b> GetType._Default+MyFavoriteType</p>
<p>Ou o tipo de dado que retornam meus métodos:</p>
<p>Response.Write(myType.MyFavoriteTypeWriter().GetType());</p>
<p style="font-size:10px;"><b>Output:</b> System.String</p>
<p>Pronto! Hoje é só isso, algo bem sussa...Até a próxima!</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com0tag:blogger.com,1999:blog-8841982704991886486.post-40531371443098148202009-01-21T16:05:00.000-08:002010-06-24T12:33:13.022-07:00Definições da Aplicação (AppSettings)<p>Olá galera!</p>
<p>Hoje estou jogando fora uma coisa muito interessante e muito importante para nossas aplicações ASP.Net.</p>
<p>Podemos na Web.Config (Configuração da nossa aplicação web), guardar <b>N</b> coisas como string de conexão, modo de autenticação, versão do Assembly e outras coisas... Entre essas coisas mais esta nossa appSettings. </p>
<p>E para que serve o appSettings? No appSettings podemos criar chaves e definir valores para essas chaves e, o que eu acho muito bom, não precisamos recompilar a aplicação para trocar o valor dessas chaves.</p>
<p>Ok, vamos para dois exemplos de onde usar a appSettings:</p>
<p>1- Vamos supor que logo após a homologação do projeto, seu cliente, decidiu trocar o e-mail no qual ele recebe quando a aplicação envia. Ao invés de ir procurar a variável que guardamos o e-mail dele e trocar pelo novo, na appSettings trocamos para o novo e-mail e pronto.</p>
<p>2- "- Que bacana João, olha essa condição, se item == 45. Porque 45???". Claro que não vamos colocar tudo no appSettings, mas seria bem melhor entender se a condição fosse, se item == appSettings["Carro"]. Um exemplo básico!</p>
<p>Aeeeeeeeeee está explicado... Agora mãos a obra!</p>
<p>Vamos na nossa Web.Config criar nossas chaves. É extremamente simples:</p>
<a href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/app1.jpg" rel="lightbox"><img id="BLOGGER_PHOTO_ID_5293918246164515458" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 175px; TEXT-ALIGN: center" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7lYzDbOkxSWc1T6G2z71-iwb-oso7bpzWt85drxcA_Yt-rT4t7V80_PKTbbQCTm9RNsfieCNHstuqRb6qwXLr1nz1YsAuqLxq3lja6vZc5mKxN8_XNeBcQ1r_f3zUZX3PK5_GAbmk-M4/s320/app1.jpg" border="0" /></a>
<p>Onde Key é o nome da chave e Value o valor da mesma.</p>
<p>No ASP.Net, vamos inventar algo para utilizar nossas chaves... Bom, para começar vamos adicionar algumas referências:</p>
<p><span style="color:#3333ff;">using</span> System.Configuration;<br />
<span style="color:#3333ff;">using</span> System.Collections.Specialized;<br />
<span style="color:#3333ff;">using</span> System.Text;</p>
<p>A primeira é para chamar itens de configuração, a segunda para utilizar um tipo de coleções e a última para usar o StringBuilder, que hoje não vou comentar muito sobre ele, outro dia vou jogar uma grande quantidade de texto sobre Strings fora!</p>
<p>Vamos criar variáveis e preenchê-las com algumas chaves:</p>
<p><span style="color:#3333ff;">string</span> Nome = <span style="color:#339999;">ConfigurationManager</span>.AppSettings[<span style="color:#cc0000;">"Nome"</span>];<br />
<span style="color:#3333ff;">string</span> Sobrenome = <span style="color:#339999;">ConfigurationManager</span>.AppSettings<span style="color:#000000;">[</span><span style="color:#cc0000;">"Sobrenome"</span>];<br />
<span style="color:#3333ff;">string</span> Idade = <span style="color:#339999;">ConfigurationManager</span>.AppSettings[<span style="color:#cc0000;">"Idade"</span>];</p>
<p>Vamos elaborar um texto e colocar Labels dizendo que eles possuem o valor das minhas variáveis. Poderiamos ter feito direto, mas assim fica bem limpinho...</p>
<p><span style="color:#3333ff;">protected void</span> Page_Load(<span style="color:#3333ff;">object</span> sender, <span style="color:#339999;">EventArgs</span> e)<br />
{<br />
lblNome.Text = Nome +<span style="color:#cc0000;"> " "</span> + Sobrenome;<br />
lblIdade.Text = Idade;<br />
lblFerramentas.Text = PreencheFerramentas();<br />
}
</p>
<p>Avançando um bucadinho... Pode-se ver que eu carreguei um Label com um método... Vamos analisar ele!</p>
<a href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/app2.jpg" rel="lightbox"><img id="Img1" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 138px; TEXT-ALIGN: center" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHjgVIN-hDk_wFngTdBO5ouQMnvbiw1xxLuOwR435RF0vsXCucCUlWSnZIB_xG_BMY-Lra5KAAmA3ls62lRFbQAJxWxE8Ds7BC5rKW6sNSt-z_0UF78JyX6R0VmhSqwxxksvh9AOTAygI/s320/app2.jpg" border="0" /></a>
<p>Quero explicar aqui, que o <span style="color:#339999;">ConfigurationManager</span>.AppSettings retorna uma lista com todas as minhas chaves... Isso também é muito interessante, já que assim podemos saber se existe ou não uma determinada chave... Ahh se tentarmos usar uma chave que não existe -> <span style="color:#339999;">NullReferenceException</span>.</p>
<p>E o método???</p>
<p>Fácil. No começo criamos uma Array de strings definidas com 4 elementos, criamos uma objeto do tipo NameValueCollection que é uma coleção com as minhas chaves e, por fim, um StringBuilder para, basicamente, concatenar tudo.</p>
<p>Quero verificar se nos itens da minha Array, existe algum com chave no appSetting. Se tiver, vamos pegar o valor desta chave e concatenar no StringBuilder, no final, transformamos nosso StringBuilder em uma string que é retonada ao Label.</p>
<p>Legal para brincar! Já chuta tudo: Array, NameValueCollection e StringBuilder... Muito 10!</p>
<p>F5</p>
<a href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/app3.jpg" rel="lightbox"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 70px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOadsqIcHsCVFH57LqEZD2T1Pc8m4i2AYBNirFRFDSZBhfpcsft_Raq5p9mDXngJ8NDrTBzQcunZuQWKtTkEZYW_bGtIn8Vvma3w7D54EN8GjoNs9Q9yxy3q3rL8GwT6AoB_0H3duB9FA/s320/app3.jpg" border="0" alt=""id="Img2" /></a>
<p><a href="http://rapidshare.com/files/189336667/AppSettings.rar" target="_blank">Link para o projeto</a>.</p>
<p>Espero que reciclem todo o Lixo! Até a próxima.</p>
<p>OBS: <a href="http://linhadecodigo.com.br/Artigo.aspx?id=2209" target="_blank">Artigo publicado no linha de código</a></p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com0tag:blogger.com,1999:blog-8841982704991886486.post-50800877768092130792009-01-11T07:08:00.000-08:002010-06-24T11:34:36.891-07:00Web Services - Parte 3<p>Olá pessoal,</p>
<p>Bom, aqui já sabemos o que é um Web Service (WS) e como criar um. Agora iremos descobrir como “consumir” um WS. Vamos utilizar o mesmo projeto.</p>
<p>Ao abrir o projeto vamos adicionar um novo item do tipo Web Form.</p>
<p>Vamos desenhar nossos forms. Colocar um DataList e formatá-lo com tabelas e labels e abaixo vamos colocar dois TextBox, um Button para utilizar o método de soma e um Label para mostrar o resultado.</p>
<p>Depois de tudo criado, vamos adicionar a referencia a nosso WS. Aqui, posso dizer que é a parte mais importante do "consumo".</p>
<p>Na Solution Explorer, temos a pasta References, onde temos as referências para o Framework ou outras bibliotecas. Clicando com o direito em cima da pasta, vamos clicar em “Add a Web Reference...”.</p>
<a href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/ws31.jpg" rel="lightbox"><img id="BLOGGER_PHOTO_ID_5290065680257637842" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 204px; TEXT-ALIGN: center" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB-an9YV21DGFSS3I4zkuM7UCiJdrooUd0G1e0uMk5NLbOny0mV1NFq0j-xF2XHiFvaK2JTPSSCjLHKSAym-bZawzo_qQ8DQZjKH_CIGTjVTqCr7DXSFIdSljT0P9-NWLtmZTXCdtw770/s320/ws31.jpg" border="0" /></a>
<p>Ao clicar, teremos um Wizard para adicionar a referência de nosso WS.</p>
<p>Vamos entender melhor a tela do Wizard:</p>
<a href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/ws32.jpg" rel="lightbox"><img id="Img1" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 225px; TEXT-ALIGN: center" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs7vIClmjHrDOcJM6ZTporHWY9rDclwvyvZg9Xv_RQO-BUrlq7Q1OxaOjRYCsImFZgnyrEQ4YST_rJd_VJggJdfSlfjyC_vaNFNmYsmUakEixAzLoKq8PDlGcFBUT98YulKWc4uA0ZkD4/s320/ws32.jpg" border="0" /></a>
<p>1 - Aqui podemos adicionar uma URL de um WS externo, por exemplo, lembra dos desenvolvedores de 2000 noticias? Bom eles devem mandar o link para o WSs deles e devemos adicionar a URL aqui.</p>
<p>2 - WS Local, podendo estar no Projeto (nosso caso no exemplo), em uma aplicação que está na máquina ou em um <a href="http://support.microsoft.com/kb/833380/pt-br" target="_blank">servidor UDDI</a>.</p>
<p>3 - Colocaremos um nome para nossa referencia e clicamos em “Add Reference”.</p>
<p>No nosso projeto, vamos clicar em “Web services in this solution”. A seguinte tela irá aparecer:</p>
<a href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/ws33.jpg" rel="lightbox"><img id="Img2" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 223px; TEXT-ALIGN: center" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW562jv_g5dsB3Fc274cGKZ8Hu1Fjmu0AGDLF-UC8h_WAjd8aCTDU60tUq44BqQ3jU2QKUZwvCF-gNL2a5ZwisiMEdp4LYm07P7c1MjdmP1-HnLPEE-FrVSnnxL2w4ZTt0pZSgs-k5_TQ/s320/ws33.jpg" border="0" /></a>
<p>Aqui no lugar do link locais, aparecem os métodos do WS escolhido. Para terminar, como já dito, coloque o nome da referência (o meu WsNetMorc) e adiciona-lá.</p>
<p>Maravilha... Temos uma referência ao nosso WS. Vamos adiciona-lá no Code Behind.</p>
<p><span style="color:#3333ff;">using</span> Noticias.WsNotMorc;</p>
<p>No Load da Página, se não for Post Back (retorno da página) iremos chamar o método CarregarNoticias.</p>
<p><span style="color:#3333ff;">protected void</span> Page_Load(<span style="color:#3333ff;">object</span> sender, <span style="color:#339999;">EventArgs</span> e)<br />
{<br />
<span style="color:#3333ff;">  if</span> (!IsPostBack)<br />
{<br />
CarregarNoticias();<br />
}<br />
}
</p>
<p>No método CarregarNoticias, vou explicar por passos...</p><p><span style="font-size:84%;">
<span style="color:#3333ff;">private void</span> CarregarNoticias()<br />
{<br />
wsNotMorc = <span style="color:#3333ff;">new</span> <span style="color:#339999;">WsNoticias</span>();<br />
<span style="color:#339999;"> List</span><<span style="color:#339999;">Noticia</span>> listaNoticias = <span style="color:#3333ff;">new</span> <span style="color:#339999;">List</span><<span style="color:#339999;">Noticia</span>>();<br />
listaNoticias = wsNotMorc.ListarNoticias();<br /><br />
<span style="color:#339999;"> DataTable</span> dt = <span style="color:#3333ff;">new</span> <span style="color:#339999;">DataTable</span>(<span style="color:#cc0000;">"Noticias"</span>);<br />
dt.Columns.Add(<span style="color:#3333ff;">new</span> <span style="color:#339999;">DataColumn</span>(<span style="color:#cc0000;">"Titulo"</span>, <span style="color:#339999;">Type</span>.GetType(<span style="color:#cc0000;">"System.String"</span>)));<br />
dt.Columns.Add(<span style="color:#3333ff;">new</span> <span style="color:#339999;">DataColumn</span>(<span style="color:#cc0000;">"Texto"</span>, <span style="color:#339999;">Type</span>.GetType(<span style="color:#cc0000;">"System.String"</span>)));<br />
dt.Columns.Add(<span style="color:#3333ff;">new</span> <span style="color:#339999;">DataColumn</span>(<span style="color:#cc0000;">"Autor"</span>, <span style="color:#339999;">Type</span>.GetType(<span style="color:#cc0000;">"System.String"</span>)));<br />
dt.Columns.Add(<span style="color:#3333ff;">new</span> <span style="color:#339999;">DataColumn</span>(<span style="color:#cc0000;">"Data"</span>, <span style="color:#339999;">Type</span>.GetType(<span style="color:#cc0000;">"System.String"</span>)));<br />
<br />
<span style="color:#3333ff;"> foreach</span> (<span style="color:#339999;">Noticia</span> noticia <span style="color:#3333ff;">in</span> listaNoticias)<br />
{<br />
<span style="color:#339999;"> DataRow</span> drow = dt.NewRow();<br />
drow[<span style="color:#cc0000;">"Titulo"</span>] = noticia.Titulo;<br />
drow[<span style="color:#cc0000;">"Texto"</span>] = noticia.Texto;<br />
drow[<span style="color:#cc0000;">"Autor"</span>] = noticia.Autor;<br />
drow[<span style="color:#cc0000;">"Data"</span>] = noticia.Data.ToShortDateString();<br />
dt.Rows.Add(drow);<br />
}
<br /><br />
dlNoticia.DataSource = dt;<br />
dlNoticia.DataBind();<br />
}
</span>
</p><p>No começo, adicionaremos uma nova referência para nosso WS. Como sabemos que irá retornar várias notícias, criaremos uma lista de noticias e falar que ela recebera o Web Method ListarNoticias().</p>
<p>Após vamos criar um DataTable e preencher com cada noticia recebida. E, por fim, dizemos que o DataList receberá o DataTable.</p>
<p>Maravilha!!! Mas vamos programar mais um pouco...</p>
<p>Ao clicar no botão Somar (btnSomar)...</p>
<p><span style="color:#3333ff;">try</span><br />
{<br />
wsNotMorc = <span style="color:#3333ff;">new</span> <span style="color:#339999;">WsNoticias</span>();<br />
lblResultado.Text = <span style="color:#cc0000;">"O Resultado é: "</span> + wsNotMorc.SomaDoisValores(<span style="color:#339999;">Convert</span>.ToInt32(txtA.Text), <span style="color:#339999;">Convert</span>.ToInt32(txtB.Text)).ToString();<br />
}<br />
<span style="color:#3333ff;">catch</span><br />
{<br />
lblResultado.Text = <span style="color:#cc0000;">"Valores Inválidos"</span>;<br />
}
</p>
<p>...chamaremos uma nova referência ao WS e dizemos que o lblResultado será o que o WebMethod SomaDoisValores() retornar, mas agora eu passo 2 parâmetros, que são nossos 2 TextBox. Colocamos dentro de um Try...Catch para nenhum engraçadinho digitar letras!</p>
<p>Agora sim terminamos, F5 para rodar:</p>
<a href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/ws34.jpg" rel="lightbox"><img id="Img3" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 96px; TEXT-ALIGN: center" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHCFsffpLU7dgRaQR2FWX4jIYvk-Q59oVoPhkEN_5qQm-bJjatMDxnMSn-0i95D4OjxxDZdlo-KQVKhRi23zN0ZIBvREaCAdl5EICKoBTMk7aZlQ09dIPZMzjeJJf55NSeOuMjXQaFZjQ/s320/ws34.jpg" border="0" /></a>
<p>Com isso, terminamos a saga sobre WS... Futuramente irei falar sobre autenticação em WS entre outras coisas... O importante é que está tudo no Lixo!!!</p>
<p><a href="http://rapidshare.com/files/182192596/MyFirstWSFinal.rar" target="_blank">Clique aqui para baixar o projeto final</a>.</p>
<p>Abraços!</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com1tag:blogger.com,1999:blog-8841982704991886486.post-87830560537966835102009-01-06T16:46:00.000-08:002010-06-24T11:31:47.754-07:00Web Services – Parte 2<p>Feliz ano novo! Vamos ao nosso novo Web Service (WS)...</p>
<p>Bom, para o projeto estou usando o Visual Studio 2008 (VS), Framework 3.5, entretanto presumo que não seja tão diferente em versões anteriores.</p>
<p>Ao abrir o Visual Sudio, vamos criar um novo projeto do tipo Web Service Application (ctrl + shift + N -> Web -> ASP.NET Web Service Application), vamos nomear a camada de <em>Noticias</em> e o projeto de <em>MyFirstWS</em>.</p>
<a href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/ws1.jpg" rel="lightbox"><img id="BLOGGER_PHOTO_ID_5288347350734744130" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 269px; TEXT-ALIGN: center" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkUcI6oEFfTK-2rG8KDyU4PIEQ-jdnyUrLO7xblVe9JXrsxUNwYIBZgaqDp5LUW-lyF-24t_DXQu9ykI_IiF9HuaM1dTf51pH31vcqthMU4gA5bacZmyBxe1h5XPPd4VpWyiXQz1263Yw/s400/ws1.jpg" border="0" /></a>
<p>Ok, nosso amigo VS criou um projeto e já colocou um .asmx lá pra gente. Obrigado VS... Mas vamos deletar esse .asmx para ver que nada há de diferença entre um projeto ASP.Net de um projeto Web Service Application. Ao deletar, adicione um novo item e escolha o WS, de o nome de WsNoticias.</p>
<a href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/ws2.jpg" rel="lightbox"><img id="BLOGGER_PHOTO_ID_5288347364465768722" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 241px; TEXT-ALIGN: center" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlJO8tPG-RRykstEDBrrVCGi_xrvhsK0Lq8uK_pg-Epa_80fcTBD-4AzE6eDT0coZwC8dVMLYPHDG-ROeZGzEA0PvsiSoOE3zqraguxe9MtGoZLMK30DsMplEAvzKchhAK9LVUEtlfY6c/s400/ws2.jpg" border="0" /></a>
<p>Criado!</p>
<p>O VS já deixa como exemplo um Web Method para nós. Então se executarmos teremos a seguinte tela:</p>
<a href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/ws3.jpg" rel="lightbox"><img id="BLOGGER_PHOTO_ID_5288347362700170418" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 209px; TEXT-ALIGN: center" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitPiVsRc-xY4cPPY4cV-X1OHJdkH2noTMNwOl2XLZBDypP3TpdB0LHt9khGFW7nQXcRPpZUOI0SncUJK88nuPIWTYNEJFbxI6BiOdH2Vr3U8wfQz0DutVdRfbhlZuN2Z0kfi2vAyImwEA/s400/ws3.jpg" border="0" /></a>
<p>Nessa tela temos em azul no topo o nome do nosso WS, abaixo serão listados todos nossos métodos (o que nos importa) e a página abaixo é apenas explicando que cada WS precisa ter seu namespace, é o que vai diferenciar seus WSs quando eles se tornarem públicos para consumo. Por default é colocado o http://tempuri.org/ (por causa dele que a página de explicação fica abaixo). Bom, escolha um namespace apropriado ao seu WS. Como o meu é para o site <a href="http://www.morcegosweb.com/" target="_blank">http://www.morcegosweb.com/</a> este então será meu Namespace.</p>
<p>Agora então, vamos criar um novo método. Para diferenciar um método comum que nosso WS pode ter de um método Web, coloca-se [WebMethod] antes do início da declaração do método.</p>
<p>Vamos criar um método SUUUUPER diferente, um método para somar 2 valores =P
<br /><br />
[<span style="color:#339999;">WebMethod</span>]<br />
<span style="color:#3333ff;">public int</span> SomaDoisValores(<span style="color:#3333ff;">int</span> valorA, <span style="color:#3333ff;">int</span> valorB)<br />
{<br />
<span style="color:#3333ff;"> return</span> valorA + valorB;<br />
}
<p>Vamos pensar um pouco... Pode existir um WebMethod privado?</p>
<p>Sim, você pode criar...
<br /><br />
[<span style="color:#339999;">WebMethod</span>]<br />
<span style="color:#3333ff;">private</span> <span style="color:#3333ff;">string</span> Teste()<br />
{<br />
<span style="color:#3333ff;"> return</span> <span style="color:#990000;">"Pq eu existo???"</span>;<br />
}
<p>Mas ele não aparecerá na nossa lista de métodos para consumir, sendo assim ninguém acessa a não ser outros métodos da página, então não precisa ser um WebMethod... Falo isso para deixar claro que meu WS pode ter métodos como uma aplicação ASP.Net normal.</p>
<p>Ok, algo mais avançadinho, vamos criar uma classe noticia, criar um método que retorne uma lista de noticias. Assim, vamos criar um método que pegue essa lista.</p>
<br />[<span style="color:#339999;">WebMethod</span>]<br />
<span style="color:#3333ff;">public</span> System.Collections.Generic.<span style="color:#339999;">List</span><<span style="color:#339999;">Noticia</span>> ListarNoticias()<br />
{<br />
<span style="color:#339999;"> Noticia</span> noticias = <span style="color:#3333ff;">new</span> <span style="color:#339999;">Noticia</span>();<br />
<span style="color:#3333ff;"> return</span> noticias.ListarNoticias();<br />
}
<p>Ao executar, lá esta nosso método bonitinho. Clicando nele e invocando, podemos ver que é retornado nosso XML conforme abaixo:</p>
<a href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/ws4.jpg" rel="lightbox"><img id="BLOGGER_PHOTO_ID_5288347367031768402" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 261px; TEXT-ALIGN: center" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE54QAPMOHv5556cguWR3WPJMcwHtRjjDQJV5CaHUnBXnynRp4vJE8kDuGZ8aS2n9M1ekwSLXO76rxcnsL_wckqbUZ0Cdts8FAJaLnZBSDpFCvGcBsKdbqqQQNj_u4PDFV0UHaTxaTF1A/s400/ws4.jpg" border="0" /></a>
<p>Só isso??? Está criado meu WS???</p>
<p>Basicamente sim, este é o conceito simples de criação de um Web Service.</p>
<p>Jogado no Lixoooo... para baixar o projeto <a href="http://rapidshare.com/files/180880929/MyFirstWS.rar" TARGET="_Blank">clique aqui</a>. Até mais!</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com1tag:blogger.com,1999:blog-8841982704991886486.post-91313055194546681982008-12-28T09:26:00.000-08:002009-01-08T16:58:09.460-08:00Web Services – Parte 1<p>Olá,</p>
<p>Neste 1º post técnico vamos falar sobre Web Services. Basicamente, precisei fazer uma grande pesquisa sobre o que é Web Service e qual a sua utilidade perante nosso mundo. Então com um vasto volume de documentos pegando espaço no meu HD, vou deletar tudo após esta explicação!!!</p>
<p>Bom, vamos dividir o assunto de Web Services em 3 partes: O que são e como funcionam, Como fazer um e como consumir um.</p>
<p><b>O que são Web Services (WS) e como funcionam?</b></p>
<p>Um WS pode prover dados para qualquer aplicativo, seja ele um aplicativo Web ou um aplicativo Desktop (conectado a Web ou local ao WS), os WS mais comuns que encontramos na Web são de endereços, cotações de moedas ou ações, entre outros, pois são dados com alterações frequentes (<a href="http://educacao.ig.com.br/acordo_ortografico/noticias/2008/09/07/entenda_o_que_muda_com_o_acordo_ortografico___trema_1705960.html" target="_blank">palavra sem trema agora</a>).</p>
<p>Os WS enviam e recebem dados no formato de nosso grande amigo XML (eXtensible Markup Language) e utiliza um padrão SOAP (Simple Object Access Protocol), um protocolo que irá garantir a intercomunicação entre diferentes sistemas através do XML e o HTTP, este como mecanismo de transporte.</p>
<p>Então... A sua utilização deve-se mais a integrar sistemas e/ou fazerem a comunicação entre diferentes aplicações. Por exemplo, um belo dia de sol, uma equipe de desenvolvimento resolveu fazer notícias dinâmicas diárias (quase 2000 notícias por dia!), seu cliente adorou a idéia de colocar em seu site todas essas noticias, a equipe de desenvolvimento diz que você não vai acessar o banco de dados deles (Nããão isso jamais), mas eles montaram um WS que possui métodos para você consumir, e tratar da maneira que você quiser, a imagem abaixo explica um pouco a transação.</p>
<a href="http://www.morcegosweb.com/morcegos/arquivos/lightbox/cenario1.jpg" rel="lightbox"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 136px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM439YjBHU1tMYo_eiPq8vxndeQ_ramXpRf5AcwE7PzwC6oK13hCd9Slnzn59S9r2ANkzo2egywBGfeWVTtNAT8k1sxxZW1hFTQBnBFmRV0nd5gbtO3nX6_uoDFeC_LV3_s052f2YwXlE/s320/cenario1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5289091798257603394" /></a>
<p>Pode-se perceber que “Minha Aplicação”, tanto faz a linguagem, vai invocar o serviço do WS Remoto, vou consumir o método “LerNoticias” passando por parâmetro a quantidade de notícias que quero consumir. Assim o WS remoto vai me responder (em XML) e “Minha Aplicação” vai tratar os dados da maneira que quiser.</p>
<p>Parece bem simples não? E é verdade, é realmente muito simples e muito eficaz no que a maioria das empresas e aplicações tem problema... A comunicação.</p>
<p>Por fim, nada de código neste Post =(. Mas logo vamos para a parte 2, lá então usaremos o C# para criar um WS para testarmos. Por enquanto, este texto vai para lixeira... Até mais.</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com0tag:blogger.com,1999:blog-8841982704991886486.post-14756205926076224762008-12-24T05:35:00.000-08:002009-01-11T12:12:53.231-08:00Bem-vindo à Lixeira do Dri<p>Olá!</p>
<p>Este é o 1º Post da Lixeira do Dri, aqui explicarei melhor todo o processo de funcionamento deste blog.<p>
<p>Quantas vezes você, seja desenvolvedor (igual eu), seja engenheiro ou uma dona de casa que guarda suas receitas de bolo em umas pastinhas do seu computador, já apagou coisas que, na hora de apagar, não achava importante porém, após um período, ficou procurando essa(s) coisa(s) até lembrar que tinha deletado???<p>
<p>É, eu já <b>sofri</b> muito com isso... Mas poxa minha HD só tem 120 GB, tenho que guardar minhas trilogias e meus filmes favoritos... Ficar guardando dicas de como resolver um problema no Visual Studio ou ficar guardando um mini projeto que usa uma coisinha diferente... Ahh não, isso ocupa espaço vou deletar!!!</p>
<p>Surge então a idéia de guardar na Web todos os itens que jogo na minha lixeira. Claro que (desculpe engenheiros e donas de casa) vou guardar apenas as coisas que me fazem falta quanto a desenvolvedor...</p>
<p>A idéia surgiu com um Layout muito original que fiz num dia de criatividade alta, porém a programação da mesma foi parada graças a minha grande falta de tempo. Então para não continuar perdendo minhas coisas, criei um blog aqui mesmo (7010% mais simples) até que o meu fique pronto (espero que fique um dia!).</p>
<p>Basicamente, encontraremos na minha lixeira coisas de ASP.Net, C#, SQL, Oracle e ASP (talvez), e minha esperança é que sirva não apenas para guardar minhas bagunças, mas de apoio a quem está começando ou quem queira tirar algumas dúvidas neste grande mundo do desenvolvimento.</p>
<p>Abraços pessoal, até o próximo Post!</p>Adriano Galesso Alveshttp://www.blogger.com/profile/17820480792933382324noreply@blogger.com0