Jump to content
Hashatjin

Dúvidas sobre Database, Datagridview e Querys.....

Recommended Posts

Hashatjin

Boas, preciso de ajuda urgente em algumas coisas sou novo cá ainda não entendo isto muito bem mas preciso de ajuda...
Eu ando a programar algumas coisas em C# com utilização de database e Windows Forms...

Eu gostaria de saber se alguém me pode recomendar alguns tutoriais sobre a utilização de querys para preencher uma datagridview usando informações variadas da database...

Do género na figura seguinte da tabela eu queria trocar os números das selecções e dos estádios por os seus nomes repetitivos nomes... Alguém me pode me ajudar com as querys necessárias para isso?  

gowQYd.png

Share this post


Link to post
Share on other sites
apocsantos

Boa tarde,

Tuturial não conheço nenhum em particular. Existem alguns bons livros sobre C#. Na net encontras alguns engraçados e tens um bom artigo na revista PROGRAMAR C# CRUD (CREATE, READ, UPDATE & DELETE).

Deixo aqui mais um link para um outro livro disponível na net. ftp://soporte.uson.mx/publico/02_ING.SISTEMAS.DE.INFORMACION/PVI/Beginning C%23 5.0 databases(1).pdf.

Se só pretendes preencher uma gridview, cá fica um exemplo

 

MySql.Data.MySqlClient.MySqlConnection conn; string myConnectionString; myConnectionString = "server=127.0.0.1;uid=root;" + "pwd=12345;database=test;"; try { conn = new MySql.Data.MySqlClient.MySqlConnection(); conn.ConnectionString = myConnectionString; conn.Open(); } catch (MySql.Data.MySqlClient.MySqlException ex) { MessageBox.Show(ex.Message); }

private void DataGridDoMysql()
{
  MySql.Data.MySqlClient.MySqlConnection conn;
  string myConnectionString;

  myConnectionString = "server=127.0.0.1;uid=root;" + "pwd=12345;database=test;";

  try
  {
      conn = new MySql.Data.MySqlClient.MySqlConnection();
      conn.ConnectionString = myConnectionString;
      conn.Open();
  }
  catch (MySql.Data.MySqlClient.MySqlException ex)
  {
      MessageBox.Show(ex.Message);
  }
   MySqlDataAdapter MyDataAdapter = new MySqlDataAdapter();
          string sqlSelectAll = "SELECT * from minhaTabela";
          MyDA.SelectCommand = new MySqlCommand(sqlSelectAll, conn);
          DataTable table = new DataTable();
          MyDataAdapter.Fill(table);

          BindingSource bSource = new BindingSource();
          bSource.DataSource = table;
          dataGridView1.DataSource = bSource;
}

Cordiais cumprimentos,

Apocsantos

  • Vote 2

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
Hashatjin

Sim, entendo, obrigado pelos links... A ideia é apresentar a tabela que apresentei anteriormente só que em vez de aparecer nela a dizer o cod_estadio aparecer o nome do estádio vindo buscar essa informação a seguinte tabela... Problema já tentei todo tipo de querys... e nada...

Se escrever o codigo para alterar o nome da tabela também agradecia! 

fniPxl.png

Share this post


Link to post
Share on other sites
apocsantos

Boa tarde,

Podes literalmente usar o mesmo código que usei anteriormente, apenas alteras a query.

