Categorias
Uncategorized

F??rias

Ol?? pessoal!

Depois um tempo sem postar nada na pr??xima semana irei retomar com novos artigos!

Categorias
e-mail google

Enviar e-mail em ASP.NET usando o GMail com conta no Google Apps

Um artigo bem simples que se encontra na net para envio de e-mail em C# ?? esse aqui. Um post bem simples e explicativo de como fazer o envio usando o SMTP do GMail. Mas n??o era bem isso que eu queria abordar (tamb??m) j?? que disponibilizei o link para o post ensinando como. Quem n??o conhece o Google Apps j?? deveria dar uma olhada pois ?? um conjunto de solu????es empresariais que ajuda na redu????o de custos de TI dando uma maior produtividade. Uma delas ?? a cria????o de e-mails tendo um dom??nio externo. Vou dispensar explica????es (nota: tem a vers??o free e paga)… vamos ?? “implementa????o”. Suponhamos que eu tenha o dom??nio www.thiagomarcal.com.br e que esteja configurado para o Google Apps. L?? eu criei um e-mail contato@thiagomarcal.com.br e agora quero us??-lo para fazer o envio de e-mails. Basta eu seguir o post citado anteriormente que ?? poss??vel fazer o envio com os seguintes dados:

  • SMTP: smtp.gmail.com
  • Sender: contato@thiagomarcal.com.br
  • Senha: 123456
  • Porta: 587
  • Ssl: true

Obviamente a senha ?? fict??cia… apenas usando para fins did??ticos, mas que realmente muita gente usa. Ent??o, tudo certo! Faz-se um envio e d?? o seguinte erro:

The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required. Learn more at

O servidor SMTP requer uma conex??o segura ou o cliente n??o foi autenticado. A resposta do servidor foi: 5.5.1 Autentica????o solicitada Saiba mais em

Se garantir que os dados est??o todos certos e j?? testou com outra conta (e fez o envio corretamente) fa??a o seguinte: mude a senha! Senha fraca ou padr??o (que nem 123456) o GMail bloqueia a autentica????o e n??o deixa enviar.

Categorias
dicas seguran??a web.config

Vulnerabilidade de Seguran??a no ASP.NET

Recentemente, em um congresso internacional, descobriu-se um problema de vulnerabilidade em sistemas ASP.NET atrav??s do web.config. O problema afeta todas as vers??es do framework… A mat??ria completa de como ?? o ataque e de como se proteger podem ser lidos nesses posts de Scott Guthrie:

  1. Important: ASP.NET Security Vulnerability
  2. Frequently Asked Questions about the ASP.NET Security Vulnerability

A priori, para impedir o ataque, proteja sua aplica????o fazendo com que os erros n??o sejam exibidos para o cliente. No web.config adicione as seguintes tags:

<configuration>
   <system.web>
      <customErrors mode=”On” defaultRedirect=”~/Erro.aspx” />
   </system.web>
</configuration>

Assim, toda vez que ocorrer um erro, ir?? ser redirecionado para uma tela espec??fica.

Categorias
componentes dll iis

URL Rewriter – Escreva URL Amig??veis em ASP.NET

A URL Rewriter permite mascarar o endere??o original por um novo endere??o mais seguro e amig??vel. Se temos o endere??o:

http://thiagomarcal.blogspot.com/noticas.aspx?id_noticia=123

Podemos re-escrev??-la da seguinte forma:

http://thiagomarcal.blogspot.com/noticias/123

Ou de outras formas conforme o mascaramento desejado. Para fazer o mascaramento ?? preciso do componente URL Rewriter instalado no IIS. Ele ?? gratuito e ?? instalado facilmente. Para cada web-site ?? configurado um mascaramento de endere??os que automaticamente ele faz a convers??o logo que requisitado.
N??o vou entrar em detalhes do processo de instala????o e configura????o aqui pois no site oficial tem um v??deo (logo na Home), bastando seguir o passo-a-passo, que ir?? conseguir deixar conforme deseja. Tamb??m h?? dispon??vel v??rios tutoriais que auxiliam no processo bem como fun????es avan??adas. Clique aqui para visitar o site da Micrososft URL Rewriter.

Categorias
pagseguro

