Ao fim de sete vezes, ainda sinto que é uma honra pertencer a tão ilustre grupo.
E é com grande satisfação que escrevo esta entrada no novo sítio do PontoNetPT.
Pois é, ao fim de muitos testes e tentativas, conseguimos migrar os blogues do PontoNetPT da antiga plataforma para uma plataforma Community Server (gentilmente oferecida pela Telligent).
Está aberto o Registo para o Microsoft Tech•Ed Europe 2009.
Há algumas novidades este ano:
-
Devio aos pedidos dos participantes ambos eventos (Developer e IT Pro) coexistirão (9-13 Novembro).
-
-
Os preços de registo são baseados numa aproximação por camadas de modo que quanto mais cedo for efectuado o registo, mais barato fica.
Rasões Para Ir Ao Tech·Ed Europe 2009
-
Todos podem aprender sobre:
-
MICROSOFT WINDOWS 7 – O sistema operativo da Microsoft para a próxima geração
O Windows 7 trás importantes avanços para a produtividade dos utilizadores, segurança e gestão.
-
MICROSOFT OFFICE e novas formas de maximizar a produtividade do negócio
O percurso do Office System pode ajudar a instalação, adopção e desenvolvimento de aplicações de produtividade para o negócio.DEVELOPERS CAN LEARN MORE ABOUT:
-
Programadores e Arquitectos podem aprender sobre:
-
Aplicações na cloud
Descubram como a Azure™ Services Platform reduz a necessidade de aquisição anticipada de tecnhologia, e permite aos programadores e arquitectos criar, com rapidez e facilidade, aplicações que correm na cloud.
-
Segurança que ajuda a cortar custos no suporte às aplicações
Descubram como a tecnologia Microsoft’s ForeFront pode tornar os ambientes IT seguros com maior rapidez e a escrever código mais seguro e elimiar custos de suporte a aplicações.
-
TRUTH about maximizing deployments and search
Descubram como o SharePoint pode ajudar a criar um repositório central, maximizando as instalações e pesquisa e eliminando multiplas versões e mal-entendidos acerca da origem da “verdade” em qualquer project.
-
Profissionais de IT podem aprender sobre:
-
Virtualização que ajuda a podenciar investimentos existentes
Obtenham um entendimento profundo das actuais tecnologias de virtualização de baixo custo e como podem ajudar a tirar o maior partido dos investimentos existentes em software e hardware.
-
Hospedagem para economias de escala
Descubram como tirar partido dos hosted services Microsoft para ampliar a oferta de comunicações e colaboração dos departamenteos de IT. E baixar os custos de hardware, gestão e consumo de energia.
-
Unificação para redução de custos e aumento de eficácia
Comunicações verdadeiramente unificadas que formam uma infra-estrutura única de comunicações.
-
Maximizar a infrastrutura IT existente para se fazer mais om o que se tem
Descubram como tirar o máximo partido da infra-estrutura de IT existente.
DCom tudo desenvolvido e testado em no meu portátil usando oSQL Server 2008, era o momento de instalar na máquina de testes com SQL Server 2005.
O primeiro problema que encontrei quando executei:
CREATE ASSEMBLY [MyAssembly]
AUTHORIZATION [dbo]
FROM '...\MyAssembly.dll'
WITH PERMISSION_SET = SAFE
GO
foi:
Msg 10327, Level 14, State 1, Line 1
Assembly 'MyAssembly' references assembly 'system.xml.linq, version=3.5.0.0, culture=neutral, publickeytoken=b77a5c561934e089.',
which is not present in the current database.
SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from,
but that operation has failed (reason: 2(The system cannot find the file specified.)).
Please load the referenced assembly into the current database and retry your request.
Parece que o SQL Server 2005 não conhece a .NET Framework 3.5. Tinha de carregar as assemblies usadas: System.Core e System.Linq.Xml:
CREATE ASSEMBLY [System.Core]
AUTHORIZATION [dbo]
FROM 'C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll'
WITH PERMISSION_SET = SAFE
GO
Mas não é assim tão simples:
Warning: The Microsoft .Net frameworks assembly 'system.core, version=3.5.0.0, culture=neutral, publickeytoken=b77a5c561934e089, processorarchitecture=msil.' you are registering is not fully tested in SQL Server hosted environment.
Msg 6218, Level 16, State 2, Line 1
CREATE ASSEMBLY for assembly 'System.Core' failed because assembly 'System.Core' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database. CLR Verifier error messages if any will follow this message
[ : System.Diagnostics.Eventing.EventProvider::EtwRegister][mdToken=0x600003b][offset 0x0000003D][found Native Int][expected unmanaged pointer] Unexpected type on the stack.
[ : System.Diagnostics.Eventing.EventProvider::EncodeObject][mdToken=0x6000046][offset 0x00000000] Unmanaged pointers are not a verifiable type.
[ : System.Diagnostics.Eventing.EventProvider::WriteMessageEvent][mdToken=0x6000047][offset 0x0000003C][found ref 'System.String'] Expected numeric type on the stack.
[ : System.Diagnostics.Eventing.EventProvider::WriteEvent][mdToken=0x6000049][offset 0x0000012E] Instruction cannot be verified.
[ : System.Diagnostics.Eventing.EventProvider::WriteEvent][mdToken=0x6000049][offset 0x00000030] Instruction cannot be verified.
[ : System.Diagnostics.Eventing.EventProvider::WriteEvent][mdToken=0x600004a][offset 0x0000005F][found ref 'System.String'] Expected numeric type on the stack.
[ : System.Diagnostics.Eventing.EventProvider::WriteEvent][mdToken=0x600004b][offset 0x00000010][found unmanaged pointer][expected unmanaged pointer] Unexpected type on the stack.
[ : System.Diagnostics.Eventing.EventProvider::WriteTransferEvent][mdToken=0x600004c][offset 0x0000007D] Instruction cannot be verified.
[ : System.Diagnostics.Eventing.EventProvider::WriteTransferEvent][mdToken=0x600004c][offset 0x00000309][found Native Int][expected unmanaged pointer] Unexpected type on the stack.
[ : System.Diagnostics.Eventing.EventProvider::WriteTransferEvent][mdToken=0x600004d][offset 0x0000001B][found unmanaged pointer][expected unmanaged pointer] Unexpected type on the stack.
[ : System.Security.Cryptography.CapiNative::ImportSymmetricKey][mdToken=0x60007c2][offset 0x00000071][found address of Byte] Expected numeric type on the stac...
Bem, carrega-se com PERMISSION_SET = UNSAFE:
CREATE ASSEMBLY [MyAssembly]
AUTHORIZATION [dbo]
FROM '...\MyAssembly.dll'
WITH PERMISSION_SET = UNSAFE
GO
Ainda não:
Warning: The Microsoft .Net frameworks assembly 'system.core, version=3.5.0.0, culture=neutral, publickeytoken=b77a5c561934e089, processorarchitecture=msil.' you are registering is not fully tested in SQL Server hosted environment.
Msg 10327, Level 14, State 1, Line 1
CREATE ASSEMBLY for assembly 'System.Core' failed because assembly 'System.Core' is not authorized for PERMISSION_SET = UNSAFE.
The assembly is authorized when either of the following is true: the database owner (DBO) has UNSAFE ASSEMBLY permission and the database has the TRUSTWORTHY database property on; or the assembly is signed with a certificate or an asymmetric key that has a corresponding login with UNSAFE ASSEMBLY permission.
If you have restored or attached this database, make sure the database owner is mapped to the correct login on this server.
If not, use sp_changedbowner to fix the problem.
Mas fácil de resolver:
ALTER DATABASE MyDatabase SET TRUSTWORTHY ON
GO
I finalmente foi possível carregar as assemblies .NET 3.5:
CREATE ASSEMBLY [System.Core]
AUTHORIZATION [dbo]
FROM 'C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll'
WITH PERMISSION_SET = UNSAFE
GO
CREATE ASSEMBLY [System.Xml.Linq]
AUTHORIZATION [dbo]
FROM 'C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Xml.Linq.dll'
WITH PERMISSION_SET = UNSAFE
GO
Tendo todas as depêndencias carregadas, tentei carregar a minha assembly com PERMISSION_SET = SAFE sem sucesso:
Msg 6212, Level 16, State 1, Line 1
CREATE ASSEMBLY failed because method 'ShortPropsToXml' on type 'ShortProps' in safe assembly 'Esi.SA.Encyclopedia' is storing to a static field.
Storing to a static field is not allowed in safe assemblies.
Teve de ser com PERMISSION_SET = UNSAFE.
Depois de ter carregado as assemblies com sucesso, pude finalmente criar as definições Transact-SQL das funções (vêr Parte I e Part II).
Agora é que os DBAs não vão mesmo deixar-me usar isto. Mas foi divertido fazê-lo.
Pode-vos ter chamado a atenção o facto de eu ter usado LINQ nas minhaa últimas entradas de Brincando Com SQL Server CLR Integration (Parte I, Part II).
Não o consegui de imediato usando o projecto 2008 SQL CLR do Visual Studio. Alterar a Target Framework para .NET Framework 3.5 não foi suficiente. Foi necessário também editar o ficheiro .csproj:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!— ... -->
<ItemGroup>
<!— ... -->
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
</ItemGroup>
<!— ... -->
</Project>
Na minha última entrada, mostrei como converter um saco de propriedades armazenado como texto numa tabela usando um CLR Table-Valued Function.
Comecei a pensar que podia obter o valor das propriedades, mas não os podia alterar ou acrescentar novas propriedades.
Passar uma tabela como parâmetro ainda não é possível em SQL Server 2005, que seria a plataforma alvo.
Poderia criar funções para Criar, Actualizar e Apagar propriedades.
Ou poderia usar XML. Tudo o que seria necessário era criar uma CLR Scalar-Valued Function para converter o saco de propriedades numa representação em XML e outra para converter o XML de volta para o formato do saco de propriedades.
Ainda tenho de carregar todo o saco de propriedades para uma variável se quiser fazer alguma alteração, mas pode ser usado em SQL Server 2005.
Converter o saco de propriedades para um documento XML pode ser feito usando o enumerador desenvolvido anteriormente:
[Microsoft.SqlServer.Server.SqlFunction(
Name = "ShortPropsToXml",
IsDeterministic = true,
IsPrecise = false,
DataAccess = DataAccessKind.None,
SystemDataAccess = SystemDataAccessKind.None)]
public static SqlXml ShortPropsToXml(string shortPropsText)
{
var xml = new XElement("ShortProps",
from shortProp in ShortPropsEnumerable(shortPropsText)
select new XElement("p",
new XAttribute("n", shortProp.Key),
new XCData(shortProp.Value)));
using (var buffer = new MemoryStream())
{
using (var xmlWriter = XmlWriter.Create(buffer, new XmlWriterSettings { CheckCharacters = false }))
{
xml.WriteTo(xmlWriter);
}
buffer.Position = 0;
using (XmlReader xmlReader = XmlReader.Create(buffer, new XmlReaderSettings { CheckCharacters = false }))
{
return new SqlXml(xmlReader);
}
}
}
Converter o documento XML de volta ao formato do saco de propriedades também é fácil:
[Microsoft.SqlServer.Server.SqlFunction(
Name = "XmlToShortProps",
IsDeterministic = true,
IsPrecise = false,
DataAccess = DataAccessKind.None,
SystemDataAccess = SystemDataAccessKind.None)]
public static SqlChars XmlToShortProps(SqlXml shortPropsXml)
{
var xml = XDocument.Parse(shortPropsXml.Value);
var textBuilder = new StringBuilder();
foreach (var item in xml.Document.Element("ShortProps").Elements("p"))
{
textBuilder.AppendFormat("[[[{1}]]]{0}{2}{0}", Environment.NewLine, item.Attribute("n").Value, item.Value);
}
return new SqlChars(textBuilder.ToString().ToCharArray());
}
Agora é só actualizar a assembly na base de dados:
ALTER ASSEMBLY [MyAssembly]
FROM '...\MyAssembly.dll'
GO
Definir as Scalar-Valued Functions em Transact-SQL:
CREATE FUNCTION [dbo].[ShortPropsToXml](@shortPropsText [nvarchar](4000))
RETURNS [xml] WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [Esi.SA.Encyclopedia].[ShortProps].[ShortPropsToXml]
GO
CREATE FUNCTION [dbo].[XmlToShortProps](@shortPropsXml [xml])
RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [Esi.SA.Encyclopedia].[ShortProps].[XmlToShortProps]
GO
E está pronto para ser usado.
Agora, dada esta definição do saco de propriedades:
declare @text nvarchar(max)='[[[name1]]]
value1
[[[name2]]]
value2
[[[name3]]]
value3
'
Posso convertê-lo em XML:
DECLARE @xml [xml] = dbo.ShortPropsToXml(@text)
-
Alterar o valor de uma propriedade:
set @xml.modify('replace value of (/ShortProps/p[@n="name2"]/text())[1] with "new value2"')
-
Inserir uma nova propriedade:
set @xml.modify('insert <p n="name4">Value4.1
Value4.2</p> after (/ShortProps/p[@n="name2"])[1]')
-
Apagar uma propriedade:
set @xml.modify('delete (/ShortProps/p[@n="name3"])[1]')
-
E converter de volta para o formato de saco de propriedades:
print dbo.XmlToShortProps(@xml)
[[[name1]]]
value1
[[[name2]]]
new value2
[[[name4]]]
Value4.1
Value4.2
-
Consultar como se fosse uma tabela:
select T.C.value('./@n', 'nvarchar(max)') as Name, T.C.value('.', 'nvarchar(max)') as Value from @xml.nodes('/ShortProps/p') T(C)
| Name |
Value |
| name1 |
value1 |
| name2 |
new value2 |
| name4 |
Value4.1
Value4.2 |
Infelizmente, a aplicação usa caracteres que são inválidos para o SQL Server como caracteres XML e não posso usar estas funções.
Actualmente, estou a trabalhar com uma aplicação que armazena propriedades num saco num coluna SQL Server, no seguinte formato:
[[[name1]]]
value1
[[[name2]]]
value2.1
value2.2
[[[name3]]]
value3
Não me perguntem porque o fizeram assim, Apenas fizeram.
A aplicação descodifica este saco para as suas estruturas internas e tudo funciona bem.
Mas algumas vezes eu gostava de efectuar algumas consultas directamente à base de dados ou extraír alguns relatórios incluindo essas propriedaes e não posso.
Então pensei que este seria um bom caso de uso para a SQL Server CLR Integration. Decidi criar uma CLR Table-Valued Function que me retornasse o saco de propriedades como uma tabela com duas colunas.
Descodificar o texto do saco de propriedades pode ser facilmente alcançado usando uma simples expressão regular:
new Regex(
string.Format(@"(?<Name>(?<=\[\[\[).*(?=\]\]\]{0}))\]\]\]{0}(?<Value>(([\s\S]*?(?={0}\[\[\[))|([\s\S]*?(?={0}$))))", Environment.NewLine),
RegexOptions.Multiline | RegexOptions.ExplicitCapture | RegexOptions.CultureInvariant | RegexOptions.Compiled);
O Expresso da Ultrapico foi uma grande ajuda para criar esta expressão regular.
Para quem não sabe, a forma como uma CLR Table-Valued Function é implementada é usando um método inicial que recebe os parâmetros de entrada e retorna um IEnumerable e um método que recebe os itens do enumerador e retorna, como parâmetros de saída, as células da linha correspondente.
Como se tratam de pares nome-valor do tipo string, decidi usar instÂncias de )>) Structure" href="http://msdn.microsoft.com/library/5tbh8a42.aspx" target=_blank>KeyValuePair<string, string> para armazenar os itens e o construír o enumerador foi tão simples como:
private static IEnumerable<KeyValuePair<string, string>> ShortPropsEnumerable(string shortPropsText)
{
return from Match m in shortPropsRegex.Matches(shortPropsText)
select new KeyValuePair<string, string>(m.Groups["Name"].Value, m.Groups["Value"].Value);
}
E a implementação da CLR Table-Valued Function foi tão simples como:
[Microsoft.SqlServer.Server.SqlFunction(
Name = "ShortPropsToTable",
FillRowMethodName = "ShortPropsToTableFillRow",
TableDefinition = "Name NVARCHAR(4000), Value NVARCHAR(4000)",
IsDeterministic = true,
IsPrecise = false,
DataAccess = DataAccessKind.None,
SystemDataAccess = SystemDataAccessKind.None)]
public static IEnumerable ShortPropsToTable(string shortPropsText)
{
return ShortPropsEnumerable(shortPropsText);
}
public static void ShortPropsToTableFillRow(object item, out SqlChars name, out SqlChars value)
{
KeyValuePair<string, string> shortProp = (KeyValuePair<string, string>)item;
name = new SqlChars(shortProp.Key);
value = new SqlChars(shortProp.Value);
}
Para usar esta função numa base de dados SQL Server são necessários alguns passos:
-
Carregar a assembly a base de dados:
CREATE ASSEMBLY [MyAssembly]
AUTHORIZATION [dbo]
FROM '...\MyAssembly.dll'
WITH PERMISSION_SET = SAFE
GO
-
CREATE FUNCTION [dbo].[ShortPropsToTable](@shortPropsText [nvarchar](4000))
RETURNS TABLE (
[Name] [nvarchar](4000) NULL,
[Value] [nvarchar](4000) NULL
) WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [MyAssembly].[ShortProps].[ShortPropsToTable]
GO
-
Habilitar a CLR Integration:
EXEC sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
E está pronto a usar.
Agora posso fazer consultas ao saco de propriedaes como se fosse uma tabela:
SELECT
e.[ID],
e.[Name],
e.[Class],
e.[Type],
p.[Name],
p.[Value]
FROM
dbo.Entity as e
CROSS APPLY dbo.ShortPropsToTable(e.[ShortProps]) as p
Apenas como curiosidade, para um pouco mais de 50000 linhas (que podem ser obtidas em cerca de 1 segundo no meu laptop), obtive um pouco menos de 630000 propriedades em menos de 40 segundos.
40 segundos podem parece muito quando comparados com 1 segundo, mas gostava de ver tempos melhores usando T-SQL. E desenvolver e testar a TVF em apenas um par de horas.
Se ao menos os DBAs me deixassem usar isto. CLR Integration não está conforme a “política de segurança” da empresa.
Estamos a migrar a comunidade PontoNetPT de uma versão antigado .TEXT para a última versão do Community Server (CS).
Porque o PontoNetPT tem cerca de 200 blogues com sei lá quantas entradas, comentários, referências, etc., estamos a usar a Community Server REST API.
O probelma com o uso desta API é que não cria a pasta que o CS pode ser configurasdo para criar com um ficheiro default.aspx para cada blogue que é criado através a sua consola de administração.
A importância desta pasta e ficheiro é fazer com que o IIS possa tratar os pedidos a http://<your community>/blogs/<your blog> ou http://<your community>/blogs/<your blog>/ como se fossem pedidos a http://<your community>/blogs/<your blog>/default.aspx.
Felizmente, estamos a correr em Windows 2008 e IIS 7 e tudo o que foi necessário foi instalar o Microsoft URL Rewrite Module 1.1 For IIS 7 e configurá-lo:
<configuration>
<!--...-->
<system.webServer>
<!--...-->
<rewrite>
<rules>
<rule name="Add Default.aspx to blog root URLs" stopProcessing="false">
<match url="^blogs/([^/]*)(/?)$" />
<action type="Rewrite" url="blogs/{R:1}/Default.aspx" />
</rule>
</rules>
</rewrite>
<!--...-->
</system.webServer>
<!--...-->
</configuration>
A Typemock está a lançar um novo produto para desenvolvimento em ASP.NET – o ASP.NET Bundle – e para o seu lançamento está a oferecer licenças GRÁTIS aos bloguers e seus leitores.
O ASP.NET Bundle é a ferramenta fundamental de testes unitários para quem desenvolve em ASP.NET, e é composto pelo Typemock Isolator e Ivonna, o add-on ASP.NET para o Isolator, a preços especiais.
Oferta de lançamento ASP.NET Bundle:
Para o lançamento do ASP.NET Bundle, a Typemock está a oferecer licenças grátis aos bloguers e seus leitores.
E como é que se ganham essas licenças?
Se é um bloguer, webmaster, ou colunista na internet, pode ganhar uma licença grátis ajudando a Typemock a lançar o seu novo ASP.NET Bundle, a ferramenta fundamental de testes unitários para quem desenvolve em ASP.NET.
Coloquem o texto abaixo no vosso blogue (tal como está, com os links) e digam-lhes. Se forem um dos primeiros 60 a enviar o e-mail, ganham uma licença!
Se tiverem um blogue dedicado a ASP.NET, ganham automaticamente a licença (mesmo que mais de 60 já tenham submetido) durante a primeira semana deste anûncio.
8 bloguers também ganharão 2 licenças adicionais (cada) para oferecer / sortear pelo seus leitores e amigos.
Os requisitos ão simples:
-
Têm de ter um website, blogue ou coluna na internet, com mais de 2 meses, ou obter permissão do dono.
-
A entrada tem de incluír o texto abaixo (incluindo os links) entre *Início* e *Fim*.
*Início*
Unit Testing ASP.NET? ASP.NET unit testing has never been this easy.
Typemock is launching a new product for ASP.NET developers – the ASP.NET Bundle - and for the launch will be giving out FREE licenses to bloggers and their readers.
The ASP.NET Bundle is the ultimate ASP.NET unit testing solution, and offers both Typemock Isolator, a unit test tool and Ivonna, the Isolator add-on for ASP.NET unit testing, for a bargain price.
Typemock Isolator is a leading .NET unit testing tool (C# and VB.NET) for many ‘hard to test’ technologies such as SharePoint, ASP.NET, MVC, WCF, WPF, Silverlight and more. Note that for unit testing Silverlight there is an open source Isolator add-on called SilverUnit.
The first 60 bloggers who will blog this text in their blog and tell us about it, will get a Free Isolator ASP.NET Bundle license (Typemock Isolator + Ivonna). If you post this in an ASP.NET dedicated blog, you'll get a license automatically (even if more than 60 submit) during the first week of this announcement.
Also 8 bloggers will get an additional 2 licenses (each) to give away to their readers / friends.
Go ahead, click the following link for more information on how to get your free license.
*Fim*
Assim que publicarem a entrada, enviem em e-mail para asp@typemock.com com o vosso nome e URL da entrada para ganhar a licença grátis.
Não percam tempo – a oferta é limitada aos primeiros 60 bloguers, ou bloguers dedicados a ASP.NET que publicarem na primeira semana.
Sigam o Blog, Site ou Twitter para actualizações.

Finalmente saíu o livro LINQ Com C# que eu e o Luís escrevemos. Bem, mais ele do que eu.
Este livro, editado pela FCA, destina-se a todos que, conhecendo já a linguagem C# 2.0, pretendem aprender as novidades introduzidas no C# 3.0 que levaram à LINQ (Language INtegrated Query). Os exemplos no livro estão em C#, mas no sítio do livro podem ser obtidos os exemplos em Visual Basic.
Tabela de Conteúdos:
PREFÁCIO
0. INTRODUÇÃO
0.1 O que posso encontrar neste livro?
0.2 Requisitos
0.3 A quem é que este livro é dirigido?
0.4 Convenções
0.5 Organização do livro
0.6 Suporte
1. INTRODUÇÃO AO LINQ
1.1 Porquê o LINQ
1.2 Variantes de LINQ
1.3 Vantagens decorrentes da utilização de LINQ
Resumo
2. GENÉRICOS
2.1 Os genéricos e o LINQ
2.2 Introdução aos genéricos
2.3 Classes abertas e fechadas
2.4 Utilização de argumentos de tipo
2.5 Overloads e overriding de membros de classes genéricas
2.6 Definição de constrangimentos
Resumo
3. BLOCOS DE ITERAÇÃO
3.1 Introdução aos blocos de iteração
3.2 Padrão IEnumerable
3.3 Blocos de iteração em C# 2.0
3.4 Implementação interna dos blocos de iteração
Resumo
4. FUNÇÕES ANÓNIMAS
4.1 Introdução aos métodos anónimos
4.2 Expressões Lambda
Resumo
5. VARIÁVEIS IMPLICITAMENTE TIPIFICADAS
5.1 Introdução
5.2 Arrays
Resumo
6. INICIALIZAÇÃO DE OBJECTOS
6.1 Introdução
6.2 Inicialização de colecções
Resumo
7. PROPRIEDADES IMPLEMENTADAS AUTOMATICAMENTE
7.1 Introdução
Resumo
8. TIPOS ANÓNIMOS
8.1 Introdução
Resumo
9.MÉTODOS DE EXTENSÃO
9.1 Introdução
9.2 Invocação de métodos de extensão
Resumo
10. LINQ TO OBJECTS
10.1 Introdução ao LINQ
10.2 Contextos LINQ
10.3 Introdução ao LINQ To Objects
Resumo
11. LINQ TO XML
11.1 Introdução
11.2 Utilizando LINQ para pesquisar XML
Resumo
12. LINQ TO SQL
12.1 Introdução
12.2 Estrutura da base de dados
12.3 Entidades
12.4 DataContext
12.5 Utilização de grafos de objectos
12.6 Relacionamentos 1:1
12.7 Relacionamentos 1:N
12.8 Relacionamentos N:M
12.9 Herança de entidades
12.10 Utilização de Stored Procedures
12.11 Invocação de funções
12.12 Actualização de dados
12.13 Criação de base de dados
12.14 Utilização de Logging
12.15 Ferramentas auxiliares ao desenvolvimento
Resumo
13. PLINQ
13.1 Introdução ao multiprocessamento
13.2 Introdução às Parallel Extensions
13.3 Introdução ao PLINQ
13.4 Ordenação de valores
13.5 Limitação do número de threads
13.6 Processamento das expressões de pesquisa
13.7 Tratamento de excepções
Resumo
14. SEGURANÇA E PROFILES
14.1 Opções para expandir o LINQ
14.2 O padrão de pesquisa LINQ
14.3 LINQ To Live Search
Resumo
BIBLIOGRAFIA
ÍNDICE REMISSIVO
O livro pode ser encontrado em várias livrarias, algumas com presença na Internet como por exemplo:
Ao contrário do que acontecia no Windows XP, no Windows Vista e no Windows 7, a lista de resultados de pesquisa não contem uma coluna com o caminho do ficheiro encontrado. Em vez disso, tem uma coluna com o formato <nome da paste que contem o ficheiro>(<caminho da pasta que contem o ficheiro>).
Não sei o porquê desta mudança, só sei que torna muito dificil ordenar os ficheiros encontrado por caminho.
Felizmente, a coluna do caminho do ficheiro pode ser adicionada à lista clicando a tecla direita o rato sobre as colunas e seleccionando a coluna correspondente ao caminho da pasta.
Infelizmente, não consegui descobrir como tornar esta configuração permanente. Tenho de o fazer para todas as pesquisas.
A Microsoft Portugal vai emitir uma série de sessões webcasts para quem pretenda dar início a uma carreira, acrescentar uma nova competência ao seu curriculum, rever matérias ou simplesmente estrear-se num hobby divertido - agora, tudo depende de cada um!
Orador
Pedro Rosa
Developer Advisor
Microsoft Portugal
Registem-se em cada uma das sessões webcast para receber o respectivo link de acesso
-
Como utilizar o Visual Studio 2008 e quais as ferramentas adicionais necessárias para desenvolver de forma fácil e em qualidade: testes Unitários, testes de Carga, Code Profiling, Gestor de fontes, utilitários, entre outros, para facilitar o seu desenvolvimento.
-
27 Maio 2009 - Desenvolvimento de Aplicações Web utilizando o VS2008 Saiba como utilizar o Visual Studio 2008 na criação de aplicações Web de forma fácil e rápida, utilizando ASPX, AJAX, Dynamic Controls, Data Binding, controlos de navegação e de autenticação. Saiba como em poucos clicks pode criar uma aplicação funcional.
-
As aplicações instaladas no seu pc perderam interesse? Será que continuam a fazer sentido? Saiba como utilizar o Visual Studio 2008 na criação de aplicações Cliente Rico, de forma fácil e rápida, utilizando: Windows Presentation Foundation, LINQ, ClickOnce Deployment, Enterprise Library, entre outros.
-
Múltiplos clientes? Múltiplos Interfaces de trabalho? Como resolver o problema?
Saiba como utilizar Windows Comunication Foundation na construção de aplicações orientadas a serviços.
Mantenham-se informados subscrevendo a MSDN Flash portuguesa, a newsletter quinzenal com as actualizações de que precisam!
A maioria das empresas faz cópias regulares dos seus sistemas e mantém-nas por um certo tempo.
Mas, para além de restaurar uma cópia do dia anterior ou parte de uma outra cópia anterior, estas cópias são realmente úteis? Serão úteis dentro de 3, 4, 5 ou 10 anos?
Actualmente, a tendência para o uso de virtualização aumenta a probabilidade de sucesso ao restaurar uma cópia no futuro. Mas alguns sistemas têm licenças temporizadas e com verificação remota em tempo de execução e corre-se o risco de se acabar com um restauro com sucesso mas que não se consegue usar.
E se o hardware para correr o sistema (virtualizado ou não) já não existir?
A solução é fazer cópias dos dados de negócio (em vez de fazer cópias dos dados dos sistemas) num formato interoperável, como por exemplo XML (que pode servir para armazenar conjuntamente dados e metadados).
O benefício acrescido é que, para além de situações de recuperação de desastre, facilita operações de migração de sistemas ou aplicações.
Isto não quer dizer que não é necessário fazer cópias de segurança dos sistemas. Claro que é necessário, mas apenas para fins operacionais.
É uma boa prática usar Windows Authentication nas ligações ao SQL Server porque deixa de ser necessário escreve uma password num ficheiro de configuração ou entrada no registo do Windows.
Esta prática também trás benefícios acrescidos no que diz respeito à governabilidade. Gerir utilizadores passa a fazer parte da administração do domínio e não da administração de cada instância de SQL Server.
Mas isto pode ser um problema se os utilizadores (neste contexto, o utilizador é alguém que necessita de efectuar uma qualquer tarefa de administração ou acesso directo à base de dados – um utilizador do SQL Server Management Studio) que ncessitam de se ligar à instância necessitam usar credenciais diferentes.
Uma forma de contornar este problema é usar o comando runas:
runas /user:DOMAIN\USERNAME "C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Ssms.exe"
Mas se se está num ambiente em que existem vários domínios e o sistema que se está a usar não pertence ao domínio da conta que se pretende usar para ligar à instância, obtem-se o seguinte rro:
RUNAS ERROR: Unable to run - C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Ssms.exe
1787: The security database on the server does not have a computer account for this workstation trust relationship.
Mas nem tudo está perdido. Porque o que se pretende é estabelecer uma ligação remota, pode ser usado o selector /netonly, e tudo funciona:
runas /netonly /user:DOMAIN\USERNAME "C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Ssms.exe"
O SQL Server Management Studio continua a listar todas as bases de dados da instância (ao contrário do que aconteceria se a ligação fosse feita a partir de um sistem usando um sessão de utilizador da conta com se pretende ligar à instância), mas o ApexSQL Edit apenas listará as bases de dados a que a conta tem acesso.
| |
| Já estão disponíveis as gravações das sessões Best of DevDays09 gravadas durante o mês de Abril. |
Mantenha-se informado subscrevendo a MSDN Flash portuguesa ... ... a newsletter quinzenal com as actualizações de que precisa. |
| |
A próxima geração do Windows® está quase a chegar!
A Microsoft criou um video-blogue, que arrancará oficialmente no inicio de Maio, chamado Talking About Windows (Falando De Windows).
Este video-blogue providencia uma visão profunda sobre o Windows 7 dada pelos engenheiros da Microsoft que ajudaram a construir o produto.
Adicionalmente, providencia comentários de profissionais de IT e as suas experiências com este novo sistema operativo.
Podem assistir aos videos e comentá-los.
Só é pena não poder subscrever os vídeos para os poder assisttir no meu Zune.
Watch. Connect.
www.talkingaboutwindows.com