none
selecionar vários itens da listview e gravar no banco ordenado, um a um, linha a linha RRS feed

  • Pergunta

  • Agora um mais difícil, pra mim pelo menos....

    temos uma tabela 1, que tem prédio e salas, prédio A, sala01, sala 02...., precisamos colocar pessoas nessas salas. Essas pessoas vem de outra tabela(2), que preenche o listview. Esse lvi tem checkboxes e é multiselect. Vai fazer como? Seleciona as pessoas pelos checkboxes e clica num botão para colocar cada pessoa numa sala, em sequencia. Se selecionar a pessoa 1, a pessoa 4, a pessoa 7, deve colocar a pessoa 1 na sala 1, a pessoa 4 na sala 2, a pessoa 7 na sala 3, direto no banco pra exibição no grid....estou fazendo isso assim:

    private void btnAlocar_Click(object sender, EventArgs e)
            {
                foreach (ListViewItem item in listView2.CheckedItems)
                {
                    if (item.Checked == true)
                    {
                        int j = listView2.CheckedItems.Count;
                        try
                        {
                            SqlConnection con = new SqlConnection(conexaoString);

                            con.Open();

                            for (int i = 0; i < (j); i++)
                            {
                                var cmd = new SqlCommand(@"UPDATE salas SET
                                nomePessoa=@nomePessoa, cargo=@cargo, idPessoa=@idPessoa WHERE idSala=@idSala", con);

                                cmd.Parameters.AddWithValue("@idSala", Convert.ToInt32(dgvSalas.CurrentRow.Cells["idSala"].Value.ToString()));

                                cmd.Parameters.AddWithValue("@nomePessoa", item.SubItems[0].Text);
                                cmd.Parameters.AddWithValue("@idPessoa", Convert.ToInt32(item.SubItems[3].Text));

                                cmd.ExecuteNonQuery();
                            }
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show($"Erro ao alocar Pessoa: {ex.Message}");
                        }
                        finally
                        {
                            SqlConnection con = new SqlConnection(conexaoString);
                            this.salasTableAdapter.Fill(this.bdDataSet.salas);

                            con.Close();
                            con.Dispose();
                        }
                    }
                }

            }

    ele faz a inserção, mas de uma pessoa só, não estou conseguindo que passe pra linha seguinte e insira os demais selecionados, onde estou errando, não consigo achar o erro....

    segunda-feira, 6 de fevereiro de 2017 18:26

Respostas

  • Agora que vi o loop externo para os itens..

    private void btnAlocar_Click(object sender, EventArgs e) {
      // Armazeno o valor da primeira sala
      int sala = Convert.ToInt32(dgvSalas.CurrentRow.Cells["idSala"].Value.ToString());
    
      try {
       SqlConnection con = new SqlConnection(conexaoString);
    
       con.Open();
    
       foreach(ListViewItem item in listView2.CheckedItems) {
        if (item.Checked == true) {
    
    
         using(var cmd = new SqlCommand(@ "UPDATE salas SET
           nomePessoa = @nomePessoa, cargo = @cargo, idPessoa = @idPessoa WHERE idSala = @idSala ", con)) {
    
            cmd.Parameters.AddWithValue("@idSala", sala);
    
            cmd.Parameters.AddWithValue("@nomePessoa", item.SubItems[0].Text);
            cmd.Parameters.AddWithValue("@idPessoa", Convert.ToInt32(item.SubItems[3].Text));
    
            cmd.ExecuteNonQuery();
            // Incremento o valor da sala para o loop
            sala++;
           }
    
          }
         }
    
        } catch (Exception ex) {
         MessageBox.Show($ "Erro ao alocar Pessoa: {ex.Message}");
        } finally {
         SqlConnection con = new SqlConnection(conexaoString);
         this.salasTableAdapter.Fill(this.bdDataSet.salas);
    
         con.Close();
         con.Dispose();
        }
       }

    PS: Não estou compilando o código para testar.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    • Marcado como Resposta tracaja terça-feira, 7 de fevereiro de 2017 19:31
    terça-feira, 7 de fevereiro de 2017 17:20

Todas as Respostas

  • Não sei como é a estrutura das suas tabelas, mas você não deveria estar fazendo um INSERT para cada pessoa? 

    Pois no seu código a cada loop você dá um UPDATE no mesmo registro.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    segunda-feira, 6 de fevereiro de 2017 18:54
  • não, pq essa tabela vai ser preenchida em várias etapas, a primeira já foi, qdo coloco os predios, daí coloco as pessoas, então faço um update....

    Acho que o mais importante é que tem um idpredio, nome predio, idpessoa, nomepessoa, idsala, e nomesala, tudo relacionado...só preciso resolver o for aí pra ele andar de linha em linha adicionando os selecionados....não estou chegando num resultado.....

    segunda-feira, 6 de fevereiro de 2017 19:30

  • Quais as colunas que compõem a chave desta tabela? idpredio e idsala? Caso sim, você deveria incluir o idsala na cláusula where também, senão a cada passo do loop você irá atualizar todos os registros.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    terça-feira, 7 de fevereiro de 2017 15:00
  • já vou testar...
    terça-feira, 7 de fevereiro de 2017 15:27
  • idPredio né? idSala já tá lá no where...

    não foi não....

    terça-feira, 7 de fevereiro de 2017 15:39
  • Sua tabela salas deve ter um registro pra cada pessoa selecionada? Caso sim, no momento do loop estes registro já existem no banco?

    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    terça-feira, 7 de fevereiro de 2017 15:59
  • sim, vou fazer o update inserindo o idpessoa e nomepessoa em cada sala, nesse momento não tem esses dados, tenho os predios e as salas, e aí vou colocar as pessoas, posteriormente poderá ser feita alteração dos valores...

    coloquei um +i aqui assim:

     cmd.Parameters.AddWithValue("@idSala", Convert.ToInt32(dgvSalas.CurrentRow.Cells["idSala"].Value.ToString()+i));

    pra ver se ele andava as linhas, até foi, mas inseriu um nome no current row e outro na primeira linha....

    terça-feira, 7 de fevereiro de 2017 16:43
  • Não estou entendendo bem sua lógica, mas tente assim:

    private void btnAlocar_Click(object sender, EventArgs e)
            {
                foreach (ListViewItem item in listView2.CheckedItems)
                {
                    if (item.Checked == true)
                    {
                        int j = listView2.CheckedItems.Count;
                        try
                        {
                            SqlConnection con = new SqlConnection(conexaoString);
    
                            con.Open();
                            // Armazeno o valor da primeira sala
                            int sala = Convert.ToInt32(dgvSalas.CurrentRow.Cells["idSala"].Value.ToString());
    
                            for (int i = 0; i < (j); i++)
                            {
                                var cmd = new SqlCommand(@"UPDATE salas SET
                                nomePessoa=@nomePessoa, cargo=@cargo, idPessoa=@idPessoa WHERE idSala=@idSala", con);
    
                                cmd.Parameters.AddWithValue("@idSala", sala);
    
                                cmd.Parameters.AddWithValue("@nomePessoa", item.SubItems[0].Text);
                                cmd.Parameters.AddWithValue("@idPessoa", Convert.ToInt32(item.SubItems[3].Text));
    
                                cmd.ExecuteNonQuery();
                                // Incremento o valor da sala para o loop
                                sala++;
                            }
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show($"Erro ao alocar Pessoa: {ex.Message}");
                        }
                        finally
                        {
                            SqlConnection con = new SqlConnection(conexaoString);
                            this.salasTableAdapter.Fill(this.bdDataSet.salas);
    
                            con.Close();
                            con.Dispose();
                        }
                    }
                }
    
            }


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".


    terça-feira, 7 de fevereiro de 2017 16:59
  • pra já...
    terça-feira, 7 de fevereiro de 2017 17:08
  • vixe, quase...ele inseriu duas vezes o mesmo nome, mas em linhas seguidas...

    o erro está no loop não é? e eu não estou conseguindo ver....penas que não consigo inserir uma imagem, tenho certeza que ia entender se visse a tela....

    terça-feira, 7 de fevereiro de 2017 17:13
  • Agora que vi o loop externo para os itens..

    private void btnAlocar_Click(object sender, EventArgs e) {
      // Armazeno o valor da primeira sala
      int sala = Convert.ToInt32(dgvSalas.CurrentRow.Cells["idSala"].Value.ToString());
    
      try {
       SqlConnection con = new SqlConnection(conexaoString);
    
       con.Open();
    
       foreach(ListViewItem item in listView2.CheckedItems) {
        if (item.Checked == true) {
    
    
         using(var cmd = new SqlCommand(@ "UPDATE salas SET
           nomePessoa = @nomePessoa, cargo = @cargo, idPessoa = @idPessoa WHERE idSala = @idSala ", con)) {
    
            cmd.Parameters.AddWithValue("@idSala", sala);
    
            cmd.Parameters.AddWithValue("@nomePessoa", item.SubItems[0].Text);
            cmd.Parameters.AddWithValue("@idPessoa", Convert.ToInt32(item.SubItems[3].Text));
    
            cmd.ExecuteNonQuery();
            // Incremento o valor da sala para o loop
            sala++;
           }
    
          }
         }
    
        } catch (Exception ex) {
         MessageBox.Show($ "Erro ao alocar Pessoa: {ex.Message}");
        } finally {
         SqlConnection con = new SqlConnection(conexaoString);
         this.salasTableAdapter.Fill(this.bdDataSet.salas);
    
         con.Close();
         con.Dispose();
        }
       }

    PS: Não estou compilando o código para testar.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    • Marcado como Resposta tracaja terça-feira, 7 de fevereiro de 2017 19:31
    terça-feira, 7 de fevereiro de 2017 17:20
  • pow!!! num creio que era só tirar o if....putz....que mancada....

    Mas agora foi, perfeito.

    Obrigado.

    terça-feira, 7 de fevereiro de 2017 19:31