none
Problema com update complexo RRS feed

  • Pergunta

  • Bom dia caros amigos.

    Imaginem o seguinte cenário.

    O Dataset dsFutebol tem duas tabelas "Equipas" e "Jogos". Estas duas tabelas estão relacionadas da seguinte forma.

    Em cada jogo na tabela "Jogos" existem dois campo (EquipaVisitada e EquipaVisitante) que estão relacionados à tabela "Equipas" no campo "Equipas.ID"

    Na aplicação

    dgv.DataSource = dsFutebol.Tables["Jogos"];

    cmd.CommandText = "Select Jogos.ID, Jogos.Jornada, Jogos.Data, Equipas.Nome As 'Visitada', Equipas.Nome As 'Visitante' " +

                                      "From Jogos " +

                                       "Left Join Equipas AS Visitada  ON Jogos.Visitada   = Visitada.ID "
                                       "Left Join Equipas AS Visitante ON Jogos.Visitante  = Visitante.ID "

    da.SelectCommand = cmd;

    da.Fill(dsFutebol, "Jogos");

    Até aqui tudo bem, aliás o comando SELECT é mais complexo na realidade, mas aqui para o propósito do exemplo está bom.

    O datagridview mostra os jogos tudo muito bem, mostras as equipas pelo nome como pretendido e não pelo ID como é guardado na tabela "Jogos".

    Agora o problema está em quando eu adiciono ou edito algum registo no dataridview. Porque por exemplo se adicionar um jogo

    ID = 100, Jornada = 12, Data = 04/Mar/2017, Visitada = Brasil, Visitante = Portugal.

    Aqui tenho um problema uma vez que quando quiser fazer o update não vou conseguir uma vez que as equipas na tabela "Jogos" são guardadas pelo ID e não pelo nome.

    Como resolver este problema da forma mais elegante.

    Muito obrigado pelo vosso tempo

    • Editado bro 840 sábado, 4 de março de 2017 13:23
    sábado, 4 de março de 2017 13:20

Respostas

  • Olá,
    Opção 1(e mais elegante):Trazer os ID's das equipes(se tiver no banco de dados) durante seu select com join inicial

    Opção 2: na clausula de update na tabela Jogos, fazer um subselect na tabela Equipes pra recuperar o id
    Ex:update Jogos
    set x=1
    where IDEquipe = (select idequipe from Equipes where nome='Brasil')

    Ok?
    -

    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta
    • Marcado como Resposta bro 840 sábado, 4 de março de 2017 14:52
    sábado, 4 de março de 2017 14:25

Todas as Respostas

  • Olá,
    Opção 1(e mais elegante):Trazer os ID's das equipes(se tiver no banco de dados) durante seu select com join inicial

    Opção 2: na clausula de update na tabela Jogos, fazer um subselect na tabela Equipes pra recuperar o id
    Ex:update Jogos
    set x=1
    where IDEquipe = (select idequipe from Equipes where nome='Brasil')

    Ok?
    -

    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta
    • Marcado como Resposta bro 840 sábado, 4 de março de 2017 14:52
    sábado, 4 de março de 2017 14:25
  • Obrigado pela resposta.

    O que estou a fazer na realidade é a primeira opção. Ou seja a tabela Equipas é composta por duas colunas, sendo elas Equipas.ID Equipas.Nome

    Antes de eu submeter os updates para a base de dados eu tenho este método.

     private int? ConvertTeams(string Team)
            {
                int? ID = null;

                foreach (DataRow Teams in DS.Tables["Teams"].Rows)

                    if (Teams["Team"].ToString() == Team)
                    {
                        ID = Int32.Parse(Teams["TeamID"].ToString());

                        return (ID);
                    }

                return (ID);
            }

    Mas eu não queria estar a criar um método do tipo Foreach por exemplo na tabela equipas até encontrar o ID correspondente das equipas  Portugal e Brasil.

    Eu queria fazer directo pelo Dataadapter.

    Uma vez que tenho as duas tabelas necessárias no Dataset e tenho também as relações não há um método mais elegante? Por exemplo escolhe Brasil no datagrid mas o valor ser ser o ID da equipa correspondente. 

    • Editado bro 840 sábado, 4 de março de 2017 14:36
    sábado, 4 de março de 2017 14:33