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!

Categorias
crystal reports dicas dll

N??o foi poss??vel carregar arquivo ou assembly System.Web.Extensions, Version=2.0.0.0

Dica r??pida para quem tiver esse erro…
Acontece quando est?? utilizando uma vers??o do ASP.NET Ajax diferente do Framework da aplica????o. Muitas vezes, tamb??m, acontece quando est?? utilizando o Crystal Report ao renderizar um relat??rio. Ent??o ?? exibido a seguinte mensagem:
A solu????o ?? simples: basta remover a System.Web.Extensions.dll e/ou System.Web.Extensions.Design.dll do projeto (na pasta Bin).

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)

Categorias
dicas sql server

Dicas de Instru????es SQL para facilitar o uso no dia-a-dia

Bom, abaixo separei algumas instru????es SQL que muitos programadores tem d??vidas de como us??-las e que facilitam muitas tarefas.

1) INSERT de SELECT: Fazer inser????es em uma tabela puxando dados de outra(s)

Bem parecido com o SELECT INTO por??m voc?? pode fazer v??rias manipula????es conforme desejar usando um simples SELECT. No caso vou mostrar um exemplo bem f??cil: irei adicionar v??rios Alunos numa tabela sendo que os dados est??o em outra tabela (Cadastros), logo minha instru????o ficaria assim:

INSERT INTO Alunos (nome, email) SELECT nome, email FROM Cadastros

O nome dos campos n??o precisam serem iguais, basta estar na mesma ordem e respeitar o tipo de dados (tamanho tamb??m).

2) UPDATE relacionado com outra tabela

Nessa situa????o o que desejamos ?? fazer um UPDATE na tabela sendo que ?? preciso fazer um JOIN com outra tabela. No nosso exemplo: desejamos alterar o preco de um produto sendo que o valor do mesmo est?? relacionado com seu tipo e ele est?? armazenado em outra tabela. Logo podemos usar a seguinte instru????o:

UPDATE Produto SET preco = T.preco FROM Produto AS P, Tipo AS T WHERE P.Id_Tipo = T.Id

Meio complicado quando se v??, n??? Mas se voc?? reparar detalhadamente ver?? que a atualiza????o do pre??o ?? feita, para cada produto, quando o Id_Tipo (da tabela Produto) for igual ao Id (da tabela Tipo) obtendo assim o preco (da tabela Tipo).

3) Remover registros duplicados deixando apenas um

A explica????o desse objetivo ?? bem ??bvia: remover registros duplicados em uma determinada tabela sob,algum crit??rio. Por??m, sua sintaxe ?? mais complicada, mas vamos l??… Para nosso exemplo iremos remover os registros duplicados (ou mais que um) de e-mails deixando apenas um na tabela Mailing:

;WITH Listagem(email, ranking)
AS
(
SELECT email
,ranking = DENSE_RANK() OVER(PARTITION BY email ORDER BY NEWID() ASC)
FROM Mailing WITH (NOLOCK) WHERE email IS NOT NULL 
)
DELETE Listagem WHERE ranking > 1

Esse emaranhado de instru????es se resume em gerar um ranking indicando quantas vezes o registro se repete. Esse ranking ?? armazenado em uma tabela “tempor??ria” (tabela Listagem) com refer??ncia ?? original (tabela Mailing)… Logo que ?? gerado o ranking, ?? feita a exclus??o dos registros que possuem ranking maior que 1, ou seja, apaga todos aqueles que est??o se repetindo deixando apenas um deles.

Bem, ?? isso! Espero ter ajudado… Lembrando que os exemplos acima foram os mais simples e voc??s podem encontrar situa????es semelhantes ou piores mas que, usando-os, podem ajudar a chegar na resolu????o.

Categorias
dicas javascript jquery mootools

Problema do Mootools dentro de um frame

O Mootools ?? um framework JavaScript para criar abas com um belo design e praticidade no uso. Por??m verifiquei que ele tem um certo “probleminha de comportamento” quando o usa dentro de um frame / frameset no IE. O seu carregamento / aplica????o de estilo se d?? atrav??s de uma adi????o de uma fun????o chamadora na janela (usando window.addEvent). A condi????o para execu????o do script se d?? quando o DOM estiver pronto, ou seja, window.addEvent(‘domready’,function({})); . O problema ?? que, para o Internet Explorer (IE) o carregamento da p??gina ?? meio que desordenado enquanto o Firefox e Chrome (n??o testei nos demais navegadores) possuem uma ??tima engine de carregamento de p??gina. Ou seja, ?? vezes o conte??do da p??gina demora a ser carregado e o DOM fica pronto antes dos controles HTML serem devidamente carregados ocasionando erro na execu????o. Para contornar o problema, basta substituir o ‘domready‘ por ‘load‘. Ent??o a aplica????o do Mootools sobre o conte??do ser?? providenciado logo que a p??gina for totalmente carregada. O problema ?? se houver muito conte??do na p??gina e houver demora no carregamento da p??gina pois o estilo ser?? aplicado apenas no final… da?? ?? s?? ter mesmo paci??ncia (ou remove do frame)!

Obs: outros frameworks JavaScript podem vir a ocasionar o mesmo problema sob as mesmas circunst??ncias.

Categorias
dicas mem??ria sql server

Problema no uso de mem??ria no SQL Server 2008

