De que se trata o artigo

Este artigo tem por finalidade apresentar como o recurso denominado LINQ to SQL pode ser empregado na manipulação de informações que constem em um banco de dados SQL Server. Desta forma, não há necessidade de utilizar comandos SQL para realizar a persistência de dados de sua aplicação.

Em que situação o tema é útil

Aplicações que utilizam operações de consulta, inclusão, alteração e exclusão de informações em um banco de dados relacional costumam contar, em grande parte dos casos com uma codificação extensa no que se refere à lógica de acesso a dados. A utilização de um mecanismo que mapeie estruturas de um banco para o equivalente em um padrão orientado a objetos procura tornar mais produtivas atividades deste gênero, simplificando o processo de acesso a informações durante a codificação de um projeto. LINQ to SQL é um exemplo de recurso do .NET Framework que busca cumprir este objetivo, valendo-se de recursos que possibilitam o uso de LINQ sobre classes que equivalem a estruturas de um banco de dados.

LINQ to SQL - Utilizando LINQ para o acesso a bases de dados

A utilização de um banco de dados para a busca e/ou gravação de informações são realizadas via linguagem SQL ou por meio de mecanismos que mapeiam as estruturas de dados para objetos correspondentes. A prática citada neste segundo caso, pode se revelar mais produtiva em alguns cenários, como o desenvolvimento de interfaces de cadastro, nos quais a manipulação direta com objetos contribui para um código mais simplificado e menos extenso: a extensão LINQ to SQL procura ser uma alternativa neste sentido, oferecendo recursos que economizem esforços dos desenvolvedores em projetos que envolvam bancos de dados relacionais.

É inegável a importância que os bancos de dados relacionais exercem em variados aspectos do mundo dos negócios. A adoção deste tipo de tecnologia revolucionou a maneira como as informações eram tratadas, tornando possível uma série de análises gerenciais outrora impensáveis (por meio de aplicações de BI - Business Intelligence), permitindo o gerenciamento eficiente de grandes volumes de dados.

A plataforma .NET conta desde de seu início com a tecnologia de acesso a dados ADO.NET (ActiveX Data Object for .NET). Esta última é constituída por uma série de recursos que permite a manipulação dos mais variados tipos de estruturas existentes em uma base relacional, gerando suporte os principais bancos de dados para este tipo de mecanismo. Embora trate-se de um método que cumpre com eficácia os objetivos aos que se propõe, a transposição de informações obtidas via ADO.NET para o equivalente num modelo orientado a objetos exige esforços extras durante a codificação de uma solução.

Em artigos anteriores já foram demonstradas outras implementações do LINQ (Language-Integrated Query), como LINQ to Objects e LINQ to XML. Assim, o objetivo deste novo artigo é continuar a discussão sobre este recurso presente desde a versão 3.5 do .NET Framework, focando neste momento na apresentação do recurso conhecido como LINQ to SQL.

LINQ to SQL é um mecanismo que permite que se realizem consultas em base de dados, utilizando classes geradas a partir de um modelo visual disponibilizado pelo Visual Studio. A este tipo de técnica nos quais objetos correspondem a estruturas de uma base de dados relacional, dá-se o nome de mapeamento objeto-relacional ou ORM (sigla do inglês ORM - Object-relational mapping).

Devido a estas características, o uso de LINQ to SQL dispensa a necessidade de escrita de comandos SQL, valendo-se do suporte que o Visual Studio disponibiliza para o uso de LINQ durante a construção de uma aplicação (IntelliSense e checagem de erros de sintaxe antes da compilação). Consultas (queries) podem ser implementadas em C# ou VB.NET, numa abordagem similar adotada pela linguagem SQL. É importante frisar que os objetos gerados em LINQ to SQL disponibilizam métodos para a inclusão, alteração e exclusão de registros em uma base de dados.

A plataforma .NET oferece suporte nativo para o acesso ao SQL Server através de LINQ. Contudo, a utilização de outros tipos de bancos de dados estará condicionada à aquisição de soluções proprietárias desenvolvidas por outros fornecedores.

