Algumas consultas em projetos podem ser feitas de forma mais simples, como a consulta de um item em uma tabela. o famoso “select * from tabela” .
Pesquisando na web, encontrei um modelo muito bacana que faz este serviço, e uma das vantagens é a possibilidade de modificar a conexão para bancos como SQL Server, ORACLE DB e MySQL.
Bom eu vou acrescentar a “dll” como anexo, e colocar aqui o código fonte com comentários.
Este modelo aceita somente uma conexão por vez, mas com um pouquinho de esforço fica fácil definir qual a conexão que precisa e assim usar mais que uma.
Classe ConnectionDB:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">class</span> ConnectionDB { <span class="rem">/// Field String de Conexão</span> <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">string</span> connectionString {get;set;} <span class="rem">/// Field Nome do Provedor</span> <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">string</span> providerName {get;set;} <span class="rem">/// <summary> Connection DB</span> <span class="rem">/// </span> <span class="rem">/// </summary></span> <span class="kwrd">static</span> ConnectionDB() { <span class="kwrd">try</span> { <span class="rem">// Recebe do arquivo de configuração Web.Config a string de conexão e o nome do provedor</span> connectionString = ConfigurationManager.ConnectionStrings[<span class="str">"ConnectionString"</span>].ConnectionString; providerName = ConfigurationManager.ConnectionStrings[<span class="str">"ConnectionString"</span>].ProviderName; <span class="rem">//connectionString = connectionString;</span> <span class="rem">//providerName = providerName;</span> } <span class="kwrd">catch</span> (Exception) { <span class="kwrd">throw</span> <span class="kwrd">new</span> Exception(<span class="str">"Erro ao receber dados da Conexão. Por favor verifique se a string de conexão está declarada corretamente."</span>); } } <span class="rem">//Propriedade que apenas informa a String de Conexão</span> <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">string</span> ConnectionString { get { <span class="kwrd">return</span> connectionString; } } <span class="rem">/// Propriedade que apenas informa o Nome do Provedor</span> <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">string</span> ProviderName { get { <span class="kwrd">return</span> providerName; } } } |
Connections.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">class</span> Connections { <span class="kwrd">public</span> <span class="kwrd">static</span> List<Connect> RetornaListaConnectionString() { ConnectionStringSettingsCollection settings = ConfigurationManager.ConnectionStrings; var lista = <span class="kwrd">new</span> List<Connect>(); <span class="kwrd">if</span>(settings != <span class="kwrd">null</span>) { <span class="kwrd">foreach</span>(ConnectionStringSettings cs <span class="kwrd">in</span> settings) { var connect = <span class="kwrd">new</span> Connect(){ connection = cs.ConnectionString, provider = cs.ProviderName}; lista.Add(connect); } } <span class="kwrd">return</span> lista; } } <span class="kwrd">public</span> <span class="kwrd">class</span> Connect { <span class="kwrd">public</span> <span class="kwrd">string</span> connection { get; set; } <span class="kwrd">public</span> <span class="kwrd">string</span> provider { get; set; } } |
GenericDataBase.cs
publicclass GenericDataBase
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
{ <span class="rem">/// Método que Cria um objeto DBCommand com os dados</span> <span class="rem">/// da classe ConnectionDB utilizando Factory</span> <span class="rem">/// DBCommand criado</span> <span class="kwrd">public</span> <span class="kwrd">static</span> DbCommand CreateCommand(String cmmdText, CommandType cmmdType, List<DbParameter> listParameter) { <span class="rem">// Cria um novo factories de acordo com o nome do provedor</span> var factory = DbProviderFactories.GetFactory(ConnectionDB.ProviderName); <span class="rem">// Cria um objeto específico de conexão de acordo com o nome do provedor</span> var conn = factory.CreateConnection(); <span class="rem">// Atribui a String de Conexão</span> conn.ConnectionString = ConnectionDB.ConnectionString; <span class="rem">// Cria um objeto command específico de acordo com o nome do provedor</span> var comm = conn.CreateCommand(); <span class="rem">// Atribui o comando Text</span> comm.CommandText = cmmdText; <span class="rem">// Atribui o tipo de comando</span> comm.CommandType = cmmdType; <span class="rem">// Se existir algum parâmetro ele adiciona</span> <span class="rem">// ao comando</span> <span class="kwrd">if</span> (listParameter != <span class="kwrd">null</span>) { <span class="kwrd">foreach</span> (var param <span class="kwrd">in</span> listParameter) { <span class="rem">// Adicionando o parâmetro</span> comm.Parameters.Add(param); } } <span class="rem">// Retorna o comando criado</span> <span class="kwrd">return</span> comm; } <span class="rem">/// <summary> Método responsável por criar um Parâmetro</span> <span class="rem">/// </span> <span class="rem">/// List param = new List();</span> <span class="rem">/// param.Add(criaParameter(nome, tipo, valor));</span> <span class="rem">/// </span> <span class="rem">/// </summary></span> <span class="rem">/// <param name="nameParameter"> Nome do Parâmetro</param></span> <span class="rem">/// <param name="typeParameter"> Tipo do Parâmetro</param></span> <span class="rem">/// <param name="valueParameter"> Valor do Parâmetro</param></span> <span class="rem">/// <returns></returns></span> <span class="kwrd">public</span> <span class="kwrd">static</span> DbParameter CreateParameter(String nameParameter, DbType typeParameter, Object valueParameter) { <span class="rem">// Cria um novo factories de acordo com o nome do provedor</span> var factory = DbProviderFactories.GetFactory(ConnectionDB.ProviderName); <span class="rem">// Cria o Parâmetro e add seu valores</span> var param = factory.CreateParameter(); <span class="kwrd">if</span> (param != <span class="kwrd">null</span>) { param.ParameterName = nameParameter; param.DbType = typeParameter; param.Value = valueParameter; } <span class="rem">// Retorna o Parâmetro criado</span> <span class="kwrd">return</span> param; } <span class="rem">/// <summary> Método responsável por criar um Parâmetro</span> <span class="rem">/// </span> <span class="rem">/// List param = new List();</span> <span class="rem">/// param.Add(criaParameter(nome, tipo, valor));</span> <span class="rem">/// </span> <span class="rem">/// </summary></span> <span class="rem">/// <param name="nameParameter"> Nome do Parâmetro</param></span> <span class="rem">/// <param name="typeParameter"> Tipo do Parâmetro</param></span> <span class="rem">/// <param name="valueParameter"> Valor do Parâmetro</param></span> <span class="rem">/// <param name="direction">Direction </param></span> <span class="rem">/// <returns></returns></span> <span class="kwrd">public</span> <span class="kwrd">static</span> DbParameter CreateParameter(String nameParameter, DbType typeParameter, Object valueParameter, ParameterDirection direction) { <span class="rem">// Cria um novo factories de acordo com o nome do provedor</span> var factory = DbProviderFactories.GetFactory(ConnectionDB.ProviderName); <span class="rem">// Cria o Parâmetro e add seu valores</span> var param = factory.CreateParameter(); <span class="kwrd">if</span> (param != <span class="kwrd">null</span>) { param.ParameterName = nameParameter; param.DbType = typeParameter; param.Value = valueParameter; param.Direction = direction; } <span class="rem">// Retorna o Parâmetro criado</span> <span class="kwrd">return</span> param; } <span class="rem">/// <summary> Método que cria um comando e executa esse comando.</span> <span class="rem">/// </span> <span class="rem">/// </summary></span> <span class="rem">/// <param name="cmmdText">String SQL ou StoredProcedure</param></span> <span class="rem">/// <param name="cmmdType">Tipo de Commando (Text ou Stored Procedure)</param></span> <span class="rem">/// <param name="listParameter">Lista de parâmetros</param></span> <span class="rem">/// <param name="typeCmmd">Comando a ser executado (ExecuteNonQuery, ExecuteReader, ExecuteScalar, ExecuteDataTable)</param></span> <span class="rem">/// <returns>Object</returns></span> <span class="kwrd">public</span> <span class="kwrd">static</span> Object ExecuteCommand(String cmmdText, CommandType cmmdType, List<DbParameter> listParameter, TypeCommand typeCmmd) { <span class="rem">// Cria comando com os dados passado por parâmetro</span> var command = CreateCommand(cmmdText, cmmdType, listParameter); <span class="rem">// Cria objeto de retorno</span> Object objRetorno = <span class="kwrd">null</span>; <span class="kwrd">try</span> { <span class="rem">// Abre a Conexão com o banco de dados</span> command.Connection.Open(); <span class="kwrd">switch</span> (typeCmmd) { <span class="kwrd">case</span> TypeCommand.ExecuteNonQuery: <span class="rem">// Retorna o número de linhas afetadas</span> objRetorno = command.ExecuteNonQuery();<span class="kwrd">break</span>; <span class="kwrd">case</span> TypeCommand.ExecuteReader: <span class="rem">// Retorna um DbDataReader</span> objRetorno = command.ExecuteReader(CommandBehavior.CloseConnection);<span class="kwrd">break</span>; <span class="kwrd">case</span> TypeCommand.ExecuteScalar: <span class="rem">// Retorna um objeto</span> objRetorno = command.ExecuteScalar();<span class="kwrd">break</span>; <span class="kwrd">case</span> TypeCommand.ExecuteDataTable: <span class="rem">// Cria uma tabela</span> var table = <span class="kwrd">new</span> DataTable(); <span class="rem">// Executa o comando e salva os dados na tabela</span> var reader = command.ExecuteReader(); table.Load(reader); <span class="rem">// Fecha o Reader</span> reader.Close(); <span class="rem">// Retorna a tabela</span> objRetorno = table; <span class="kwrd">break</span>; } } <span class="kwrd">finally</span> { <span class="kwrd">if</span> (typeCmmd != TypeCommand.ExecuteReader) { <span class="rem">// Sempre fecha a conexão com o BD</span> command.Connection.Close(); } } <span class="kwrd">return</span> objRetorno; } } |
TypeCommand.cs
publicenum TypeCommand
1 2 3 4 5 6 |
{ ExecuteNonQuery ,ExecuteReader ,ExecuteScalar ,ExecuteDataTable } |
Pronto. criando os arquivos acima com um projeto Class Library fica fácil criar utilizar esta biblioteca.
Lembrando que em cada aplicação você deve criar uma ConnectioString no arquivo de configuração como o exemplo abaixo.
Config.cs
1 2 3 4 5 |
<connectionStrings> <add name=<span class="str">"ConnectionString"</span> connectionString=<span class="str">"Data Source=.SQLEXPRESS;Initial Catalog=[DATABASENAME];Persist Security Info=True;User ID=sa;Password=XXXX"</span> providerName=<span class="str">"System.Data.SqlClient"</span> /> </connectionStrings> Para ficar mais claro a criação deste projeto , criei os vídeos explicativos que seguem abaixo. |
Parte #1
Parte#2
Excelente video, parabens Fernando, aprendi muito com essas duas video aulas, estou aprendendo, abraço
Obrigado Amarildo,
Veja os outros vídeos da série, ok!
Fernando parabéns muito bom mesmo seus vídeos, só uma duvida tenho uma stored procedure e preciso passar parametros como ficaria a chamada do método ExecuteCommand
Oi Matheus, obrigado
Você deve criar os chamados Parameters.
O Vídeo já tem algum tempo, se a solução não tiver esta opção, me envia um email e te mando o projeto bem mais completo.
email: fernando@parmezani.net
Fernando.
Bom Dia!
Parabéns pelo trabalho.
Estou tentando inserir imagem sem sucesso.
Poderia me esclarecer como faria para inserir imagem no banco utilizando as classes genéricas?
Jardel Oliveira
Bom dia Fernando Você poderia nos dar uma dica de como usar uma transaction
Opa,
Vou tentar, qual sua dúvida?
Bom dia,
Então nos exemplos ADO.NET – Acesso ao banco de dados com classe genérica você mostrou um método insert.
Minha duvida seria como fazer 2 insert’s em tabelas diferentes
Exemplo: “TABELAS”
Venda
VendaItem
Desde já obrigado
PS: Esqueci de mencionar fazer 2 insert’s usando uma Transaction (Transação)