- Arquivo de Configurações
- Class ConnectionFactory.CfConnection
- Class ConnectionFactory.CfCommand
- Exemplo do mapeamento da entidade (VO / DTO) com o banco de dados
Oferecer um conjunto de funções para comunicação com banco de dados auxiliando no trabalho dos desenvolvedores de sistemas.
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.
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 TransactionScope
pode 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);
}
}
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
}
}