Se em algum momento, quando em trabalho, estiver recebendo uma das seguintes mensagens abaixo, voc?? est?? tendo s??rios problemas de uso de mem??ria:

“There is insufficient system memory in resource pool ‘internal’ to run this query” *
ou
“H?? mem??ria de sistema insuficiente no pool de recursos internos para executar essa consulta” *

Isso ocorre quando h?? v??rias instru????es SQL sendo executadas em seq????ncia. Como o pool n??o aguenta, os dados, em algumas vezes, podem travar… Mesmo que fisicamente eles estejam l??, n??o se pode mais ser utilizados at?? que o banco seja reiniciado. Para corrigir esse problema h?? duas formas: instalar o hotfix que a Microsoft disponibilizou ou reduzir quantidade de instru????es a serem executadas por vez.

1) Instalar o HotFix

O arquivo est?? dispon??vel em um pack cumulativo p??s SP1 do SQL Server 2008. Para mais informa????es e download, clique aqui.

2) Reduzir a quantidade de instru????es SQL

Fazendo um teste de v??rios UPDATE’s seguidos, consegui obter tal erro. Gerei um arquivo .sql com quase 100mil updates e mandei o SQL Server executar, da?? obtive o erro. Nunca tente isso! Se desejar executar v??rios UPDATE’s ou INSERT’s de vez fragmente a execu????o das instru????es em blocos (nem t??o grandes e nem t??o pequenos) dando uma pausa entre as execu????es. Pode-se utilizar uma Store Procedure buscando os dados em um tabela tempor??ria e executar a instru????o de forma gen??rica (INSERT com SELECT, por exemplo). Tamb??m pode-se usar um artif??cio do ASP.NET, Batch Update, para executar a instru????o de forma gen??rica com alto desempenho.

* A depender da configura????o do SQL Server, ao inv??s de ser o recurso interno (ou internal) pode ser o recurso default.

Categorias
dll flash gr??ficos xml

Gerando Gr??ficos em ASP.NET

Um componente que gosto de utilizar para gerar gr??ficos ?? o FusionCharts. Atrav??s dele ?? poss??vel criar gr??ficos animados e interativos em Flash como gr??ficos em pizza, barra, colunas, funil, linha, ??rea, bolha, etc. Al??m de trabalhar com ASP, ASP.NET, PHP, JSP, ColdFusion, Ruby on Rails, Python e HTML puro, pode-se utilizar em conjunto com bancos de dados como SQL Server, Oracle, MySQL, PostgreSQL, etc… O seu funcionamento consiste em apenas gerar o XML (em tempo de execu????o ou n??o) e indicar qual o gr??fico. Vamos ?? pr??tica…

Acesse o site da FusionCharts e baixe o pacote com os gr??ficos (na vers??o trial vem apenas os gr??ficos comuns – os mais complexos vem na vers??o paga). No arquivo baixado vem os SWF’s dos gr??ficos, exemplos de XML’s a serem gerados para cada gr??ficos, o JavaScript a ser incorporado na p??gina e demais documentos (qualquer d??vida veja na pasta Code > CSNET que cont??m um exemplo em ASP.NET e cont??m todos os arquivos que ir?? precisar). Para nosso exemplo, vamos gerar um gr??fico em pizza.

Crie um Web Site e adicione as pastas conforme a estrutura abaixo:

Adicione no App_Code as classes Util.cs e DbConn.cs. Na Bin adicione a refer??ncia ?? DLL da FusionCharts.dll, na Graficos adicione o SWF do gr??fico que iremos gerar (no caso escolha o Pizza3D.swf) e na pasta Js adicione o FusionCharts.js. Todos esses arquivos s??o encontrados no ZIP que baixou no mesmo caminho dito anteriormente.

Adicione uma p??gina ASPX agora e adicione no body ou no head o script:
<script language=”Javascript” type=”text/javascript” src=”js/FusionCharts.js”></script>

Tamb??m adicione um Literal (Controle) no local onde dever?? surgir o gr??fico. Para fins did??ticos coloque o ID do controle como GraphPizza. Agora tudo ser?? no Code-Behind… Adicione os namespaces Utilities e InfoSoftGlobal usando a cl??usula using. Em seguida criamos um m??todo onde ?? gerado o XML e encapsulado sobre o SWF da seguinte forma:

public void CriarGraficoPizza3D()
{
    string strXML = “<graph showNames=’1′ caption=’Tipos de Clientes’ decimalPrecision=’0′>”;
    strXML += “<set name=’Alvos’ value=’10’ color=’ED1C24’/>”;
    strXML += “<set name=’Prospects’ value=’5′ color=’FFFF00’/>”;
    strXML += “<set name=’Clientes’ value=’2′ color=’00E600’/>”;
    strXML += “</graph>”;
    GraphPizza.Text = FusionCharts.RenderChart(“Graficos/Pizza3D.swf”, “”, strXML, “GraficoPizza3D”, “400”, “300”, false, false);
}

No caso, gero todo o XML contendo os dados a serem apresentados e o passo por par??metro ao m??todo do FusionCharts para renderiz??-lo e exibi-lo. Bem simples, n??o? Esse ?? o exemplo mais f??cil… H?? v??rias formas de apresent??-lo bem como suas op????es fazem com que apresente mais variantes. O mais dif??cil (quer dizer trabalhoso) ?? gerar o XML…