Aprenda C#

  • Página Inicial
  • Contato!
  • Tudo sobre C# Parte 1!
  • Tudo sobre C# Parte 2!
  • Tudo sobre C# Parte 3!
  • Tudo sobre C# Parte 4!
  • Tudo sobre C# Parte 5!
  • Tudo sobre C# Parte 6!
  • Tudo sobre C# Parte 7!
  • Tudo sobre C# Parte 8!
  • Tudo sobre C# Parte 9!
  • Tudo sobre C# Parte 10!
  • C# com Banco de Dados Parte 1

    Criando Bancos e Tabelas

    Crie o aplicativo Windows Form para o sistema de academia, que será feito no nosso projeto.

    Para adicionar o pacote SQLite no projeto, vá em Gerenciador de Soluções, Gerenciar Pacotes do Nuget, caso não esteja instalado, procure pelo pacote System.Data.SQLite e instale no nosso projeto.

    Crie um banco de dados com o nome academia.db3 e coloque ele na pasta "bancos" dentro do projeto, e coloque esse código:

    
    create table if not exists usuario (
        id integer not null primary key autoincrement,
        nome varchar(30) not null,
        username varchar(20) not null unique,
        senha varchar(40) not null,
        status char(1) not null,
        nivel integer not null
    );
    
    

    Classe para as Funções do Banco de Dados

    Coloque na pasta de projetos a pasta imgs e as imagens de led verde e vermelho. Na tela principal (primeiro form), coloque um container panel e coloque ele na parte inferior (em Dock coloque a opção bottom) e deixe ele com um cinza um pouco mais escuro. Coloque um Picture Box com o name imgLed e do lado dele quatro labels, um escrito acesso, um numérico com o name lblAcs, um escrito usuário e o último com o nome de usuário e name lblUser.

    Vá em Gerenciador de Soluções, no Nome do Projeto e em Propriedades (no mesmo local onde alteramos o ícone do programa), clique duas vezes em Resources e adicione os arquivos de imagem nele. Vá em Adicionar Recurso e Adicionar Arquivo Existente. Em Image coloque o Led Image, para ajustar ela vá em SizeMode e coloque a opção StrechImage.

    Crie a classe Banco com esse código:

    
    // Inclua System.Data e System.Data.SQLite
    class Banco {        
        private static SQLiteConnection conexao;
        private static string dirAtual = Directory.GetCurrentDirectory(); // Inclua System.IO
    
        private static SQLiteConnection conexaoBanco() {
            conexao = new SQLiteConnection($"Data Source={dirAtual}\\bancos\\academia.db3"); // Duas barras sempre, colocar a pasta do banco no local onde está o binário
            
            conexao.Open();
    
            return conexao;
        }
    }
    
    

    Formulário de Login - Parte 1

    Crie na classe Banco esse método:

    
    public static DataTable obterTodosUsuarios() {
        SQLiteDataAdapter dataAp = null;
        DataTable dataTab = new DataTable();
    
        try {
            using(SQLiteCommand comando = conexaoBanco().CreateCommand()) {
                comando.CommandText = "select * from usuario"; // Comando SQL
    
                dataAp = new SQLiteDataAdapter(comando.CommandText, conexaoBanco());
    
                dataAp.Fill(dataTab);
    
                conexaoBanco().Close();
    
                return dataTab;
            }
        }
        catch(Exception ex) {
            MessageBox.Show($"ERRO: {ex.Message}", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
        
            conexaoBanco().Close();
    
            return null;
        }
    }
    
    

    Crie um formulário pra login e nele coloque os labels e textBox para login e senha e os botões de enviar e cancelar, e mude os names deles (o campo de senha deve ser colocado o asterisco no passwordChar, pode ser a bolinha ● também).

    Na classe do Form1, coloque isso no construtor:

    
    public Form1() {
        InitializeComponent();
    
        FormLogin fLogin = new FormLogin(this);
    }
    
    

    Na classe do FormLogin, faça assim:

    
    public partial class FormLogin : Form {
        Form1 form;
        DataTable dataTab = new DataTable();
    
        public FormLogin(Form1 f) {
            InitializeComponent();
    
            form = f;
        }
    }
    
    

    Formulário de Login - Parte 2

    No form principal, coloque o picture box e os labels com os modificadores public, em propriedades, já que vamos manipular eles pelo outro formulário.

    No formLogin, adicione os eventos de clicar dos botões enviar e cancelar.

    Crie a classe Global com esse código:

    
    class Global {
        public static string versao = "1.0";
        public static bool logado = false;
        public static int nivel = 0;
    }
    
    

    Nos eventos do botão de login e cancelar, coloque esse código:

    
    private void btnEnv_Click(object sender, EventArgs e) {
        string user = txtLogin.Text.Trim();
        string senha = txtSenha.Text.Trim();
    
        if(user.Equals("") || senha.Equals("")) {
            MessageBox.Show("Preencha Todos os Campos!", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    
            txtLogin.Focus();
    
            return;
        }
    
        string sql = "select * from usuario where username = @user and senha = @senha";
        Dictionary<string, string> parametros = new Dictionary<string, string>();
    
        parametros.Add("@user", user);
        parametros.Add("@senha", senha);
    
        dataTab = Banco.consultaBanco(sql, parametros);
    
        if(dataTab.Rows.Count == 1) {
            // Duas formas de fazer:
            form.lblAcs.Text = dataTab.Rows[0].ItemArray[5].ToString(); // O número do segundo array é o número da coluna a partir do 0
            form.lblUser.Text = dataTab.Rows[0].Field<string>("username"); // Nome do campo desejado do SQL
            form.imgLed.Image = Properties.Resources.led_green;
    
            Global.nivel = int.Parse(dataTab.Rows[0].Field<Int64>("nivel").ToString());
            Global.logado = true;
    
            this.Close();
        }
        else {
            MessageBox.Show("Usuário e/ou Senha Incorretos!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
    
    private void btnCanc_Click(object sender, EventArgs e) {
        this.Close();
    }
    
    

    Os campos com arroba, são consultas preparadas para evitar SQL Injection.

    Na classe Banco, crie esses métodos genéricos para consulta:

    
    public static DataTable consultaBanco(string sql) {
        SQLiteDataAdapter dataAp = null;
        DataTable dataTab = new DataTable();
    
        try {
            using(SQLiteCommand comando = conexaoBanco().CreateCommand()) {
                comando.CommandText = sql; // Comando SQL
    
                dataAp = new SQLiteDataAdapter(comando.CommandText, conexaoBanco());
    
                dataAp.Fill(dataTab);
    
                conexaoBanco().Close();
    
                return dataTab;
            }
        } 
        catch(Exception ex) {
            MessageBox.Show($"ERRO: {ex.Message}", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
    
            conexaoBanco().Close();
    
            return null;
        }
    }
    
    public static DataTable consultaBanco(string sql, Dictionary<string, string> dados) {
        SQLiteDataAdapter dataAp = null;
        DataTable dataTab = new DataTable();
    
        try {
            using(SQLiteCommand comando = conexaoBanco().CreateCommand()) {
                comando.CommandText = sql;
    
                if(dados.Count > 0) {
                    foreach(KeyValuePair<string, string> d in dados) {
                        comando.Parameters.AddWithValue(d.Key, d.Value);
                    }
                }
    
                comando.CommandType = CommandType.Text;
    
                dataAp = new SQLiteDataAdapter(comando.CommandText, conexaoBanco());
    
                dataAp.SelectCommand = comando;
    
                dataAp.Fill(dataTab);
    
                conexaoBanco().Close();
    
                return dataTab;
            }
        }
        catch(Exception ex) {
            MessageBox.Show($"ERRO: {ex.Message}", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
    
            conexaoBanco().Close();
    
            return null;
        }
    
    

    Coloque um cadastro no SQLite, por exemplo:

    
    insert into usuario (nome, username, senha, status, nivel) values ('Andressa', 'dessa80', '123', 'A', '7');
    
    

    Coloque no form principal um menu com login e os itens entrar e sair, com esse código:

    
    private void itEntr_Click(object sender, EventArgs e) { // O código desse evento pode ser colocado também no evento load do form principal.
        FormLogin form = new FormLogin(this);
    
        form.ShowDialog();
    }
    
    private void itSair_Click(object sender, EventArgs e) {
        this.lblAcs.Text = "0";
        this.lblUser.Text = "---";
        this.imgLed.Image = Properties.Resources.led_red;
    
        Global.nivel = 0;
        Global.logado = false;
    }
    
    

    PS: Para criptografar senhas, use essa classe:

    
    class CriptSenha {
        // Inclua System.Text e System.Security.Cryptography
        public static string encripta(string valor, string tipo) {
            string hash;
    
            if(tipo.Equals("SHA-1")) {
                SHA1 dados = new SHA1CryptoServiceProvider();
    
                hash = BitConverter.ToString(dados.ComputeHash(Encoding.UTF8.GetBytes(valor))).Replace("-", string.Empty).ToLower();
            }
            else if(tipo.Equals("SHA-256")) {
                SHA256 dados = new SHA256CryptoServiceProvider();
    
                hash = BitConverter.ToString(dados.ComputeHash(Encoding.UTF8.GetBytes(valor))).Replace("-", string.Empty).ToLower();    
            }
            else {
                MD5 dados = new MD5CryptoServiceProvider();
    
                hash = BitConverter.ToString(dados.ComputeHash(Encoding.UTF8.GetBytes(valor))).Replace("-", string.Empty).ToLower();
            } 
            
            return hash;
        }
    }
    
    

    E aonde usar ela, coloque assim:

    
    parametros.Add("@senha", CriptSenha.encripta(senha, "SHA-1"));
    
    

    PS: A senha deverá estar guardada no banco no mesmo formato do método.