SQL Compact: Utilizar o IN (…) com um comando preparado

Já não é novidade para ninguém que a preparação de um comando que precisa de ser executado múltiplas vezes com diferentes valores melhora de forma muito sensivel a performance de execução da 2ª execução e das seguintes (no SQL Compact, o comando é efectivamente preparado na 1ª execução e não na invocação do método .Prepare). Para além disso, usar comandos SQL com parâmetros elimina os problemas por muitos conhecidos de ‘qual o formato da data’ ou ‘qual o separador decimal’ a utilizar ao passar valores deste tipo para o comando a executar.

Os parâmetros podem ser utilizados da forma mais convencional, como em…

UPDATE stocks SET qtd=@novaQtd WHERE artigo=@artigo

…mas uma questão encontrada com frequência é, como preparar um comando com uma cláusula WHERE com o operador IN, em que o nº de valores a procurar é desconhecido à partida ou até variável?

UPDATE stocks SET qtd=0 WHERE artigo IN (@artigo1, @artigo2, …, @artigon)

Nas versões completas do SQL, a solução proposta passa quase sempre por criar uma stored procedure para o efeito, mas o SQL Compact não suporta stored procedures, pelo que parecia não haver solução para este problema.

Ao encontrar esta questão pela enésima vez num fórum, reflecti mais um pouco e apresentei uma solução que produz o mesmo efeito.

Vamos supor que temos uma tabela clientes, da qual queremos actualizar o campo activo para 1 de acordo com a lista de códigos postais escolhidos pelo utilizador.

Para o efeito podíamos preparar o seguinte comando…

UPDATE clientes SET activo = 1 WHERE Patindex(‘[‘ + codigopostal + ‘]’, @codPostal) > 0

onde codigopostal é o campo da tabela de clientes com os códigos a procurar, e @codPostal um parâmetro a ser definido do tipo nvarchar. A função Patindex devolve a posição em que a 1ª string é encontrada na 2ª, devolvendo um valor superior a zero sempre que seja encontrada.

Para utilizá-lo, bastaria passar como valor para o parâmetro @codPostal, a lista de códigos escolhidos pelo utilizador, tendo o cuidado de ao compor a string com os mesmos, colocar parentesis rectos à volta de cada um deles, como por ex.:

[3850-000]{3850-010][3000-000]

Os parentesis rectos servem para ‘isolar’ cada um dos valores a ser procurados (ex., ao procurar mar, não fazer match com Maria, ou Tomar), assumindo que esses caracteres não são esperados dentro dos valores a serem pesquisados!

Caso queiram procurar datas ou valores numéricos, terão de os converter para string de modo a poderem ser concatenados com os parantesis rectos.

Windows Mobile 6.5 – Emulador já disponível!!!

Acabam de ser disponibilizados os emuladores de Windows Mobile 6.5 Standard e Professional em Inglês e outros idiomas, entre os quais não está compreendido o Português. Estes emuladores ajudam a perceber enquanto utilizador as novidades expostas pela nova versão do sistema operativo, como o novo ecrã de stand-by e lançador de aplicações, novo Internet Explorer Mobile, Windows Marketplace e outros, e para os programadores, testarem os seus widgets, enquanto não chegam às prateleiras os equipamentos com este sistema operativo.

image image 

O emulador de Windows Mobile 6.5 Proefessional prevê as resoluções QVGA (a mais habitual nos PDA touch-screen), VGA (ex. HTC Diamond), WQVGA (Samsung Omnia), WVGA (HTC Touch HD e Diamond II) e equipamentos com ecrã quadrado, enquanto a versão Standard prevê a variante clássica e a mais recente QVGA (Samsung i600, Motorola Q9, …).

Não há nenhum SDK específico para o Visual Studio associado a estes emuladores dado que não há novas funcionalidades expostas aos programadores para .NET CF, cujos controlos passam a ter suporte a gestos e apresentação algo mais cuidada, como as list view, sendo no entanto disponibilizados alguns exemplos de como controlar programaticamente o suporte a gestos nas nossas aplicações.

O download pode ser feito a partir da sequinte página:

http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=20686a1d-97a8-4f80-bc6a-ae010e085a6e

2 notas para terminar o post:

- algumas pessoas têm vindo a instalar e promover a instalação do Windows Mobile 6.5 em equipamentos actuais. Para além do aspecto legal da coisa, queria chamar a atenção que muitas roms foram disponibilizadas ou assentam em bits disponibilizados ainda antes desta nova versão do Windows Mobile 6.5 ter sido dada como finalizada pela Microsoft, pelo que a sua qualidade não será a de um produto final

- levantou alguma celeuma o facto da última CTP do Visual Studio 2010 não trazer suporte para projectos para Windows Mobile. A Microsoft já veio confirmar que tal facto não significa que de nenhum modo o suporte a desenvolvimento para Windows Mobile esteja comprometido, muito pelo contrário, simplesmente que até esse suporte, que se espera que seja melhorado, existir no Visual Studio 2010, teremos de continuar a usar o VS2008