ASP .NET - Acesso básico a dados com LINQ to SQL


O desenvolvimento de aplicações para acesso a banco de dados usando a plataforma .NET não sofreu grande alterações desde o seu lançamento. Geralmente você começa definindo o seu banco de dados , tabelas, relacionamentos, em seguida  parte para a definição das classes de forma a procurar representar o domínio do seu negócio e finalmente usa as mesmos conceitos abstratos básicos de programação : definindo objetos Connection, objetos Command, objetos datareader, objetos dataset, etc.

Muitos desenvolvedores já tem sua biblioteca de funções prontas ou usam recursos de terceiros ou mesmo da Microsoft como os Data Application Blocks. 

Ficamos tão acostumados como uma forma de escrever código que muitas vezes não percebemos que temos novos recursos a disposição que irão garantir um melhor desempenho e manutenção. Afinal se esta funcionando, é o que importa, pensamos...

A partir da versão 3.0, e consolidada na versão 3.5 da plataforma .NET, temos um leque de novas funcionalidades que nos dão um ganho muito grande de produtividade. Uma delas , o foco deste artigo é o LINQ to SQL.

Neste artigo eu vou mostrar como usar os novos recursos do LINQ to SQL para efetuar o mapeamento para tabelas de um banco de dados SQL Server e em seguida usar os recursos da linguagem LINQ de forma  ter um código enxuto e eficiente. Bem diferente da forma como estávamos acostumados a fazer.

E vou criar uma aplicação web , mas poderia ser uma aplicação windows forms , e, usando a linguagem VB .NET vou efetuar o mapeamento OR/M para uma tabela Alunos do banco de dados Teste.mdf criado no SQL Server 2005 Express Edition sem usar o assistente e o descritor objeto Relacional disponível, dessa forma podemos entender um pouco melhor como as coisas funcionam.

Como não é objetivo deste artigo eu não vou mostrar como criar o banco de dados e a tabela no Visual Web Developer 2008 Express  mas essa é uma tarefa bem simples, se você tiver dúvidas consulte as referências para maiores detalhes.

Abaixo temos o banco de dados Teste.mdf e a tabela Alunos definida com os campos : id, nome e email onde o campo id é uma chave primária do tipo identity;

Ao lado temos a tabela exibindo alguns dados que eu inclui para usar no projeto deste artigo.

O banco de dados será copiado na pasta App_Data.

Em seguida defina o arquivo web.config a string de conexão usada para acessar o banco de dados Teste.mdf:

<connectionStrings>
  <add name="connectionStringAlunos" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename='C:\Documents and Settings\macoratti\_ 
   Meus documentos\Visual Studio 2008\Projects\linq_Entities\linq_Entities\App_Data\Teste.mdf';_ 
   Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/>
</connectionStrings>

Observe que temos o nome connectionStringAlunos a string de conexão usada.

Nota: Na sua máquina local a string de conexão pode ser diferente , atente para este detalhe.

No exemplo deste artigo eu vou usar o Visual Web Developer 2008 Express Edition que já dá suporte ao LINQ to SQL e permite efetuar o mapeamento objeto relacional.

Abra o VWD 2008 e crie um novo web site a partir do menu File-> New web site com o nome de acessoLINQ usando a linguagem VB .NET;

A seguir a partir no menu Web Site -> Add New Item, selecione o template Class e informe o nome LINQ.vb e clique em Add; (O arquivo será copiado na pasta App_Code)

Antes de iniciar clique com o botão direito do mouse sobre o nome do projeto e selecione Add Reference , e , a partir da janela Add Reference inclua a referência a System.Data.Linq;

Agora vamos criar a classe que vai efetuar o mapeamento OR/M com a tabela Alunos do nosso banco de dados. Veja o código a seguir:

Imports System
Imports System.Data.Linq.Mapping
<Table(name:="Alunos")> _
Public Class aluno
    Private _id As Integer
    Private _nome As String
    Private _email As String
    <Column(IsPrimaryKey:=True, IsDbGenerated:=True)> _
    Public Property Id() As Integer
        Get
            Return _id
        End Get
        Set(ByVal value As Integer)
            _id = value
        End Set
    End Property
    <Column(CanBeNull:=True)> _
    Public Property Nome() As String
        Get
            Return _nome
        End Get
        Set(ByVal value As String)
            _nome = value
        End Set
    End Property
    <Column(CanBeNull:=True)> _
    Public Property Email() As String
        Get
            Return _email
        End Get
        Set(ByVal value As String)
            _email = value
        End Set
    End Property
End Class
Definimos a classe aluno mapeada para a tabela Alunos e definimos 3 propriedades:
  • Id()
  • Nome()
  • Email()

cada uma delas sendo mapeada para a coluna correspondente da tabela Alunos;

Com isso já teremos o acesso via entidade criada no mapeamento.

A classe aluno representa a tabela Alunos do banco de dados.

 

 

 

Vamos agora criar a interface na página Default.aspx. Inclua a partir da ToolBox os seguintes componentes nesta página:

Defina o seguinte leiaute na página:

Agora vamos definir o código associado ao evento Click do botão Procurar:

 Protected Sub btnProcurar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnProcurar.Click
        Dim conexao As String = ConfigurationManager.ConnectionStrings("connectionStringAlunos").ConnectionString.ToString
        Dim db As New DataContext(conexao)
        Dim tAlunos As Table(Of aluno)
        tAlunos = db.GetTable(Of aluno)()
        gdvAlunos.DataSource = tAlunos.Where(Function(a) a.Nome.Contains(txtNome.Text))
        gdvAlunos.DataBind()
    End Sub

1- Obtemos a string de conexão a partir do arquivo web.config:

        Dim conexao As String = ConfigurationManager.ConnectionStrings("connectionStringAlunos").ConnectionString.ToString

2- Criamos uma instância da classe DataContext usando a conexão obtida;

           Dim db As New DataContext(conexao)

3- Definimos um objeto tAlunos do tipo Table(Of )

        Dim tAlunos As Table(Of aluno)

4- Obtemos a tabela ALunos a partir do contexto criado através do método GetTable<> que referencia o nome da classe aluno e não nome da tabela;

        tAlunos = db.GetTable(Of aluno)()

5- Usamos uma expressão lambda onde selecionamos os nomes contidos na tabela a partir da expressão informada no TextBox txtNome;

       tAlunos.Where(Function(a) a.Nome.Contains(txtNome.Text))

Executando o projeto , se nada for informado na caixa de texto todos os dados da tabela serão exibidos:

Informando um critério qualquer teremos:

Observe que não nos preocupamos em definir objetos connection , commands , datareaders ou datasets apenas instanciamos um contexto a partir do qual tivemos acesso, a partir da classe mapeada para  a tabela, aos dados usando uma consulta LINQ.

O código ficou mais enxuto e tivemos menos trabalho. E isso sem usar o assistente; com ele o trabalho de gerar a classe não seria necessário. Devemos portanto conhecer os novos recursos para saber avaliar quando usá-los para obtermos um produto final mais refinado.

Aguarde novos artigos sobre o assunto...

Pegue o projeto completo aqui : acessoLINQ.zip

Eu sei é apenas LINQ to SQL , mas eu gosto...

Referências:


José Carlos Macoratti