sábado, 24 de outubro de 2009

Como Criar uma classe genérica de acesso à dados com .NET C# utilizando o namespace System.Data.Common



Bom hoje vou deixar aqui uma dica de como trabalhar em .net com uma classe de acesso a dados genérica.

O namespace System.Data.Common, possui classes prontas com esta finalidade. Se você precisa, ou pensa em criar
um aplicativo que no futuro pode ser migrado de banco de dados, como por exemplo trocar do SQL Server para Oracle,
utilize este namespace.

Com estas classes, os prividers são carregados dinâmicamente, basta configurar no web.config:

<connectionStrings>
<add name="site_db" connectionString="Server=localhost;Initial Catalog=loja;User Name='root';Password='xxx'" providerName="MySql.Data.MySqlClient"/>
</connectionStrings>


A opção providerName="MySql.Data.MySqlClient" faz com que as classes do .net usem o privider do MySql. Se um dia você decidir migrar para Sql Server, basta trocar o providerName para System.Data.SqlClient. Bom isto não quer dizer que todas suas querys vão funcionar perfeitamente, mas se você utilizar o ANSI SQL, todas devem funcionar sem erros pois ele é padrão para todos bancos de dados.

Como o MySql não é um provider padrão que vem instalado com o .net framework, se você não inserir as linhas abaixo no web.config:

<system.data>
<DbProviderFactories>
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data,Version=6.1.2.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"/>
</DbProviderFactories>
</system.data>

Pode ocorrer o seguinte erro quando tentar executar o seu código:

Unable to find the requested .Net Framework Data Provider. It may not be installed.


Abaixo uma classe de exemplo de como utilizar as classes do namespace System.Data.Common:


using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Common;
using System.Data;
using System.Configuration;


public class DAHelper:IDisposable
{
private DbProviderFactory factory;
DbConnection con;
public DAHelper()
{
factory = DbProviderFactories.GetFactory(ConfigurationManager.ConnectionStrings["site_db"].ProviderName);
}
public DbConnection GetConnection()
{
if (con == null)
{
con = factory.CreateConnection();
con.ConnectionString = ConfigurationManager.ConnectionStrings["site_db"].ConnectionString;
con.Open();
}

return con;
}
public void CloseConnection(DbConnection con)
{
try
{
if (con.State == ConnectionState.Open)
{
con.Close();
}
}
catch
{ }
finally
{
con = null;
}
}
public DbDataReader GetReader(string sql, CommandType cType, params DbParameter[] pars)
{
DbConnection con = this.GetConnection();
try
{
DbCommand cmd = factory.CreateCommand();
cmd.Connection = con;
cmd.CommandText = sql;
cmd.CommandType = CommandType.Text;
DbDataReader reader = cmd.ExecuteReader();

return reader;
}
catch
{
throw;
}

}
public DataTable FillDataTable(DataTable dt, string sql, CommandType cType, params DbParameter[] pars)
{
DbConnection con = this.GetConnection();
try
{
DbDataAdapter adpt = factory.CreateDataAdapter();
DbCommand cmd = factory.CreateCommand();
cmd.CommandText = sql;
cmd.CommandType = CommandType.Text;
cmd.Connection = con;
if (pars != null && pars.Length>0)
{
foreach (DbParameter p in pars)
{
cmd.Parameters.Add(p);
}
}
adpt.SelectCommand = cmd;

adpt.Fill(dt);
con.Close();
con.Dispose();
con = null;
cmd.Dispose();
cmd = null;
adpt.Dispose();
adpt = null;
return dt;
}
catch
{
throw;
}
}


#region IDisposable Members

public void Dispose()
{
if (con != null && con.State != ConnectionState.Closed)
{
con.Close();
con.Dispose();
con = null;
}
}

#endregion
}


0 comentários:

Postar um comentário