none
Dúvida com ProgressBar RRS feed

  • Pergunta

  • Olá pessoal, estou tentando processar a tabela de VENDEDORES, e ao mesmo tempo mostrar uma barra de progresso usando o ProgressBar, mas quando chega na linha pro.Start(), da erro, estou tentando executar a string sql que possui o comando de seleção que quero fazer, o que há de errado na rotina abaixo ?

    progresso.Visible = true;
    Process pro = new Process();

    string sql = "SELECT CODVEN, NOMVEM FROM VENDEDORES";

    pro.StartInfo = new ProcessStartInfo(sql);

    pro.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    pro.Start(); <--- Erro aqui
    progresso.Value = 100;

    C#, WindowsForm.

    terça-feira, 21 de novembro de 2017 18:17

Respostas

  • Este processo tem três gargalos: na execução da consulta no banco, no tráfego dos dados pela rede e na criação das linhas do grid.

    A única forma que vejo que poderia ter um andamento mais próximo do real é pegar a quantidade de registros e fazer uma paginação no lado do servidor (exemplo abaixo), ou seja, se há 300 mil registros, você busca 5 mil registros por vez, daí a cada leitura você incrementa o % de progresso. No entanto, isso aumentará o tráfego de rede.

    O que recomendo na verdade é verificar se sua query está demorando devido a índices faltantes ou query não otimizada, e olhar algum componente de grid de terceiros que tenha leitura por demanda (paginação dinâmica utilizando rolagem de tela).

    SELECT COLUNA1, COLUNA2 FROM TABELA limit 0, 5000


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    quinta-feira, 23 de novembro de 2017 16:13

Todas as Respostas

  • Meu caro, a classe Process serve para iniciar executáveis no Windows, ou seja, abrir um outro programa. Se quiser executar o SQL você precisa é de utilizar as classes de acesso a banco de dados como SqlConnection, SqlCommand, etc. (http://www.macoratti.net/08/11/c_adn_1.htm) ou então utilizar o executável do SQL Server que permite a execução de SQL via linha de comando.

    using System;
    using System.Data;
    using System.Data.SqlClient;
    
    /// <summary>
    /// Demonstra como trabalhar abrir uma conexão com SqlConnection
    /// </summary>
    class SqlConnectionDemo{
    
    static void Main()
    {
       // 1. Instancia a conexão(objeto SqlConnection)
       SqlConnection conn = new SqlConnection("Data Source=.\\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=SSPI");
       //
       // define um SqlDataReader nulo
       SqlDataReader dr = null;
    try
     {
        // 2. Abre a conexão
        conn.Open();
        // 3. Passa conexão para o objeto command
        SqlCommand cmd = new SqlCommand("select * from Customers", conn);
       //
       // 4. Usa conexão
       // obtêm o resultado da consulta
       dr = cmd.ExecuteReader();
       // imprime o codigo do cliente para cada registro
       while (dr.Read())
       {
          Console.WriteLine(dr[0]);
        } 
     }
     finally
     {
        // fecha o reader
         if (dr != null)
        {
          dr.Close();
        }
        // 5. Fecha a conexão
        if (conn != null)
        {
           conn.Close();
        }
     }
    }
    }

    Se fosse executar um SQL via linha de comando (que acredito não ser o seu real objetivo), seria algo do tipo:

    sqlcmd -U myLogin -P myPassword -S MyServerName -d MyDatabaseName
      -Q "SELECT CODVEN, NOMVEM FROM VENDEDORES"


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.



    terça-feira, 21 de novembro de 2017 18:44
  • olá Juliano, eu tenho uma tabela com milhares de linhas, e para selecionar os registros dessa tabela, demora um pouco, então gostaria de colocar um ProgressBar para mostrar o progresso para o usuário, tem como mostrar um real progresso da seleção dessa tabela com MySQL, encontrei muitos exemplos mas apenas mostrando como se usa o ProgressBar, mas com tabelas, não encontrei  nenhum exemplo.

    WindowsForm, C#, MySQL

    Obrigado.

    terça-feira, 21 de novembro de 2017 19:40
  • Olá,

    Você pode até exibir uma ProgressBar, porém será uma uma ProgressBar indeterminada, ou seja, uma ProgressBar que move continuamente, sem mostrar o real percentual da operação. As classes de execução de SQL e recuperação de dados não informam o progresso da leitura, por isso não tem como mostrar o real andamento.

    Além disso não ficou claro se a sua dúvida é sobre exibir o andamento real (% de progresso) ou se é como comunicar com banco de dados.

    Como disse que o banco é MySQL, segue um artigo: http://macoratti.net/11/04/C_MySQL_CRUD.pdf


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    terça-feira, 21 de novembro de 2017 22:44
  • Olá Juliano, bom dia.

    A intenção é exibir o andamento real (% de progresso) conforme uma tabela está sendo processada para ser mostrada em um Grid, pelo que entendi não tem como, porque está acontecendo de uma tabela contem muitas linhas e demora para abrir, então o usuário está achando que o sistema travou.

    WindowsForm, C#, MySQL

    Obrigado.

    quinta-feira, 23 de novembro de 2017 11:40
  • Boa tarde Porter.

    Tem sim como fazer isso.

    Complementando o que o Juliano falou acima, pra você saber o percentual de andamento do processo, primeiro você precisa saber a quantidade de registros que irá processar.

    Sabendo isso você pode fazer um cálculo a cada adição no Grid do percentual.

    Por exemplo, se a quantidade é 100 e já tem 20 linhas, você pode fazer o calculo  (100*20)/100

    Se a quantidade for 45, (100*45)/100 

    e assim por diante.

    Na barra de progresso você coloca esse valor.

    Espero ter ajudado,

    Abs

    quinta-feira, 23 de novembro de 2017 14:57
  • Este processo tem três gargalos: na execução da consulta no banco, no tráfego dos dados pela rede e na criação das linhas do grid.

    A única forma que vejo que poderia ter um andamento mais próximo do real é pegar a quantidade de registros e fazer uma paginação no lado do servidor (exemplo abaixo), ou seja, se há 300 mil registros, você busca 5 mil registros por vez, daí a cada leitura você incrementa o % de progresso. No entanto, isso aumentará o tráfego de rede.

    O que recomendo na verdade é verificar se sua query está demorando devido a índices faltantes ou query não otimizada, e olhar algum componente de grid de terceiros que tenha leitura por demanda (paginação dinâmica utilizando rolagem de tela).

    SELECT COLUNA1, COLUNA2 FROM TABELA limit 0, 5000


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    quinta-feira, 23 de novembro de 2017 16:13
  • Bom dia,

    Por falta de retorno essa thread está sendo encerrada.

    Se necessário, favor abrir uma nova thread.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 27 de novembro de 2017 12:58
    Moderador