private void DataGridDoMysql()
{
  MySql.Data.MySqlClient.MySqlConnection conn;
  string myConnectionString;

  myConnectionString = "server=127.0.0.1;uid=root;" + "pwd=12345;database=test;";

  try
  {
      conn = new MySql.Data.MySqlClient.MySqlConnection();
      conn.ConnectionString = myConnectionString;
      conn.Open();
  }
  catch (MySql.Data.MySqlClient.MySqlException ex)
  {
      MessageBox.Show(ex.Message);
  }
   MySqlDataAdapter MyDataAdapter = new MySqlDataAdapter();
          string sqlSelectAll = "SELECT euro2016.jogo.cod_estadio, euro2016.jogo.cod_tipo_jogo, euro2016.estadio.nome, euro2016.jogo.cod_selecao_1, euro2016.jogo.cod_selecao_2, euro2016.jogo.golos_selecao_1,  euro2016.jogo.golos_selecao_2 from euro2016.jogo left join euro2016.estadio on (euro2016.jogo.cod_estadio = euro2016.estadio.cod_estadio)";
          MyDA.SelectCommand = new MySqlCommand(sqlSelectAll, conn);
          DataTable table = new DataTable();
          MyDataAdapter.Fill(table);

          BindingSource bSource = new BindingSource();
          bSource.DataSource = table;
          dataGridView1.DataSource = bSource;
}

 

Cordiais cumprimentos,

Apocsantos

  • Vote 1

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
Hashatjin

Obrigado a query que disponibilizou ajudou bastante porem surgiu um problema... 

Onde aparece cod_selecão_2 ainda não consegui trocar pelos nomes das respectivas selecções...

Select euro2016.jogo.data as Data , euro2016.tipo_jogo.tipo_jogo as Fase , euro2016.estadio.nome as Estadio,
 euro2016.selecao.nome as Seleção_1,euro2016.jogo.golos_selecao_1 as Golos, euro2016.jogo.cod_selecao_2,  euro2016.jogo.golos_selecao_2
 as Golos from euro2016.jogo left join euro2016.estadio on (euro2016.jogo.cod_estadio = euro2016.estadio.cod_estadio)
 left join euro2016.tipo_jogo on (euro2016.jogo.cod_tipo_jogo = euro2016.tipo_jogo.cod_tipo_jogo) 
 left join euro2016.selecao on (euro2016.jogo.cod_selecao_1 = euro2016.selecao.cod_selecao)

KZvwQ3.png

 

 

Também possui outra coisa que gostava de aprender, como adicionar informação a tabela sendo que as combobox presentes dispõe do nome presente nas outras tabelas e não dos números da tabela euro2016.jogo... A data também da um erro de ordem pois eu não consigo mudar o formato por mais que mude para yyyy-mm-dd ele depois de executar o programa ele volta ao estado anterior dd-mm-yyyy 

tqjnbp.png

