quarta-feira, 20 de junho de 2012

T-SQL: Gerar queries dinamicamente em todos objectos de uma base de dados

-- O objectivo desta query é gerar queries no message output do SQL Management Studio sem usar CURSORs
-- Depois basta executar, copiar e validar o resultado
-- Pegar no SQL gerado e executar.

USE nome_da_base_de_dados

DECLARE @ID    integer
DECLARE @LAST_ID integer
declare @name nvarchar(255)

SET @LAST_ID = 0

WHILE @LAST_ID IS NOT NULL
BEGIN

   --alterar esta query para devolver o tipo de objectos pretendido
   --mais info sobre types e outras informações do sysobjects em:
   -- http://msdn.microsoft.com/en-us/library/ms190324.aspx
    SELECT @ID = MIN(id)
    FROM dbo.sysobjects
    WHERE id > @LAST_ID  AND type = 'P' AND category = 0
   
    SELECT @name = name
        FROM dbo.sysobjects
        WHERE id = @ID
   
    --alterar este print com o tipo de permissões ou outra ação sobre o objecto da base de dados
    print 'GRANT EXECUTE ON [' + @name + '] TO usp_myStoreProcedure'
    SET @LAST_ID = @ID
END

segunda-feira, 4 de junho de 2012

Microsoft Visual Studio 2012: Remover maiúsculas do menu de topo

O menu de topo do Visual Studio 2012 tem as letras todas em maiúsculas.


Para desactivar esta característica  e ficar com o menu em minúsculas é necessário adicionar uma chave no registry.
Para tal, basta adicionar a chave com o nome SuppressUppercaseConversion do tipo REG_DWORD com o valor 1 na localização indicada a seguir, consoante a versão.

Para a versão Microsoft Visual Studio 2012 RC criar a chave em:  HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\General

Para a versão Microsoft Visual Studio Express 2012 RC for Web criar a chave em:  HKEY_CURRENT_USER\Software\Microsoft\VWDExpress\11.0\General

Após a criação da chave é necessário reiniciar o Visual Studio 2012  e o menu aparecerá da seguinte forma.



Fonte: Richard Banks





quinta-feira, 24 de maio de 2012

Visual Studio 2010 lança vários web servers (cassini)

Estava a fazer debug (attach) a um processo especifico w3wp.exe e o VS2010 arrancava diversos webdevelopment servers (cassini).
É bastante fácil desligar/ligar esta opção, basta ir a cada host e ligar ou desligar a opção "Always Start When Debugging". Para mim isto é chato mas pode ser útil para quem queira lançar automaticamente vários web servers com portos fixos clicando apenas no Play (Start Debugging).


quarta-feira, 18 de abril de 2012

SQL Server 2008 - Terminar processos que estão a usar uma BD

Eu estava habituado a usar o Activity Monitor no SQL Management Studio 2005 mas na versão 2008 está ligeiramente diferente e na minha opinião "demasiado escondido".

Basta clicar com o botão direito na instância SQL e selecionar "Activity Monitor" a partir daqui é possivel ver alguns gráficos com a performance, processos que estão a usar quais BDs e termina-los, entre outras informações de performance.

terça-feira, 3 de abril de 2012

Recuperar acesso a uma instância SQL Server.

Para recuperar acesso a um SQL Server (por exemplo após mudar o nome da máquina), abrir o SQL Server Configuration Manager (All Programs > Microsoft SQL Server 2008 R2 > Configuration Tools).

Seleccionar o nó SQL Server Services > SQL Server (MSSQLSERVER) e abrir as propriedades.

Na tab Advanced adicionar ao Startup Parameters o sufixo ";-m" para correr em single user mode. Aí já é possível aceder à instância usando o SQL Server Management Studio e adicionar os users necessários para recuperar a instalação.

Mais detalhes no post original:
http://blogs.msdn.com/b/raulga/archive/2007/07/12/disaster-recovery-what-to-do-when-the-sa-account-password-is-lost-in-sql-server-2005.aspx

sexta-feira, 9 de março de 2012

T-SQL tranformar os dados pedidos na query select para um tipo diferente