PagSeguro com ASP.NET (C#)

O PagSeguro ?? uma das melhores solu????es para pagamento on-line que j?? usei. Muito f??cil de us??-la e integr??-la em qualquer sistema. Vantagens s??o in??meras e facilidade bem al??m da conta. No site voc?? encontra bastante informa????es de como utiliz??-la bem como c??digos-fonte. Teoni Valois mostra no v??deo abaixo como realizar a integra????o de forma muito f??cil ent??o dispensarei minhas explica????es.

Nesse link aqui voc?? obt??m o Framework, Loja-Exemplo e o Test Server. Para quem estiver com problema do retorno autom??tico dando FALSO, siga os procedimentos desse post.

* Todos os links e v??deo aqui mostrado s??o de seus respectivos autores. Apenas estou divulgando seus artigos j?? que, se eu escrevesse, seria redundante 😉

Categorias
crystal reports relat??rio

Gerando relat??rios com o Crystal Reports

O Crystal Reports ?? um componente que permite a cria????o de relat??rios personalizados de alto n??vel. Em substituto de relat??rios em HTML puro, ele fornece uma assist??ncia inovadora desde a cria????o at?? exporta????o. Para quem utiliza Java, h?? tamb??m uma vers??o espec??fica para a linguagem. Mostraremos abaixo como gerar um simples relat??rio buscando dados de uma tabela em banco usando C#.

Abra/Crie um projeto do tipo Web Site no Visual Studio e no Solution Explorer clique com o direito no diret??rio onde deseja criar o relat??rio. Escolha Add New Item e opte pelo template Crystal Reports (note que a extens??o de relat??rio do Crystal ?? .rtp). Nessa primeira tela escolha a primeira op????o conforme a figura abaixo:

Clique em OK. Expanda o n?? do Create New Connection e novamente expanda o OLE DB (ADO) para configura????o de conex??o (essa ?? a primeira conex??o com o banco para in??cio, depois mostraremos como usar para outro banco). Na configura????o do ADO, escolha o tipo de provider a ser utilizado (no caso optei pelo SQL Server, ent??o SQL Native Client) e d?? Next.

Agora, em Connection Information, informe os dados de conex??o.

Clique em Next e na ??ltima tela revise os dados. Se estiver tudo certo, clique em Finish. Voc?? voltar?? ?? tela anterior j?? com a configura????o realizada e o banco estar?? apto a selecionar os objetos. Procure qual objeto ir?? ser manipulado e exibido seus dados, podendo ser: uma tabela, um schema, uma view ou stored procedure. Clique no objeto desejado e, em seguida, clique no bot??o com a seta para direita conforme figura abaixo:

Clique em Next. Agora informe quais campos ir??o ser exibidos e escolha Next.

Na pr??xima tela, se precisar agrupar alguns campos, informe quais s??o. Se n??o precisar d?? apenas Next. Se o Crystal identificar que est?? trabalhando com n??meros, ele cria um passo adicional que ?? a op????o de inserir gr??ficos. Outra tela que ?? exibida ?? a de Filtros. Se for ter filtros, informe-os. Caso contr??rio d?? apenas Next. Ou seja, as duas ??ltimas telas s??o par??metros opcionais logo, se n??o desejar configur??-los, d?? Next duas vezes. O ??ltimo passo ?? escolher o estilo. Opte pelo mais parecido que quer e d?? Finish.

Basicamente seu relat??rio est?? pronto, bastando ajustes da posi????o dos campos, design, cabe??alho, etc. Em Field Explorer, cont??m as principais funcionalidades para f??rmulas e c??lculos avan??ados bem como a adi????o de novos campos. Como estamos elaborando um relat??rio simples, vamos parar por a??. Para ver um preview de como estar?? seu relat??rio com os dados, clique em Main Report Preview. Agora vamos ver como chamar pelo ASP.NET (C#).
Adicione uma p??gina Impressao.aspx e nele adicione um objeto CrystalReportViewer que automaticamente ir?? ser registrado o assembly na p??gina (puxando do ToolBox ele insere automaticamente). Se prefer??vel configure alguns atributos do objeto como remo????o da logo da BO, tema, etc. No code-behind, adicione os seguintes namespaces:

using CrystalDecisions.ReportSource;
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
 
E para exibir os dados do relat??rio utilize o seguinte c??digo:
 
DataSet ds = new DataSet();
// Antes, fa??o uma consulta no banco e jogo no DataSet para ser usado logo abaixo
ReportDocument relatorio = new ReportDocument();
relatorio.Load(Server.MapPath(“Relatorio.rpt”));
relatorio.Database.Tables[0].SetDataSource(ds.Tables[0]);
// Esse ?? Viewer que puxamos antes
CrystalReportViewerRelatorio.ReportSource = relatorio;
CrystalReportViewerRelatorio.DataBind();
 
Pronto! Seu relat??rio ser?? exibido…
 

 
Agora vamos aos problemas:
 
1) Fiz todo o processo mas ao exibir o relat??rio est?? pedindo login e senha do SQL Server
 
Se estiver usando DataSet, veja que s?? pude passar uma tabela por vez usando ds.Tables[0] e n??o apenas ds. Se quiser passar v??rias tabelas crie um DataSet tipado no App_Code ou informe uma a uma no atributo Database.
 
2) As imagens dos bot??es do relat??rio n??o est??o aparecendo e ao clicar n??o funciona nada
 