Aqui esta o código que eu estava a tentar fazer... A query muito provavelmente é o errado da coisa... Se não for tudo xD

 private void Add_Jogo_Click(object sender, EventArgs e)
        {
            MySqlConnection con = new MySqlConnection(@"server=localhost;user id=root;password=12345;database=euro2016");
            con.Open();
            if (selecao2.Text == selecao1.Text)
            {
                MessageBox.Show("Não pode colocar uma selação a jogar contra si mesma!");
            }
            else
            {
                string t = "insert into (euro2016.tipo_jogo.tipo_jogo, euro2016.estadio.nome, euro2016.selecao.nome,euro2016.jogo.golos_selecao_1, euro2016.jogo.golos_selecao_2 from euro2016.jogo left join euro2016.estadio on (euro2016.jogo.cod_estadio = euro2016.estadio.cod_estadio) left join euro2016.tipo_jogo on (euro2016.jogo.cod_tipo_jogo = euro2016.tipo_jogo.cod_tipo_jogo) left join euro2016.selecao on (euro2016.jogo.cod_selecao_1 = euro2016.selecao.cod_selecao)) values ('" + comboBox1.Text + "','" + comboBox2.Text + "','" + selecao1.Text + "','" + Gol1.Text + "','" + Gol2.Text + "');";
                MySqlCommand cmdDataBase = new MySqlCommand(t, con);
                cmdDataBase.ExecuteNonQuery();
                MySqlDataReader myreader;
                try
                {
                    myreader = cmdDataBase.ExecuteReader();
                    MessageBox.Show("Jogo Introduzido com Sucesso!");
                    while (myreader.Read())
                    {

                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                con.Close();

Obrigado pela atenção,

Hashatjin

Share this post


Link to post
Share on other sites
apocsantos

Boa noite,

Estou mesmo a parar, depois de umas horas "em distraction free mode", a programar. No final de jantar, respondo-te à tua duvida!

A paciência e a perseverança, são boas características num programador!

Aproveita e deixa-me se fazes o favor, o nome das tabelas onde armazenas as selecções, para poder fazer a query adequada.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
N3lson

Aqui tens um exemplo usando o DataReader e personalizando headers da grid bem com os valores a retornar

Este exemplo usa como baseDados o access mas no MySql é idêntico so tens de trocar o OLEBD.. por MySql...

Confere os comentários para veres a razão de eu usar este método, desculpa a query e campos serem estes mas peguei num projecto meu para te ajudar

// Listagem das aves
        public void aves(int id = 0, string sexo = "")
        {
            dataGridView1.DataSource = null;

            DataRow row = null;

            string query = "SELECT * FROM Aves ";

            if(sexo !="")
            {
                query += " WHERE sexo = ";

                switch (sexo)
                {
                  case "M":
                    query += "M";
                  break;
                  case "F":
                    query += "F";
                  break;
                }
            }

            if (id != 0)
            {
                query += " AND id = @id;";
            }
            
            DataTable dt = new DataTable();

            try
            {
                using (OleDbConnection con = new OleDbConnection(cfg.connectionString)) // Este constring é a string de ligar a base de dados
                {
                    using(OleDbCommand cmd = new OleDbCommand( query, con))
                    {
                        con.Open();

                        if (id != 0)
                        {
                            cmd.Prepare();
                            cmd.Parameters.AddWithValue("@id", id);
                        }

                        OleDbDataReader reader = cmd.ExecuteReader();

                        List<string> t = new List<string>() { "id", "Mutação", "Anilha", "Ano", "Sexo"};

                        DataColumn detalhes = new DataColumn("detalhes", typeof(Bitmap));

                        dt.Columns.Add(detalhes);

                        foreach (string h in t)
                        {
                            dt.Columns.Add(h);
                        }

                        while (reader.Read())
                        {
                            row = dt.NewRow();

                            Bitmap ver = new Bitmap(MS_ACESS.Properties.Resources.property); // Imagem para clicar

                            row[0] = ver;
                            row[1] = reader["id"];
                            row[2] = reader["mutacao"];
                            row[3] = reader["anilha"];
                            row[4] = reader["ano"];
                            row[5] = funcao.GetSexo(Convert.ToChar(reader["sexo"])); // usar funções personalizadas para apresentar texto no lugar de numeros que niguem sabe de que são e a que corresponde 

                            dt.Rows.Add(row);
                        }

                        dataGridView1.DataSource = dt;

                        this.dataGridView1.Columns["id"].Visible = false;   // Esconder id
                        this.dataGridView1.Columns["detalhes"].FillWeight = 15; // Limitar tamanho da header para o que pretenderes
                        this.dataGridView1.Columns["detalhes"].HeaderText = ""; // Esconder texto header (caso pretendas usar imagem) 

                    } 
                    con.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }
        }

 

Edited by N3lson

You can't do it, kid. But don't worry, my boy. You're not the only one. No one else can do it.

Share this post


Link to post
Share on other sites
Hashatjin
17 minutos atrás, apocsantos disse:

Boa noite,

Estou mesmo a parar, depois de umas horas "em distraction free mode", a programar. No final de jantar, respondo-te à tua duvida!

A paciência e a perseverança, são boas características num programador!

Aproveita e deixa-me se fazes o favor, o nome das tabelas onde armazenas as selecções, para poder fazer a query adequada.

Cordiais cumprimentos,

Apocsantos

O nome da tabela é selecao ... podes ver essa tabela na primeira imagem colocada na minha mensagem anterior...

Share this post


Link to post
Share on other sites
apocsantos

Boa noite,

Então cá vai, primeiro o código em C# para a app, e depois o SQL separado para veres como se faz. Porque eu já sei fazer, fazer mais uma vez, menos uma vez, não faz grande diferença, mas para quem está a aprender todas as tentativas, são um passo na "jornada de mil milhas".

private void DataGridDoMysql()
{
  MySql.Data.MySqlClient.MySqlConnection conn;
  string myConnectionString;

  myConnectionString = "server=127.0.0.1;uid=root;" + "pwd=12345;database=test;";

  try
  {
      conn = new MySql.Data.MySqlClient.MySqlConnection();
      conn.ConnectionString = myConnectionString;
      conn.Open();
  }
  catch (MySql.Data.MySqlClient.MySqlException ex)
  {
      MessageBox.Show(ex.Message);
  }
   MySqlDataAdapter MyDataAdapter = new MySqlDataAdapter();
          
  string sqlSelectAll = "Select euro2016.jogo.data as Data , euro2016.tipo_jogo.tipo_jogo as Fase , euro2016.estadio.nome as Estadio ,    euro2016.selecao.nome as Seleção_1, euro2016.jogo.golos_selecao_1 as Golos_1, euro2016.selecao.nome as Seleção_1 as selecao_2, euro2016.jogo.golos_selecao_2  as Golos_2 from euro2016.jogo left join euro2016.estadio on (euro2016.jogo.cod_estadio =  euro2016.estadio.cod_estadio) left join euro2016.tipo_jogo on (euro2016.jogo.cod_tipo_jogo = euro2016.tipo_jogo.cod_tipo_jogo)  left join euro2016.selecao on (euro2016.jogo.cod_selecao_1 = euro2016.selecao.cod_selecao)";
          
          MyDA.SelectCommand = new MySqlCommand(sqlSelectAll, conn);
          DataTable table = new DataTable();
          MyDataAdapter.Fill(table);

          BindingSource bSource = new BindingSource();
          bSource.DataSource = table;
          dataGridView1.DataSource = bSource;

  //altera aos cabeçalhos da dataGrid
  //como na tropa e na programação o zero também é numero
  dataGridView1.Columns[3].HeaderText = "1ª Selecção";
  dataGridView1.Columns[5].HeaderText = "2ª Selecção";
  
  //altera a formatação da data na datagrid:
  dataGrid.Columns[0].DefaultCellStyle.Format = "MM/dd/yyyy HH:MM:ss";

}

 

Update usando bindingDataSource:

private void ActualizarButton_Click(object sender, System.EventArgs e)
    {
        // Actualiza a base de dados com a informação que o utilizador colocou na datagridview
        dataAdapter.Update((DataTable)bSource.DataSource);
    }

 

SQL

Select 
  euro2016.jogo.data as Data , 
  euro2016.tipo_jogo.tipo_jogo as Fase , 
  euro2016.estadio.nome as Estadio ,
  euro2016.selecao.nome as Seleção_1, 
  euro2016.jogo.golos_selecao_1 as Golos_1,
  euro2016.selecao.nome as Seleção_1 as selecao_2,
  euro2016.jogo.golos_selecao_2  as Golos_2
  from euro2016.jogo 
  left join euro2016.estadio on (euro2016.jogo.cod_estadio = euro2016.estadio.cod_estadio) 
  left join euro2016.tipo_jogo on (euro2016.jogo.cod_tipo_jogo = euro2016.tipo_jogo.cod_tipo_jogo) 
  left join euro2016.selecao on (euro2016.jogo.cod_selecao_1 = euro2016.selecao.cod_selecao)

Adicionar informação como estas a usar bindingdatasource, tens tudo facilitado, caso contrario acabarias tendo de escrever um insert ou um update conforme fosse o caso.

E antes que me esqueça a questão dos códigos de selecção, foi de certeza distracção! Olha bem para o meu SQL e para o teu! Repara no nome dos campos! :D

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.