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
- Criar objeto de conexão
- Definir comando SQL
- Instanciar DbCommand
- Executar comando:
ExecuteNonQuery(): Para INSERT/UPDATE/DELETEExecuteScalar(): Para consultas de único valorExecuteReader(): Para consultas com múltiplos resultados
- Processar resultados
- 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>