Ao ser colocado em produ????o, verifique se o Crystal Reports est?? instalado corretamente na m??quina. Veja se a pasta wwwrootaspnet_clientsystem_web cont??m a pasta CrystalReportWebFormViewer (depois da pasta system_web vem a vers??o do framework – exemplo 2_0_50727 – e em seguida vem ela). Copie a pasta aspnet_client e adicione na raiz de sua aplica????o.
 
3) Ao exibir o relat??rio est?? aparecendo o erro: N??o foi poss??vel carregar arquivo ou assembly ‘System.Web.Extensions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’ ou uma de suas depend??ncias. A defini????o do manifesto do assembly localizado n??o corresponde ?? refer??ncia do assembly. (Exce????o de HRESULT: 0x80131040)
 
Fa??a os procedimentos informados nesse post.
 
4) Depois que ?? exibido o relat??rio, ao clicar no bot??o de imprimir ou exportar ou qualquer outro bot??o, n??o executa nenhum dos processos que deveria fazer
 
Se estiver usando ASP.NET AJAX e o CrystalReportViewer estiver dentro de um UpdatePanel, remova-o. Pois, ao clicar em desses bot??es, ?? feito um PostBack na p??gina (al??m de tentar abrir uma janela pop-up) e o Crystal n??o funciona adequadamente quando utiliza o AJAX.
 
5) Ao tentar exibir o relat??rio, ocorre o seguinte erro: O inicializador de tipo de ‘CrystalDecisions.CrystalReports.Engine.ReportDocument’ acionou uma exce????o
 
Reinstale o Crystal Reports ou tente as solu????es sugeridas nesse post.
 
6) Minhas imagens e/ou gr??ficos n??o est??o aparendo ao exibir o relat??rio (fica aquele X de imagem n??o carregada) ou ficam distorcidas/baixa resolu????o
 
Se for uma imagem que est?? sendo inserida do disco (que voc?? tem no computador e est?? inserindo atrav??s de Insert > Picture) verifique o formato dessa imagem (prefer??vel JPG ou BMP) e as cores utilizadas bem como efeitos (fundo transparente, camadas). Quanto mais simples a imagem for, melhor ser?? sua visualiza????o. Se apesar de tudo ainda n??o estiver aparecendo, verifique no web.config se h?? as seguintes entradas:

  1. Em system.web > httpHandlers:

    <add verb=”GET” path=”CrystalImageHandler.aspx” type=”CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304″/>
    <add verb=”*” path=”GenerateImage.ashx” type=”GenerateDynamicImage”/>
     

  2. E em system.webServer > handlers:

    <add name=”CrystalImageHandler.aspx_GET” verb=”GET” path=”CrystalImageHandler.aspx” type=”CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304″ preCondition=”integratedMode”/>

7) Meu relat??rio tem mais de 2 p??ginas mas s?? fica exibindo 2/2+ quando clico em avan??ar

Coloque todo o processo de gera????o do relat??rio dentro de Page_Init ou inv??s de Page_Load.

8) Meu relat??rio n??o exibe, a princ??pio, a quantidade total de p??ginas. Fica exibindo 1/1+…

O Crystal faz isso para n??o ter de renderizar todo o relat??rio e sobrecarregar, ent??o fa??a o seguinte artif??cio depois de dar o Bind():

CrystalReportViewerRelatorio.ShowLastPage();
CrystalReportViewerRelatorio.ShowFirstPage();

