Skip to content

afernandes/ConnectionFactory.NET

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

42 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Build status License Release Github all releases NuGet FOSSA Status

Framework Connection Factory .NET

Objetivo

Oferecer um conjunto de funções para comunicação com banco de dados auxiliando no trabalho dos desenvolvedores de sistemas.

Premissas

implementar funções similares ao iBATIS DAO simplificando a camada de persistência com o banco de dados, mas sem a necessidade de utilizar os XML para mapeamento das entidades.

Características

Suporte a todos provedores de bancos de dados que implementam o ADO.NET : Tudo que é necessário para para se conectar a um novo banco é adicioná-lo ao arquivo de configurações (exemplo do Web.config) Bancos de dados suportados (SQl Server, Oracle, MySQL, etc)

Conexão simplificada : Conecta ao banco passando apenas o nome da conexão gravado no arquivo de configurações. (exemplo)

Transação entre servidores / bancos de dados : Transações entre múltiplas conexões independente se estão em bancos de dados ou servidores distintos (exemplo)

Retorno automático de entidades (DTO / VO) carregadas a partir das querys : Executa as querys e carrega as entidades automaticamente evitando linhas repetitivas de código para carregar cada membro do objeto. (exemplo)

<connectionStrings>
  <add name="DEFAULT" 
	   connectionString="Data Source=INSTANCIA;
					Initial Catalog=dtb_X;
					User Id=******; 
					Password=*****;
					App=NomeSistema;
					MultipleActiveResultSets=True;"    
	   providerName="System.Data.SqlClient"/>
</connectionStrings>

(Exemplo de chamada da conexão)

using (var conn = new CfConnection("DEFAULT"))
{
	...
}

(Exemplo do arquivo de configurações para a conexão "DEFAULT")

A TransactionScopepode ser utilizada em qualquer camada, tanto camada DAO com na BO

try
{
   // Requer o MSDTC ativo
   using (var scope = new TransactionScope())
   {
   
      //Conexão com banco A no servidor X
      using (var conn = new CfConnection("DEFAULT"))
      {
         ...
      }
      
      //Conexão com o banco B no servidor Y
      using (var conn = new CfConnection("PORTAL"))
      {
         ...
      }

      //Commit em todas as conexões dentro do escopo
      scope.Complete();
   }
   catch (TransactionAbortedException tae)
   {
	  //Rollback devido erro na transação
	  ...
   }
   catch (Exception ex)
   {
      //Rollback automatico em todas as conexões dentro do TransactionScope em caso de erros
      ...
   }
}

Executa a consulta no banco de dados e carrega automaticamente as entidades (VO / DTO), de forma simples, rápida e evitando erros de conversão incorreta.

Vo.User user;
const string sql = @"SELECT * FROM SIS_USER WHERE ID = @Id";

using (var conn = new CfConnection("DEFAULT"))
{
   using (var cmd = conn.CreateCfCommand())
   {
      //Listagem de parâmetros
      var param = new List<CfParameter>
      {
         new CfParameter("@Id", id, DbType.Int32)
      };

      //Executa query e retorna DTO carregada
      user = cmd.QueryForObject<Vo.User>
		      (CommandType.Text, sql, param);
   }
}

##ConnectionFactory.CfCommand

Exemplo de um INSERT retornando o ID.

using (var conn = new CfConnection("DEFAULT"))
{
   using (var cmd = conn.CreateCfCommand())
   {
      var parameters =
         new List<CfParameter>
         {
            new CfParameter("@Name", entity.Name),
            new CfParameter("@TimeStamp", entity.TimeStamp),
            new CfParameter("@IsActive", entity.IsActive),
            new CfParameter("@DisplayName", entity.DisplayName)
         };

      int id = cmd.ExecuteScalar<int>(CommandType.Text,
         @"INSERT INTO SIS_PROFILE
	         (NAME,  UPDATE_TIME, IS_ACTIVE, DISPLAY_NAME)
          VALUES 
	         (@Name, @TimeStamp,  @IsActive, @DisplayName)
           
          SELECT CAST(SCOPE_IDENTITY() AS INT) AS ID"
         , parameters);
   }
}

Executa a Query ou Procedure e retorna uma entidade carregada

Vo.User user;
const string sql = @"SELECT * FROM SIS_USER WHERE ID = @Id";

using (var conn = new CfConnection("DEFAULT"))
{
   using (var cmd = conn.CreateCfCommand())
   {
      var param = new List<CfParameter>
      {
         new CfParameter("@Id", id, DbType.Int32)
      };

      user = cmd.QueryForObject<Vo.User>(CommandType.Text, sql, param);
   }
}

Executa uma query ou procedure e retorna uma Lista de entidades.

IList<Resource> returnValue = null;

string sql = @"SELECT NAME RESOURCE_NAME
               FROM SIS_RESOURCE
               WHERE ENTITY_NAME=@EntityName";

using (var conn = new CfConnection(
	Util.ConnectionNames.DEFAULT.ToString()))
{
    using (var cmd = conn.CreateCfCommand())
	{
       var param = new List<CfParameter>{
          new CfParameter("@EntityName",entityType)};

       returnValue = cmd.QueryForList<Resource>
	       (CommandType.Text,sql,param);

    }
}

Executa uma query ou procedure e retorna um DataReader

IList<string> returnValue = null;
using (var conn = new CfConnection("DEFAULT"))
{
	using (var cmd = conn.CreateCfCommand())
    {
		const string sql = "SELECT NAME FROM SIS_ENTITY";
		using (var reader = cmd.ExecuteReader(CommandType.Text, sql))
		{
			if (reader.HasRows)
			{
	            returnValue = new List<String>();
	            while (reader.Read())
	            {
	                returnValue.Add(reader[0].ToString());
	            }
	        }
	    }
    }
}

return returnValue;

Executa comando SQL sem retorno. Apropriado para INSERT, UPDATE e DELETE

var param =
    new List<CfParameter>
    {
       new CfParameter("@Id", entity.Id),
       new CfParameter("@TimeStamp", entity.TimeStamp),
       new CfParameter("@Name", entity.Name),
       new CfParameter("@IsActive", entity.IsActive),
       new CfParameter("@DisplayName", entity.DisplayName)
    }; 

 using (var conn = new CfConnection("DEFAULT"))
 {
    using (var cmd = conn.CreateCfCommand())
    {
	   //Executa comando SQL sem retorno de valor
       cmd.ExecuteNonQuery(CommandType.Text, 
          @"UPDATE SIS_PROFILE
            SET UPDATE_TIME = @TimeStamp, NAME         = @Name, 
                IS_ACTIVE   = @IsActive,  DISPLAY_NAME = @DisplayName
            WHERE ID = @Id", param);
    }
 }

##Exemplo do mapeamento da entidade (VO / DTO) com o banco de dados

Observe que o membro PhoneNumber tem um nome diferente no banco de dados PHONE_NUMBER

using System;
using System.Collections.Generic;
using System.Data.Linq.Mapping;

namespace User.Vo
{
   /// <summary>
   /// VO representing any User (customer, atendent, etc.).
   /// </summary>
   [Serializable]
   public class User
   {
      #region Properties
      /// <summary>
      /// The unique identifier for User
      /// </summary>
      public Int32 Id { get; set; }
      /// <summary>
      /// The User Name
      /// </summary>
      public string UserName { get; set; }
      /// <summary>
      /// The User phone number
      /// </summary>
      [Column(Name = "PHONE_NUMBER")]  // <-- Column name in database
      public String PhoneNumber { get; set; }
      #endregion
   }
}

License

FOSSA Status