Build status License Release Github all releases NuGet FOSSA Status
- 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 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); } }
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 } }