Ou seja, vou rapidamente para a ??ltima p??gina e volto apenas para o Crystal renderizar a ??ltima p??gina e saber quantas temos ao todo.

Categorias
backup exporta????o importa????o sql server

Exportar Banco de Dados (BAK ou MDF) do SQL Server 2008 para o 2005

A forma mais f??cil de transferir um banco para outro ?? fazer um BAK dele e depois recuperar do outro lado. Do 2005 para o 2008 ?? poss??vel realizar a recupera????o, mas do 2008 para o 2005 n??o ?? poss??vel realizar o downgrade. Qual a solu????o? Gerar o script geral do banco e execut??-lo no banco de destino. Mas se meu banco ?? muito grande, como fazer? A dica est?? no final do post, mas fa??amos tudo desde o in??cio.
Abra o SQL Server Management Studio (ou Express) e conecte-se ao Server. Clique com o bot??o direito sobre a base de dados e siga em Task (Tarefas) e escolha Generate Scritps (Gerar Scripts). Na tela de sele????o de base, marque a op????o Script all objects in the selected database (Scritp de todos os objetos da base selecionada) e avance. Nessa pr??xima tela procure os itens abaixo e atribua os seguintes valores:

  1. Script for Server Version (Vers??o de Script do Server): SQL Server 2005
  2. Script Data (Script de Dados): True
  3. Script USE DATABASE: False

Demais op????es fica a seu crit??rio optar… Agora avance e na pr??xima tela escolha salvar o arquivo em disco com as op????es Simples (Single file) e Unicode text. Avance, revise o que foi selecionado e finalize. Aguarde at?? que o processo seja finalizado. Quando terminado seu script j?? estar?? pronto para ser executado no destino.
O pr??ximo passo ?? executar o script gerado na base de destino. Crie a base de destino vazia e agora temos duas op????es:

  • Se o script gerado for pequeno (ou seja base pequena) podemos simplesmente abrir pelo pr??prio SQL Server Management e executar como se fosse Querys consecutivas;
  • Se o script for grande vamos usar um artif??c??o para isso.

Como a primeira op????o ?? a mais simples (e tamb??m porque gosto de aventurar-me) vamos optar pela segunda (e que tamb??m ?? nossa realidade). No meu exemplo, o script gerado ficou em torno de 1,5Gb. Se desejar reduzir o tamanho um pouco, ??s vezes, reduzir o log ajuda (saiba como reduzir aqui) antes de gerar o script.
Abra o Prompt de Comando (emulador do DOS no Windows) e digite o seguinte comando:

sqlcmd -U thiago -P blog -S THIAGOMARCALSQLEXPRESS -d BaseBlog -i C:ScriptSQL.sql -o C:LogExecucao.txt

Explicando os atributos:

  • U: informa o nome do usu??rio que est?? conectando (no caso, o usu??rio thiago);
  • P: informa a senha do usu??rio (a senha ?? blog);
  • S: nome do servidor (como est?? na minha m??quina a inst??ncia ?? THIAGOMARCALSQLEXPRESS);
  • d: nome da base nova que receber?? o resultado do script (BaseBlog ?? o nome da nova base criada);
  • i: local onde salvei o script de dados e que usarei como entrada;
  • o: arquivo de texto contendo o resultado da opera????es (log para an??lise – opcional).

D?? ENTER e aguarde toda a opera????o ser executada. Para quaisquer tamanho do arquivo ele ser?? processado sem problemas. Se tentasse abrir pelo SQL Server um arquivo muito grande daria erro de aloca????o de mem??ria, ou demoraria e nem conseguiria executar exibindo alguns dos seguintes erros:

  • Cannot Open Datafile
  • Insufficient memory
  • Out of Memory Exception

Dessa forma ?? mais tranquilo…

Categorias
dicas web-service

HTTP 417 Expectation failed (falha de expectativa)

Dica r??pida! Esse erro ocorre quando tenta fazer uma requisi????o por WebRequest, Web-Service ou outra requisi????o entre computadores. Para sanar o problema use a chamada antes de realizar o processo:

System.Net.ServicePointManager.Expect100Continue = false;

Para saber mais detalhes sobre erros HTTP 417, acesse aqui.

Categorias
dicas dll google ip salvador

Localiza????o de Usu??rio: Obter Cidade e Estado pelo IP em ASP.NET

