Usando SQL Server Compact Edition 3.5 e LINQ To SQL
Não sei se você percebeu mas com o advento da nova versão da plataforma .NET , do Visual Studio e mesmo nas versões Express temos a disposição o SQL Server Compact Edition 3.5.
Por padrão o SQL Server Compact 3.5 é instalado para todas as versões do Visual Studio e esta disponível no ambiente de desenvolvimento local para uso com o LINQ to SQL.
Mas a distribuição de uma aplicação que usa o SQL Server e LINQ To SQL é um pouco diferente; como o SQL Server Compact 3.5 não é parte do framework .NET ele precisa ser empacotado com a aplicação ou baixado separadamente do site da Microsoft.
Para detalhes sobre o assunto veja o meu artigo : Usando SQL Server Compact 3.5
Como você já deve saber o LINQ To SQL é uma ferramenta que permite realizar o mapeamento objeto relacional entre as tabelas de um banco de dados SQL Server e o modelo e objetos do seu projeto. Será que podemos usar o LINQ to SQL com o SQL Server Compact 3.5 ?
Eu vou criar um novo projeto do tipo WIndows Forms Application usando o Visual Basic 2008 Express Edition chamado Linq_SqlCE;
Na janela DataSource vou clicar no link Add New Data Source para criar uma conexão com o banco de dados Northwind.sdf conforme descrito a seguir:
A seguir clique em Next> e verifique o nome do arquivo e a string de conexão. Clique em Next>
Clique em Next> e na próxima janela selecione as tabelas Categories e Products aceitando o nome padrão NorthwindDataSet e clique no botão Finish;
Agora clique com o botão direito do mouse sobre o nome do projeto e selecione Add New Item;
Na janela a seguir selecione LINQ To SQL classes e informe o nome NorthwindCE.dbml e clique em Add;
Neste momento já temos na janela DataSources a conexão exibindo as tabelas selecionadas e o descritor LINQ to SQL aberto.
A princípio teríamos apenas que selecionar as tabelas e arrastar e soltar no Descritor LINQ para gerar o datacontext e o mapeamento OR/M com as tabelas.
Certo ?
Errado !!!
Se você tentar arrastar e soltar as tabelas para o descrito LINQ não vai conseguir....
Infelizmente , o provedor SSCE não é suportado pelo descritos LINQ to SQL (por enquanto...).
Então não tem jeito ???
Tem jeito sim , vejamos como contornar o problema usando a ferramenta de linha de comando SQLMetal.
O LINQ to SQL possui um ferramenta a nível de linha de comando chamada SQL Metal que permite gerar classes de entidades, propriedades e associações de forma automática. É mais uma opção visto que você pode obter o mesmo resultado usando o Editor Visual do LINQ ou via código.
A localização padrão do SQLMetal é : \Programa Arquivos\Microsoft SDKs\Windows\vn.nn\Bin
Para maiores detalhes sobre a ferramenta leia o meu artigo : LINQ - SQLMetal
Vamos excluir o dataset criado e o arquivo .dbml gerado pelo descritor e vamos executar a ferramenta de linha de comando SQLMetal.exe sobre o banco de dados Northwind.sdf conforme a figura abaixo:
Note: que o meu banco de dados esta localizado na pasta c:\dados.
Os parâmetros que eu usei na execução da linha de comando foram:
O significado de cada um dos parâmetros que podem ser usados é visto na tabela abaixo:
Opção | Descrição |
/server:<name> | Representa o nome do SQL Server com o qual é feita a conexão |
/database:<name> | Representa o nome do banco de dados usado para gerar a classes de entidades |
/user:<name> | Representa o nome do usuário usado para efetuar a conexão |
/password:<name> | Representa a senha do usuário usado para efetuar a conexão |
/conn:connectionString | Permite definir uma string de conexão com o banco de dados |
/timeout:<value> | Permite definir o timeout (em segundos) para o usuário para cada comando |
/views | Obtêm as views do banco de dados |
/sprocs | Obtêm as funções do usuário do banco de dados |
/dbml:<filename> | Permite
definir um nome de arquivo dbml que conterá os metadados
do banco de dados e informação sobre classes e propriedades |
/code:<filename> | Permite definir o nome do arquivo que conterá as classes de entidades e o data context |
/map:<filename> | Obtêm um
arquivo XML externo com atributos de mapeamento. As
entidades produzidas no código não conterão classes e declaração de atributos de propriedades visto que elas são incluídas no arquivo de mapeamento XML |
/language:<name> | Existem duas opções: C# ( o padrão ) e VB. |
/namespace | Permite definir o namespace que irá conter as classes de entidades geradas |
/context:<name> | Você pode definir o nome da classe derivada pela classe DataContext. |
/entitybaet:<name> | Você pode
indicar o nome da classe de entidade base a partir da
qual outras entidades irão herdar |
/pluralize | Obtêm a classe de entidade e nomes das propriedades |
/serialization:<name> | Gera classes serializáveis. Valores possíveis: None e Undirecional. |
/provider:<name> | Permite
definir o nome do provedor a ser usado para conectar com
o banco de dados valores possíveis: SQLCompact, SQL2000 e SQL2005 |
Com isso teremos o arquivo de mapeamento objeto relacional NorthwindCE.dbml gerado.
Em seguida vamos importar o arquivo .dbml gerado pela ferramenta para o nosso projeto clicando com o botão direito do mouse sobre o nome do projeto e selecionando Add Existing Item;
Após este passo já podemos abrir o arquivo NorthwindCE.dbml gerado:
Podemos ver também os arquivos contendo o código que realiza o mapeamento para as tabelas do banco de dados Northwind.sdf;
Agora só falta usar o mapeamento gerado e mostrar que realmente funciona. Inclua um controle DataGridView e um controle MenuStrip no formulário padrão form1.vb;
A seguir no evento Click do Menu Carregar inclua o código abaixo:
Private
Sub
CarregarToolStripMenuItem_Click(ByVal
sender As
System.Object, ByVal
e As System.EventArgs)
Handles
CarregarToolStripMenuItem.Click Dim db As NorthwindCE.DataAccess.NorthwindCE = New NorthwindCE.DataAccess.NorthwindCE("c:\dados\Northwind.sdf") DataGridView1.DataSource = From produtos In db.Products End Sub |
Na primeira linha eu estou criando uma instância do DataContext para poder ter acesso a coleção de objeto mapeada pela ferramenta SQLMetal. ( Lembre-se que NorthwindCE.DataAccess foi o namespace que criamos quando usamos a ferramenta.)
A seguir estou acessando todos os dados da tabela Products do banco de dados Northwind.sdf.
Agora execute o projeto(F5) e clique no menu Carregar:
Pronto temos exibido no DataGridView os dados da tabela Products usando o LINQ com o SQL Server Compact 3.5, onde o mapeamento foi gerado pela ferramenta SQLMetal e acessada no descritor LINQ do projeto.
Eu sei é apenas LINQ mas eu gosto...
Referencias:
José Carlos Macoratti