Este artigo tem por finalidade discutir a utilização de LINQ to SQL na construção de soluções dentro da plataforma .NET. Para isto, será demonstrado como operações de manipulação de dados (inclusão, atualização, exclusão e consultas) podem ser efetuadas em tabelas de um banco de dados relacional.

Nota: IntelliSense é a implementação da Microsoft de auto completar, mais conhecido por seu uso no Microsoft Visual Studio. Além de completar o que o programador está digitando, IntelliSense serve como documentação e desambiguação de nomes de variáveis, funções e métodos usando a reflexão.

Bancos de dados relacionais: uma visão geral

Um banco de dados relacional pode ser definido como uma coleção de diferentes tipos de dados relacionados de alguma forma, sendo que a partir disto consultas sobre os mesmos podem ser efetuadas. Além disso, operações CRUD podem ser realizadas sobre uma base relacional. A este tipo de procedimento em que dados são gravados com a possibilidade de serem recuperados posteriormente, dá-se o nome de persistência.

A aplicação de testes que será construída neste artigo, faz uso de uma base de dados SQL Server. Existem outros banco de dados largamente utilizados pelo mercado, sendo exemplos de soluções comercializadas o Oracle e o IBM DB2 (embora também possua versões gratuitas), assim como o Firebird, PostgreSQL e o MySQL.

As estruturas básicas que constituem um banco de dados relacional são as tabelas. Uma tabela, por sua vez, é formada por campos (colunas) e registros (linhas). Cada coluna possui um tipo de dado específico. A Tabela 1 lista alguns dos tipos mais comuns dentro do SQL Server, assim como o equivalente na plataforma .NET.

Tipo de Dado no SQL Server

Equivalente no .NET

Descrição

char

string

Texto com comprimento fixo.

varchar

string

Texto de comprimento variável.

datetime

DateTime

Representação de data / hora.

int

int

Representação de números inteiros, ou seja, sem casas decimais.

decimal

decimal

Valores numéricos com casas decimais.

Tabela 1. Algumas propriedades a serem preenchidas para controles dentro de FormPrincipal

Além da estrutura básica de uma tabela, um banco de dados geralmente possui os seguintes recursos:

• Stored procedures (procedimentos armazenados): rotinas criadas dentro de um banco de dados para a execução de uma série de instruções;

• Functions (funções): retornam um valor como resultado do seu processamento, com um comportamento similar ao das funções presentes em linguagens de programação;

• Triggers (gatilhos): conjunto de ações disparadas em resposta a algum evento que ocorra na base de dados.

Outro mecanismo normalmente presente em bases de dados relacionais é o controle transacional. Uma transação nada mais é do que uma ou mais operações que, se executadas com sucesso, produzem uma ação de resultado duradouro na base dados. Todo banco de dados que possibilite o uso de transações deve ser implementado seguindo um conjunto de características conhecido como ACID (sigla do inglês Atomicity, Consistency, Isolation, Durability):

• Atomicidade: um conjunto de ações deve ser executado como uma unidade, ou seja, se executado com sucesso todas as modificações devem ser persistidas (tabela vendas e itens_vendas, por exemplo), caso contrário, os resultados de todas as instruções já processadas e anteriores a um possível erro devem ser descartados.

• Consistência: o conjunto de instruções contido em uma transação somente será efetivado em um banco de dados caso o mesmo, por sua vez, não viole chaves primárias, chaves estrangeiras e outros tipos de restrições definidos em tal base;

• Isolamento: as ações desencadeadas por uma transação ainda ativa não podem estar disponíveis para outras transações;

• Durabilidade: uma vez que uma transação tenha sido efetivada, o resultado da mesma deverá estar disponível para a realização de ações subsequentes sobre a base de dados.

Mapeamento objeto-relacional

Conforme já mencionado anteriormente, frameworks ORM permitem a representação de estruturas de bancos de dados sob a forma de classes. Além da extensão LINQ to SQL, outros exemplos de mecanismos ORM populares são o Entity Framework (o qual também integra a plataforma .NET) e o NHibernate (ferramenta gratuita baseada no Hibernate da plataforma Java).

...
Quer ler esse conteúdo completo? Tenha acesso completo