A um certo tempo atr??s isso era um pouco complicado de ser feito ou fic??vamos dependentes (muito) de ferramentas de terceiros. Hoje, claramente, posso afirmar que temos mais flexibilidade por??m continuamos atrelados. Mas n??o seja por isso! A Google disponibilizou uma API inovadora que nos ajuda nesse caso e em muitos outros (relativo ao GoogleMaps). O GoogleMaps.Subgurim.NET ?? um avan??ado controle do GoogleMaps para o ASP.NET e permite uma gama de manipula????es sobre suas funcionalidades e a que iremos demonstrar aqui ?? a de obter informa????es do usu??rio pelo IP (no site deles pode encontrar bem como c??digos avan??ados e demais exemplos). Em contrapartida, ?? preciso de um arquivo extra contendo faixas de IP distribu??das pelo mundo. Ent??o a MaxMind disponibilizou tamb??m um arquivo bin??rio contendo essas informa????es gratuitamente. Voc?? pode obter o arquivo aqui ou aqui (a diferen??a ?? que um ?? o link direto e o outro ?? a p??gina geral que pode-se obter em outros formatos). Esse arquivo ?? mensalmente atualizando inserindo novas faixas, logo, deixo o dica para dar sempre uma atualizada quando poss??vel (com isso aumenta mais a precis??o mas hoje, com esse arquivo, j?? realiza uma boa cobertura).
Para in??cio dos trabalhos, baixe o componente GoogleMaps.Subgurim.NET e o arquivo de faixas GeoLiteCity.dat. Crie um novo Web Site. Adicione a GMaps.dll na pasta Bin do projeto e copie o GeoLiteCity.dat tamb??m (coloque em outra pasta afim de organiz??-los – no meu caso coloquei em uma pasta chamada Data). Agora escreva o seguinte c??digo abaixo:

using Subgurim.Controles;

private void ObtemInfoUser()
{
    string database = Server.MapPath(“~/Data/GeoLiteCity.dat”);
    LookupService servico = new LookupService(database);
    Location localizacao = servico.getLocation(Request.ServerVariables[“REMOTE_ADDR”]);
    if (localizacao != null)
    {
        Response.Write(“Cidade: “ + localizacao.city + “<br />”);
        Response.Write(“Pa??s: “ + localizacao.countryName + “<br />”);
        Response.Write(“C??digo do Pa??s: “ + localizacao.countryCode + “<br />”);
        Response.Write(“Regi??o: “ + localizacao.region + “<br />”);
        Response.Write(“C??digo da ??rea: “ + localizacao.area_code + “<br />”);
        Response.Write(“Latitude: “ + localizacao.latitude + “<br />”);
        Response.Write(“Longitudade: “ + localizacao.longitude);
    }
}
 
Voc?? deve obter a sa??da algo do tipo:
 
Cidade: Salvador
Pa??s: Brazil
C??digo do Pa??s: BR
Regi??o: 5
C??digo da ??rea: 0
Latitude: -12,7636
Longitude: -15,2821
 
* Obs: a latitude e longitude s??o dados fict??cios que eu coloquei 😉
 
Se voc?? estiver testando localmente, n??o ter?? resultado pois o Request.ServerVariables[“REMOTE_ADDR”] ir?? trazer o valor 127.0.0.1. Para saber seu IP externo acesse o MeuIp e substitua-o para visualizar os valores e valid??-los. Em breve estarei escrevendo outros artigos mostrando como aproveitar bem a API do GoogleMaps bem como demais funcionalidades. At?? mais!

UPDATE: Ap??s ler, vejam aqui sobre o pl??gio que fizeram com meu artigo e depois acusaram que eu que copiei. Quem l?? o blog sabe como eu escrevo e como expresso minhas id??ias…

Categorias
clr dicas dll sql server visual studio

Utilizando fun????o de uma DLL Externa no SQL Server

