Olá pessoal, tudo bom?
Segue uma proposta de classe, escrita em C#, para persistência e/ou manipulação de dados em bancos de dados baseados no SQL Server.
Para utilizar essa classe em seu projeto (ASP.NET/Windows Form/Class Library), basta adequar o nome do namespace, que no exemplo, consta como Persistencia.
Segue o código [Arquivo: Banco.cs]
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.SqlClient; using System.Data; namespace Persistencia { /// <summary> /// Classe responsável pela conexão com o banco de dados e execução de comandos de SQL /// </summary> public class Banco { /// <summary> /// Campo responsável pela definição da string de conexão /// </summary> private string _strConexao; /// <summary> /// Campo responsável pelo comando de SQL a ser executado /// </summary> private SqlCommand _comandoSQL; /// <summary> /// Propriedade que expõe o campo para definição do comando de SQL a ser executado /// </summary> public SqlCommand ComandoSQL { get { return _comandoSQL; } set { _comandoSQL = value; } } /// <summary> /// Campo que define o objeto de conexão /// </summary> private SqlConnection _conn; /// <summary> /// Campo que define o objeto de transação /// </summary> private SqlTransaction _transacao; /// <summary> /// Construtor que define uma string de conexão fixa e cria os objetos de conexão e /// comando /// </summary> public Banco() { _strConexao = @"Data Source=servidorBDnomeInstancia;Initial Catalog=nomeBD;Persist Security Info=True;User ID=loginUserBD;Password=senhaUserBD"; _conn = new SqlConnection(_strConexao); _comandoSQL = new SqlCommand(); _comandoSQL.Connection = _conn; } /// <summary> /// Construtor que recebe por parametro a string de conexão a ser utilizada e cria /// os objetos de comando e conexão /// </summary> /// <param name="stringConexao">String de conexão a ser utilizada</param> public Banco(string stringConexao) { _strConexao = stringConexao; _conn = new SqlConnection(_strConexao); _comandoSQL = new SqlCommand(); _comandoSQL.Connection = _conn; } /// <summary> /// Método para abrir a conexão com o banco de dados /// </summary> /// <param name="transacao">true -> Com transação | false -> Sem transação</param> /// <returns></returns> public bool AbreConexao(bool transacao) { try { _conn.Open(); if (transacao) { _transacao = _conn.BeginTransaction(); _comandoSQL.Transaction = _transacao; } return true; } catch { return false; } } /// <summary> /// Métodos para fechar a conexão com o banco de dados /// </summary> /// <returns>Retorna um booleano para indicar o resultado da operação</returns> public bool FechaConexao() { try { if (_conn.State == ConnectionState.Open) _conn.Close(); return true; } catch { return false; } } /// <summary> /// Finaliza uma transação /// </summary> /// <param name="commit">true -> Executa o commit | false -. Executa o rollback</param> public void FinalizaTransacao(bool commit) { if (commit) _transacao.Commit(); else _transacao.Rollback(); FechaConexao(); } /// <summary> /// Destrutor que fecha a conexão com o banco de dados /// </summary> ~Banco() { FechaConexao(); } /// <summary> /// Método responsável pela execução dos comandos de Insert, Update e Delete /// </summary> /// <returns>Retorna um número inteiro que indica a quantidade de linhas afetadas</returns> public int ExecutaComando(bool transacao) { int retorno; AbreConexao(transacao); try { retorno = _comandoSQL.ExecuteNonQuery(); } catch { retorno = -1; } finally { if (!transacao) FechaConexao(); } return retorno; } /// <summary> /// Método responsável pela execução dos comandos de Insert com retorno do último código cadastrado /// </summary> /// <returns>Retorna um número inteiro que indica a quantidade de linhas afetadas</returns> public int ExecutaComando(bool transacao, out int ultimoCodigo) { int retorno; ultimoCodigo = 0; AbreConexao(transacao); try { //Executa o comando de insert e já retorna o @@IDENTITY ultimoCodigo = Convert.ToInt32(_comandoSQL.ExecuteScalar()); retorno = 1; } catch { retorno = -1; } finally { if (!transacao) FechaConexao(); } return retorno; } /// <summary> /// Método responsável pela execução dos comandos de Select /// </summary> /// <returns>Retorna um DataTable com o resultado da operação</returns> public DataTable ExecutaSelect() { AbreConexao(false); DataTable dt = new DataTable(); try { dt.Load(_comandoSQL.ExecuteReader()); } catch { dt = null; } finally { FechaConexao(); } return dt; } /// <summary> /// Método que executa comandos de Select para retornos escalares, ou seja, /// retorna a primeira linha e primeira coluna do resultado do comando de Select. /// Para nosso exemplo, sempre convertemos esse valor para Double /// </summary> /// <returns>Retorna a primeira linha e primeira coluna do resultado comando de Select</returns> public double ExecutaScalar() { AbreConexao(false); double retorno; try { retorno = Convert.ToDouble(_comandoSQL.ExecuteScalar()); } catch { retorno = -1; } finally { FechaConexao(); } return retorno; } } }
Daqui pra frente utilize sua criatividade e conhecimento para adequar a classe para a realidade do seu projeto.
Espero ter ajudado.
Grande abraço,
Eduardo Henrique Rizo
[twitter-follow screen_name=’eduardorizo’ show_count=’yes’]
Sempre ajuda. Valeu!!