Facilitando o desenvolvimento DAL com SubSonic

O SubSonic é uma tecnologia open source que cria toda a camada de acesso a dados (DAL – Data Access Layer) de nosso projeto em .NET e que tem como líder Rob Conery.

Ele cria toda nossa camada de acesso a dados (DAL) em tempo de compilação, ficando somente em nossa responsabilidade utilizá-lo.

Atualmente ele suporta quase todos os bancos de dados do mercado como:

  • SQL Server 2000 or 2005
  • MySQL
  • Oracle

Para utiliza-lo em nossos projetos, basta acessar o link e fazer o download:

Sempre que um novo objeto é adicionado ou excluído é necessário recompilar nossa aplicação para ter acesso a ele no código fonte.

Para que você entenda bem seu funcionamento, vamos a prática.

Inicie um novo projeto ASP.NET Web Site.


usandosubsonic01

Adicione a referência ao SubSonic que se encontra no diretório da C:\Program Files\SubSonic\SubSonic 2.1 Final (no meu caso a versão do SubSonic é 2.1 Final).

Foi criado em nosso projeto do diretório Bin (diretório das Referencias adicionadas ao projeto) com o SubSonic e todas as demais referencias que ele precisa. Veja a imagem abaixo:


usandosubsonic02

Agora criaremos o diretório App_Code e adicionaremos um arquivo com extensão abp no mesmo com o nome de subsonic.abp.


usandosubsonic03


usandosubsonic04


usandosubsonic05

Esse arquivo será utilizado pelo SubSonic como arquivo temporário para gerar o código DAL no momento da compilação.

Abra o Web.config para realizarmos a configuração necessárias.

Adicionaremos o configSections…


  <configsections>
    <section name="SubSonicService" type="SubSonic.SubSonicSection, SubSonic" requirePermission="false"/>
  </configsections>

… a ConnectionString …


<connectionstrings>
  <add name="ArtigoSubSonic" connectionString="server=localhost;database=artigo_subsonic;uid=root;pwd=123456;"/>
</connectionstrings>

… adicione também o Provider do SubSonic, no meu caso utilizarei o SubSonic.MySqlDataProvider para utilizar o banco de dados MySql, caso queira utilizar SQL Server use o SubSonic.SqlDataProvider…


  <subsonicservice defaultProvider="Artigo_SubSonic">
    <providers>
      <clear />
      <add name="Artigo_SubSonic" type="SubSonic.MySqlDataProvider, SubSonic" connectionStringName="Artigo_SubSonic" generatedNamespace="Artigo_SubSonic"/>
    </providers>
  </subsonicservice>

… e por fim o BuildProvider.


    <compilation debug="true" defaultLanguage="C#">
      <buildproviders>
        <add extension=".abp" type="SubSonic.BuildProvider, SubSonic"/>
      </buildproviders>
    </compilation>

Seu Web.Config deverá ficar parecido com o meu.


< ?xml version="1.0"?>
<configuration>
  <configsections>
    <section name="SubSonicService" type="SubSonic.SubSonicSection, SubSonic" requirePermission="false"/>
  </configsections>
  <appsettings />
  <connectionstrings>
    <add name="ArtigoSubSonic" connectionString="server=localhost;database=artigo_subsonic;uid=root;pwd=123456;"/>
  </connectionstrings>
  <subsonicservice defaultProvider="ArtigoSubSonic">
    <providers>
      <clear />
      <add name="ArtigoSubSonic" type="SubSonic.MySqlDataProvider, SubSonic" connectionStringName="ArtigoSubSonic" generatedNamespace="ArtigoSubSonic"/>
    </providers>
  </subsonicservice>
  <system .web>
    <compilation debug="true" defaultLanguage="C#">
      <buildproviders>
        <add extension=".abp" type="SubSonic.BuildProvider, SubSonic"/>
      </buildproviders>
    </compilation>
    <authentication mode="Windows" />
  </system>
</configuration>

Se quiser, pode configurar um banco de dados que você já tenha criado, acredito que será muito mais interessante e assim poderá fazer um comparativo do tempo de desenvolvimento.

Até aqui não gastamos muito tempo para configurar e isso não será diferente para desenvolver.

Antes de começarmos a codificar, vamos dar um Build em nosso projeto apertando F6 para que o SubSonic crie a DAL do nosso projeto e agora sim criaremos nosso SELECT e preencher o GridView com as informações.

Adicione a namespace de referencia ao SubSonic e a nossa DAL no CodeBehind


using ArtigoSubSonic;
using SubSonic;
using System.Data;

ArtigoSubSonic é o nome da namespace que definimos no nosso Web.Config

Em nossa página Default.aspx adicione um GridView e vá ao fonte para adicionar um código no Page_Load.

Abaixo temos o código para retornar os dados da tabela Clientes


// Retorna os Clientes
GridView1.DataSource = Cliente.FetchAll();
GridView1.DataBind();

Adicionar…


// Adiciona Cliente
Cliente cliente = new Cliente();
cliente.Nome = "Marcos";
cliente.Sobrenome = "Prado";
cliente.Cidade = "Belo Horizonte";
cliente.Telefone = "34-4125-4711";
cliente.Save();

Atualizar…