Ao construir uma query sql precisava de analisar um inteiro e devolver uma string (ou booleano ou outra coisa qualquer) e o melhor que encontrei que funcionasse tipo "IF" para Selects foi o CASE:

SELECT Id, Price, Name,
     (CASE WHEN Stock > 0 THEN 'Em stock' ELSE 'Sem Stock' END)
 FROM Produtos
where  Category = 'Consolas'

segunda-feira, 9 de janeiro de 2012

C#: Invocar um construtor (com parâmetros) a partir de um metodo genérico .Net

Exemplo para construir uma instância de uma classe a partir de um método genérico, isto pode ser útil para usar um design pattern tipo Factory.

/* O objectivo deste método é invocar o construtor de qualquer classe que seja MyClass1 ou que herde desta e que não tenha o construtor sem parâmetros porque, para isso, bastaria usar além do where a keyword new, ex:  where T : ... new()  */

public T myGenericMethod(string p1, int p2) where T : MyClass1

     System.Reflection.ConstructorInfo constructorInfo =
            typeof(T).GetConstructor(new Type[] { typeof(string), typeof(int) });
 
    T myObject =
          (T)constructorInfo.Invoke(new object[] { p1, p2});

    return myObject;
}

Definindo esta função genérica posso instanciar qualquer classe derivada de  myClass1 que tenha um construtor com uma string e um inteiro como parâmetros. Por exemplo, supondo que existe uma classe chamada MyClass2 que herde de MyClass1:

/* exemplo de classe */
public class MyClass2 : MyClass1 { ... }

/* exemplo como usar o método */
MyClass2 exemplo =
        myGenericMethod("teste", 123);

Claro que isto não tem grandes vantagens assim à primeira vista, mas podemos centralizar operações criando o conceito de Factory.

quinta-feira, 5 de janeiro de 2012

Coded UI teclas especiais

No âmbito dos Coded UI (testes automáticos no Visual Studio 2010) ou de outras aplicações interactivas em que temos que simular comportamentos como se fossem o utilizador a escrever podemos usar a classe Keyboard:

Esta classe encontra-se no namespace: Microsoft.VisualStudio.TestTools.UITesting

Em conjunto com estas tabelas de referência:
http://msdn.microsoft.com/en-us/library/fx2k26ca%28v=vs.90%29.aspx
http://msdn.microsoft.com/en-us/library/dd433886.aspx
é possivel enviar comandos como se estivessemos a escrever no teclado, exemplos:

Keyboard.SendKeys("{DOWN}", ModifierKeys.Alt);
Keyboard.SendKeys("{RIGHT}");
Keyboard.SendKeys("{ENTER}");

Também é possivel definir o nº de repetições:
Keyboard.SendKeys("{LEFT 5}");
isto é o equivalente a pressionar a tecla para a esquerda 5 vezes.

Atualização:
Na assembly System.Windows.Forms.dll estão disponível os  métodos equivalentes ao anterior:
Exemplo:
System.Windows.Forms.SendKeys.SendWait("{b 10}");

Nota: esta última pode ser apenas dedicada aos WindowsForms...

#region Assembly Microsoft.VisualStudio.TestTools.UITesting.dll, v4.0.30319
// c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.TestTools.UITesting.dll
#endregion

segunda-feira, 2 de janeiro de 2012

.NET: Parsing e manipulação da QueryString

Em .NET existe o método HttpUtility.ParseQueryString quer permite efetuar o parsing da querystring devolvendo um objecto do tipo NameValueCollection
O objecto, do tipo NameValueCollection, permite fazer a manipulação da querystring suportando as seguintes operações:
  • adicionar, remover propriedades
  • consultar e modificar o valor das propriedades.

Exemplo:

NameValueCollection queryString = HttpUtility.ParseQueryString("?displaycode=deseja&feliz=2011");


// Obter o valor da propriedade
string ano = queryString["feliz"];

// Alterar o valor da propriedade
queryString["feliz"] = "2012";


// Remover a propriedade
queryString.Remove("feliz");

// Adicionar a propriedade
queryString.Add("feliz", "2012");

// Resultado: displaycode=deseja&feliz=2012
string resultado = queryString.ToString();



quarta-feira, 14 de dezembro de 2011

