Programação ADO com C# para Acesso a Bancos de Dados

ADO: Tecnologia para Conexão com Bancos de Dados em C#

ADO fornece uma interface padronizada para comunicação com bancos de dados, com implmeentações fornecidas por fabricantes ou terceiros.

1. Integração da Biblioteca ADO

Métodos de instalação:

  • Offline: Baixar manualmente o DLL (ex: mysql.data.dll) e adicionar referência no projeto
  • Online: Utilizar gerenciador de pacotes NuGet

2. Fluxo Básico de Programação ADO

  1. Criar objeto de conexão
  2. Definir comando SQL
  3. Instanciar DbCommand
  4. Executar comando:
    • ExecuteNonQuery(): Para INSERT/UPDATE/DELETE
    • ExecuteScalar(): Para consultas de único valor
    • ExecuteReader(): Para consultas com múltiplos resultados
  5. Processar resultados
  6. Liberar recursos

2.1 Gerenciamento de Conexões

// SQL Server
using Microsoft.Data.SqlClient;
string conexaoStr = "Server=servidor;Database=base;User=usuario;Password=senha;";

// MySQL
using MySql.Data.MySqlClient;
string conexaoStr = "Server=localhost;Database=appdb;Uid=root;Pwd=admin;";

2.2 Execução de Comandos

using (var conexao = new SqlConnection(conexaoStr))
{
    conexao.Open();
    string comandoSQL = "UPDATE Produtos SET Preco = Preco * 1.1";
    using (var cmd = new SqlCommand(comandoSQL, conexao))
    {
        int linhasAfetadas = cmd.ExecuteNonQuery();
        Console.WriteLine($"{linhasAfetadas} registros atualizados");
    }
}

2.3 Prevenção contra SQL Injection

string sql = "SELECT * FROM Usuarios WHERE Login = @user AND Senha = @pass";
using (var cmd = new SqlCommand(sql, conexao))
{
    cmd.Parameters.AddWithValue("@user", usuario);
    cmd.Parameters.AddWithValue("@pass", senha);
    // Execução segura do comando
}

2.4 Leitura de Dados com DataReader

using (var leitor = cmd.ExecuteReader())
{
    while (leitor.Read())
    {
        int id = leitor.GetInt32(0);
        string nome = leitor.GetString(1);
        // Processamento dos dados
    }
}

2.5 Operações Offline com DataSet

var adaptador = new SqlDataAdapter("SELECT * FROM Clientes", conexao);
var dataSet = new DataSet();
adaptador.Fill(dataSet, "Clientes");

// Manipulação offline dos dados
foreach (DataRow linha in dataSet.Tables["Clientes"].Rows)
{
    linha["Nome"] = linha["Nome"].ToString().ToUpper();
}

// Sincronização com o banco
adaptador.Update(dataSet, "Clientes");

3. Controle Transacional

using (var transacao = conexao.BeginTransaction())
{
    try
    {
        var cmd1 = new SqlCommand("UPDATE Contas SET Saldo = Saldo - 100 WHERE ID=1", conexao, transacao);
        var cmd2 = new SqlCommand("UPDATE Contas SET Saldo = Saldo + 100 WHERE ID=2", conexao, transacao);
        
        cmd1.ExecuteNonQuery();
        cmd2.ExecuteNonQuery();
        
        transacao.Commit();
    }
    catch
    {
        transacao.Rollback();
    }
}

4. Classe Auxiliar para Operações com Banco

public static class BancoHelper
{
    private const string STR_CONEXAO = "Server=localhost;Database=appdb;Integrated Security=true;";
    
    public static int ExecutarComando(string sql, List<sqlparameter> parametros = null)
    {
        using (var conexao = new SqlConnection(STR_CONEXAO))
        {
            conexao.Open();
            using (var cmd = new SqlCommand(sql, conexao))
            {
                if (parametros != null) cmd.Parameters.AddRange(parametros.ToArray());
                return cmd.ExecuteNonQuery();
            }
        }
    }
    
    public static SqlDataReader ExecutarLeitura(string sql, List<sqlparameter> parametros = null)
    {
        var conexao = new SqlConnection(STR_CONEXAO);
        conexao.Open();
        var cmd = new SqlCommand(sql, conexao);
        if (parametros != null) cmd.Parameters.AddRange(parametros.ToArray());
        return cmd.ExecuteReader(CommandBehavior.CloseConnection);
    }
}
</sqlparameter></sqlparameter>

Tags: ADO.NET SqlConnection DbCommand DataReader DataSet

Publicado em 7-15 07:20