// Atualizar Cliente
Cliente cliente = new Cliente(4);
cliente.Nome = "Marcos";
cliente.Sobrenome = "Prado Silva";
cliente.Cidade = "Belo Horizonte";
cliente.Telefone = "34-4125-4711";
cliente.Save();

Apagar…


// Apaga Cliente informando o ID
Cliente.Delete(5);

Simples? Imagine se tivessemos que criar a conexão com o banco, montar toda a nossa DAL manualmente?

Acesse também o site oficial: http://subsonicproject.com/

Agora basta explorar as funcionalidades e facilidade do SubSonic.

E Apesar de nosso foco ser sempre C# o mesmo pode ser veito em VB.NET

Abraço e sucesso!!!

Artigos relacionados:

Compartilhe:
  • Digg
  • del.icio.us
  • Technorati
  • Facebook
  • MySpace
  • Google Bookmarks
  • Live
  • Twitter
  • Print
  1. 8 de maio de 2009 at 00:59 | #1
    Leandro

    Estou utilizando o SubSonic em alguns teste.
    Mas estou com duvida de como fazer para efetuar uma consulta em uma tabela com chave primaria composta.

    No exemplo acima ao cricar o objeto cliente é passado o id 4, mas se a chave for por exemplo, idEmpresa e idCliente?

    Como devo fazer ?

  2. 20 de maio de 2009 at 17:13 | #2

    Basta utilizar esse método.

    SqlQuery qry = new Select().From(Tables.Cliente);
    qry.Where(Cliente.Columns.Clienteid).IsEqualTo(4);
    qry.Where(Cliente.Columns.Empresaid).IsEqualTo(5);

    DataSet ds = qry.ExecuteDataSet();
    DataTable dt = ds.Tables[0];

    GridView1.DataSource = dt;
    GridView1.DataBind();

    Você pode explorar o SqlQuery que ele faz parte do SubSonic e tem bastante funcionalidades.

    Abraço

  3. 26 de maio de 2009 at 12:20 | #3
    Bruno

    Muito legal…
    Só uma pergunta de iniciante..
    Ele gera o CRUD automaticamente??

  4. 28 de maio de 2009 at 13:48 | #4

    Sim, no exemplo mesmo já ilustro. E funciona perfeitamente. Já estou utilizando em alguns projetos web. Mais o mesmo poderá ser usado em aplicações desktop.

  5. 1 de junho de 2009 at 09:03 | #5
    André Azevedo

    Só uma nota: Sempre configurar o SubSonic FORA do IIS, caso contrário surgirá um erro estranho. Aqui no meu caso somente funciona dessa forma

  6. 14 de junho de 2009 at 20:25 | #6
    Wagner Oliveira

    Estou enfrentando problemas para usar o SubSonic…

    1. Estou usando em um projeto WinForms. Pode-se usar normalmente? Existems trechos no fonte gerado por ele que fazem referência a web sites:

    if (System.Web.HttpContext.Current != null)
    item.Save(System.Web.HttpContext.Current.User.Identity.Name);
    else
    item.Save(System.Threading.Thread.CurrentPrincipal.Identity.Name);

    2. Na classeAllStructs, ele o seguinte erro nessa linha:

    public static DataProvider _provider = DataService.Providers["Doctor"];

    Error 14 The type ‘System.Configuration.Provider.ProviderBase’ is defined in an assembly that is not referenced. You must add a reference to assembly ‘System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’. D:\Visual Studio 2008\Projects\SubSonic\SubSonic\DAL\AllStructs.cs 44 36 SubSonic

    Tentei achar o problema… mas não consegui… alguma dica?

  7. 16 de junho de 2009 at 09:25 | #7

    O modo de utilização nos WinForms é diferente.
    Existe uma documentação do SubSonic que explica como fazer.

    http://subsonicproject.com/setup/setting-up-and-using-winforms-applications/

    Veja se isso lhe ajuda.
    Abraço

  8. 19 de agosto de 2009 at 10:10 | #8
    Ricardo

    Alguém sabe como faço para fazer a atualização de um registro? Quando eu utilizo o método .Save o registro é Salvo, mas quando eu utilizo o .Update o registro informado não é atualizado.
    Obs: Estou utilizando a versão 3.0.0.3.

  9. 19 de agosto de 2009 at 13:15 | #9

    Como está o seu código?

  10. 16 de outubro de 2009 at 16:06 | #10

    engraçado.. o meu subsonic não tem o Delete()! Como faz pra aparecer?

    Uso o SubSonic há mais de 1 ano e preciso construir meus deletes manualmente (classe Delete)

  11. 16 de outubro de 2009 at 16:23 | #11

    Acabei de descobrir! Só usar o ExecuteSingle
    É inclusive a resposta para a dúvida do Leandro aí…

    Select qry = new Select();
    qry.From(FWE_DAL.Tabela.Schema)
    .Where(FWE_DAL.Tabela.Id_CHAVE1Column).IsEqualTo(3)
    .And(FWE_DAL.Tabela.Id_CHAVE2Column).IsEqualTo(5);

    FWE_DAL.Tabela tab = qry.ExecuteSingle();

    tab.Texto = “Novo texto da chave composta”;
    tab.Save();

  1. No trackbacks yet.
Os comentários estão fechados