Problema no TFS após resolução de conflitos, como encontrar código ou texto perdido

Nunca tive grandes problemas com o TFS nomeadamente a resolver conflitos, mas ontem aconteceu que perdi um teste automático depois de resolver um conflito ao fazer GetLatest, o projeto permite check-out não-exclusivos e, sem perceber muito bem o que aconteceu, hoje ao fazer GetLatest, surpresa minha, o código do teste tinha desaparecido.

Sem investigar muito a razão do que aconteceu encontrei o meu teste no folder:
%TMP%\TFSTemp

Basta introduzir isto no Run no menu Iniciar do Windows para abrir o folder temporário onde o Team Foundation Server (client) guarda o ficheiro após a resolução de conflitos. Bastou-me fazer um find para encontrar o código desaparecido.

segunda-feira, 12 de dezembro de 2011

Função genérica para converter string num enumerado.

Uma  forma genérica para converter uma string num Enum, uso isto na forma de uma extensão.
Exemplo de utilização:
string s = "Primeiro";
PosicaoEnum teste = s.ToEnum<PosicaoEnum>();

public static T ToEnum<T>(this string s)
{
    T[] possibleValues = (T[]) Enum.GetValues(typeof(T));
    foreach(T val in possibleValues){
        string valString = val.ToString();
        if (valString == s)
        {
            return val;
        }
    }
    throw new ArgumentException(
        string.Format(
            "Cannot find \"{0}\" in the enum \"{1}\".",
            s, typeof(T).ToString()));
}

sexta-feira, 25 de novembro de 2011

Google Maps v3: Problema ao renderizar mapa oculto

Recentemente tive que implementar uma página com vários mapas do google, cada um dentro do seu separador (Tab).
O problema surgiu quando clico num separador, o mapa não renderiza como devia e não fica centrado na posição indicada.

A solução encontrada foi a seguinte:

Quando ocorre o clique no separador efectuar o seguinte:
  1. Guardar a posição.
  2. Disparar o evento resize para que o mapa redesenhe como devia.
  3. Centrar o mapa na posição que estava.

Aqui fica o código javascript com a solução.
function fixMap(map) {
    var center = map.getCenter();
    google.maps.event.trigger(map, "resize");
    map.setCenter(center);
}

quinta-feira, 24 de novembro de 2011

SharePoint 2010: Operador In, Caml

O SharePoint 2010 apresenta um novo operador nas Caml queries.
O operador em questão é o operador In que evita que tenhamos de escrever múltiplos Or.

Por exemplo, se tivermos o campo chamado Browser do tipo Text e quisermos procurar  os registos que têm  a palavra Firefox ou a palavra Chrome escrevemos a seguinte Caml query.

<Where>
  <In>
    <FieldRef Name='Browser' />
    <Values>
      <Value Type='Text'>Firefox</Value>
      <Value Type='Text'>Chrome</Value>
    </Values>
  </In>
</Where>

Como nem sempre as nossas queries são estáticas apresento uma forma de gerar o operador In dinamicamente através de uma coleção.

public static string InCaml(IEnumerable<string> items, string type, string name)
{
    string inFormat = "<Value Type='{0}'>{1}</Value>";

    var values = new StringBuilder();
    values.Append("<Values>");
    foreach (string item in items)
    {
        values.AppendFormat(inFormat, type, item);
    }
    values.Append("</Values>");

    var fieldRef = string.Format("<FieldRef Name='{0}' />", name);

    return string.Format("<In>{0}{1}</In>", fieldRef, values.ToString());
}


Exemplo de como chamar o método InCaml.

InCaml(new string[] { "Firefox""Chrome" }, "Text""Browser");

quinta-feira, 17 de novembro de 2011

Papercut - Servidor de SMTP

O Papercut é um servidor de SMTP que permite apenas receber e visualizar as mensagens.
É incrivelmente simples e prático, sendo bastante util para desenvolvimento de aplicações e não necessita de configurações.

quarta-feira, 16 de novembro de 2011

Deep compare de dois objectos em C#

