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.
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:
Agora criaremos o diretório App_Code e adicionaremos um arquivo com extensão abp no mesmo com o nome de subsonic.abp.
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!!!
Posts relacionados:
- Desenvolvimento de Website com ASP.NET e SQL Server – Parte 2
- Desenvolvimento de Website com ASP.NET e SQL Server – Parte 3
- Dica – Adicionar um arquivo CSS dinamicamente em um WebForm
- Crud com Entity Framework fácil
- Crud com Entity Framework fácil parte 2
Postado em ASP.NET, C#, SubSonic, VB.NET, Visual Studio | Marcado como .NET, ASP.NET, C#, DAL, MySql, Oracle, Sql Server, SubSonic, VB.NET, Visual Studio











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 ?
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
Muito legal…
Só uma pergunta de iniciante..
Ele gera o CRUD automaticamente??
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.
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
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?
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
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.
Como está o seu código?
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)
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();