Esse ?? um t??pico que ir?? mostrar algo que definitivamente voc?? j?? precisou mas n??o sabia como fazer e que facilitar?? (e muito) alguns trabalhos. Programadores que usam o Bando de Dados para programar sendo por Stored Procedure, Functions e Triggers j?? passaram por maus bocados para preparar um algoritmo que realizasse um determinado processo, mas que esse mesmo algoritmo ?? mais f??cil de ser escrito (ou possuir funcionalidades que o SGDB n??o possui) em outra linguagem de programa????o. Por exemplo: validar e-mail. ?? poss??vel no SQL Server fazermos um Function que receba um VARCHAR e retorne um BIT informando que um e-mail ?? v??lido ou n??o, contudo seria uma fun????o um tanto que trabalhosa para quem n??o est?? familiarizado com programa????o em banco. Para quem desenvolve em ASP.NET (C# ou VB.NET) basta usarmos express??o regular que, em duas linhas, resolve o problema. Portanto iremos utilizar uma fun????o escrita em C# compilada em uma DLL e usarmos em um Function no SQL Server. Isso ?? poss??vel atrav??s do CLR.
Primeiramente vamos criar a DLL contendo a fun????o (no nosso exemplo vamos fazer a que valida e-mail – mas voc?? pode desenvolver a que quiser). Abra o Visual Studio e crie um Project. Em Project Type escolha Visual C# Windows e o Template opte por uma Class Libary. Note que quando voc?? cria uma classe vem com o nome Class1.cs. Para facilitar a compreens??o, renomeie para FuncoesSql.cs (ou outra) e remova o namespace criado. Agora, escreva a fun????o que deseja e adicione os namespaces necess??rios ficando da seguinte forma:

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Text;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;

public partial class FuncoesSql
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlBoolean IsMailValido(SqlString email)
    {
        // Cria um objeto de express??es regulares para validar e-mail
        Regex expressaoRegular = new Regex(@”^(([^<>()[]\.,;:s@””]+”
        + @”(.[^<>()[]\.,;:s@””]+)*)(“”.+””))@”
        + @”(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}”
        + @”.[0-9]{1,3}])(([a-zA-Z-0-9]+.)+”
        + @”[a-zA-Z]{2,}))$”);

        // Realiza um teste na valida????o da express??o
        return new SqlBoolean(expressaoRegular.IsMatch(email.ToString()));
    }
}

No caso, precisamos explicitar os tipos de entrada e sa??da utilizados pelo banco de dados para que n??o haja problemas de tipagem. Poderia ser qualquer fun????o ou quantas que quisesse, contanto que respeite os tipos. Agora compile a DLL pressionando F6 ou pelo menu Build. J?? temos a DLL com a fun????o. Copie a DLL (que est?? na pasta binDebug de sua solu????o) e coloque-a em um local onde seu Banco de Dados possa busc??-la. Para exemplo, colocarei em C:SqlDlls no Servidor.
O pr??ximo passo ?? verificar se no SQL Server est?? ativo a funcionalidade CLR, para isso v?? em Iniciar > Todos os Programas > Microsft SQL Server 2008 (ou 2005) > Configuration Tools > SQL Server Surface Area Configuration. Entre em Surface Area Configuration for Features e na guia CLR Integration verifique se a fun????o est?? habilitada. Se n??o estiver, habilite.

D?? OK e agora j?? poder?? usar CLR no SQL Server. Abra o SQL Server Management Studio, conecte-se na base desejada e execute as seguintes instru????es SQL (abra um New Query para isso):

— CRIA O ASSEMBLY INDICANDO SUA ORIGEM
CREATE ASSEMBLY FuncoesSql FROM ‘C:SqlDllsFuncoesSqlServerASPNET.dll’
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
— CRIA A FUN????O
CREATE FUNCTION dbo.Fun_Valida_Mail (@email NVARCHAR(350))
RETURNS BIT
— INDICA A ORIGEM DA FUN????O SQL: ASSEMBLY > CLASSE > FUN????O
AS EXTERNAL NAME [FuncoesSql].FuncoesSql.IsMailValido
GO

Agora execute a Query (ou pressione F5)… Foi criada a fun????o! Pronto… agora ?? s?? usar como se fosse uam fun????o do SQL Server normalmente. Abaixo tem alguns exemplos de consulta e seus retornos:

Execu????es:
SELECT dbo.Fun_Valida_Mail(‘tmarcal@gmail’)
SELECT dbo.Fun_Valida_Mail(‘tmarcal@gmail.com’)
SELECT dbo.Fun_Valida_Mail(‘tmarcal.. @gmail.com’)
 
Retorno:
0
1
0
 
Apesar do trabalho inicial, pode-se aproveitar muito de ambos os recursos e criar cada vez mais fun????es complexas. Quanto ao desempenho da CLR, em compara????o ao T-SQL, deve-se ficar a mesma coisa. A diferen??a ?? praticamente impercept??vel. Espero que tenham gostado… At?? breve!