Estava a implementar um teste e gostaria de comparar duas propriedades que eram classes complexas, no entanto é bastante complicado comparar todos os tipos de classes, sobretudo se forem colecções (IList, array, etc.). Após alguma pesquisa encontrei este projecto no codeplex que suporta a maioria dos tipos que uso no projecto:

http://comparenetobjects.codeplex.com/releases/view/47978

Este utilitário está todo implementado numa classe e usa reflection para correr as propriedades todas e é bastante fácil de usar com as opções default:

CompareObjects comparer = new CompareObjects();
return comparer.Compare(obj1, obj2);

domingo, 13 de novembro de 2011

Javascript: Converter uma string num array de caracteres

Em javascript para converter uma string num array de caracteres usamos o método split em que passamos por parametro uma string vazia.

Exemplo: 
"123456789".split("")

Resultado:
["1", "2", "3", "4", "5", "6", "7", "8", "9"]


quinta-feira, 10 de novembro de 2011

Parse do request no evento IDispatchMessageInspector.AfterReceiveRequest

Uma das melhores funcionalidades dos WCF WebServices é sua flexibilidade e capacidade de adicionar código nosso em quase qualquer parte do ciclo de vida do Request. Uma das hipoteses é usar um "inspector" de mensagens para, por exemplo, validar segurança ou alterar conteúdos de um Request.

Quando o pedido é recebido ainda não está deserializado para a respectiva classe .Net, achei problemático fazer esta deserialização. Após alguma investigação uma das formas que encontrei foi usar a classe TypedMessageConverter.

Nota: atenção que ao deserializar a mensagem é preciso criar uma cópia da Message usando este código:
MessageBuffer msgBuffer = message.CreateBufferedCopy(MaxMessageSize);
mais detalhes: http://social.msdn.microsoft.com/Forums/en/wcf/thread/cfef6695-8f6d-468f-9db5-8a27ee5a4b8f

Depois é possível deserializar o body da message com um método genérico:

public static T ParseBody(Message message)
{            TypedMessageConverter converter =
                  TypedMessageConverter.Create(typeof(T), message.Headers.Action);
            T body = (T)converter.FromMessage(message);
            return body;
}
mais detalhes: http://social.msdn.microsoft.com/Forums/en/wcf/thread/fd7f8df9-4a83-4285-be91-b9adb0c1888a

domingo, 30 de outubro de 2011

SharePoint 2010: Esconder a Ribbon dos utilizadores anónimos

No SharePoint 2010, para esconder a ribbon dos utilizadores anónimos é necessário utilizar o controlo LoginView do ASP.net.

No AnonymousTemplate colocasse a seguinte regra de CSS #s4-ribbonrow { display: none;} para esconder a ribbon.
Exemplo:
    <asp:LoginView ID="Loginview1" runat="server">
        <AnonymousTemplate>
            <style type="text/css">
                #s4-ribbonrow
                {
                    display: none;
                }
            </style>
        </AnonymousTemplate>
    </asp:LoginView>

quarta-feira, 19 de outubro de 2011

Lentidão no arranque do Firefox 7.0.1

Tenho notado alguma lentidão a abrir e a usar o Firefox 7.0.1, após alguma pesquisa no google a sugestão que funcionou para mim foi ir às Opções » Avançado » Geral » Desactivar Usar Aceleração por hardware quando disponível.

Realmente parece mais rápido tanto a abrir como a usar.

quinta-feira, 25 de agosto de 2011

Enumerações repetidas ao adicionar uma Service Reference no Visual Studio 2010.

Estava a criar um WCF WebService e estava a gerar enumerações duplicadas, exemplo:  enum Tipo, enum Tipo2, enum Tipo3, etc.
Reparei que cada uma desta enumerações na Reference.cs tinha um namespace diferente. Após alguns testes, esta combinação funcionou para mim:

[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.teste.pt/exemplo/Tipo", IsNullable = true)]
[DataContract(Namespace = "http://www.teste.pt/exemplo/Tipo")]
[XmlTypeAttribute(Namespace="http://www.teste.pt/exemplo/Tipo")]
 public enum Tipo { ... }

O último atributo parece ter sido o que corrigiu a situação, as outras duas já existiam. Isto ainda precisa de mais uns testes mas pode ajudar alguém.