none
C# Com SQL RRS feed

  • Pergunta

  •  Fala galera!

    Eu ja rodei o blog em busca de ajuda e não achei nd ainda, então vou lançar a pergunta.

    Tenho uma tela no sistema que é mais ou menos o seguinte:

    [combobox1] (nome das lojas que estão na coluna exportar marcadas com 'S') [chkbox1] (Selecionar uma tabela e capturar todas as linhas com o valor 'S' e atualizar para todas as lojas o textbox)

    [textbox] (onde serão enviadas as mensagens para as lojas cuja linha estiver 'S')

    Sou iniciante em C# e SQL, fiz umas pesquisas e o que consegui foi isso:

    if (chkEnvio.checked == true)

     {

       ddLoja.Enable = false; (Caso a Chkbox seja marcada, a mensagem será enviada para todas as lojas marcadas com 'S' na coluna exportar, por isso desabilita a combobox que seleciona apenas uma loja) && "select *Exportar SET 'S' from Tab_Loja AND UPDATE Tab_Loja where Value (Select * Exportar = 'S') GO";

      }

      É  meu primeiro trabalho com C# e banco de dados, quem puder ajudar e se possível não usar uma linguagem muito técnica, pois estou me ambientando com a plataforma, ficarei muito agradecido.

     att,

     Claudio.

    terça-feira, 17 de abril de 2012 14:31

Respostas

  • Olá Claudio,

    Vamos a explicação :)

    SqlDataAdapter da = new SqlDataAdapter(command);
            da.Fill(dt);
    

    O SqlDataAdapter é uma classe que contém um série de comandos próprios para o carregamento e atualização de dados de um banco de dados SQL. No caso, estou fazendo com que o SqlDataAdapter internamente execute o SqlCommand e preencha o DataTable (no caso chamado de "dt") com os dados vindos do banco de dados. O DataTable é uma representação de uma tabela dentro do .Net, assim como em uma tabela do SQL ele também tem colunas e linhas.

        StringBuilder strBldr = new StringBuilder();
        foreach (DataRow item in dt.Rows)
        {
            strBldr.Append(item["Nome"].ToString() + "; ");
        }
    

    Neste bloco estou executando um laço de repetição (looping) acessando cada linha do DataTable, isto é, acessando cada registro vindo da consulta executada, e concatenando o conteúdo da coluna "NOME" (não sei se essa coluna realmente existe em sua tabela, veja qual coluna corresponde ao nome das lojas em sua tabela) de todos os itens resultantes de sua consulta. Neste caso, para concatenar o nome das tabelas estou utilizando um StringBuilder, que é uma classe própria para a concatenação e manipulação de strings. Ele possui melhor performance que o tipo de dados string para o concatenamento de dados.

    using (SqlConnection conn = new SqlConnection("..."))

    Acho que é interessante citar o trecho acima...

    Nesle crio uma conexão com o banco de dados, como não conheço seu banco de dados coloquei o conteúdo "..." como sua connection string. Connection strings são um conjunto de palavras-chave que auxiliam na conexão com bancos de dados. Vc terá de utilizar sua própria connection string.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    • Marcado como Resposta Claudio 007-006 quarta-feira, 18 de abril de 2012 13:41
    quarta-feira, 18 de abril de 2012 02:41
    Moderador

Todas as Respostas

  • Claudio,

    mas o que especificamente vc quer gostaria de fazer, qual é problema que vc esta tento para que a galera do foum possa lhe ajudar

    abraço!


    Herbert Agles
    Se a resposta contribuiu com a sua necessidade, não se esqueça de marcá-la, assim você beneficiará outros usuários. Sua dúvida também pode ser as de outros!

    terça-feira, 17 de abril de 2012 15:49
  • Opa, boa tarde.

    Então, quando o cliente apertar o "btn_enviar" Se a Chkbox1 foi selecionada, então haveria uma seleção na Tab_Loja e na coluna "Exportar" pegar todas as linhas com o valor "S" (Na coluna Exportar, cujos valores são 'S' e 'N'). A mensagem escrita na TxtBox seria carregada para todas as lojas com valor = 'S' da coluna "Exportar".


    Assunto = dúvida

    terça-feira, 17 de abril de 2012 16:07
  • Olá Claudio,

    O código abaixo irá acessar o banco de dados, ler os dados de sua tabela, e então concatená-los e por fim apresentar para o usuário no seu textbox.

    Me diga quais trechos tem dúvida para que eu possa ajuda-lo :)

    if (this.Chkbox1.Checked)
    {
        DataTable dt = new DataTable();
        using (SqlConnection conn = new SqlConnection("..."))
        {
            SqlCommand command = conn.CreateCommand();
            command.CommandText = "SELECT * FROM Tab_Loja WHERE Exportar = 'S'";
            command.CommandType = System.Data.CommandType.Text;
    
            SqlDataAdapter da = new SqlDataAdapter(command);
            da.Fill(dt);
        }
    
        StringBuilder strBldr = new StringBuilder();
        foreach (DataRow item in dt.Rows)
        {
            strBldr.Append(item["Nome"].ToString() + "; ");
        }
    
        this.txtMeuTextBox.Text = strBldr.ToString();
    }

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    quarta-feira, 18 de abril de 2012 02:19
    Moderador
  •  Primeiramente gostaria de agradecer a atenção e apoio, vai me auxiliar muito como profissional ter essa força de pessoas mais experientes.

     Então, eu li o código e entendi parcialmente, irei acrescentá-lo amanhã (torcendo para que dê tudo certo:)

     Mas eu fiquei em dúvida nas seguintes funcionalidades:

     

    <-- SqlDataAdapter da = new SqlDataAdapter(command); da.Fill(dt); } StringBuilder strBldr = new StringBuilder(); foreach (DataRow item in dt.Rows) { strBldr.Append(item["Nome"].ToString() + "; "); } this.txtMeuTextBox.Text = strBldr.ToString(); -->

     Caso não vá te atrapalhar, pode me explicar a funcionalidade deste trecho? Acho que seria legal eu ter esse conhecimento técnico, pois me deparei com passagens semelhantes em algumas apostilas e sites, mas não consegui captar a ideia.

    Agradeço a atenção e o apoio,

    Att, Cláudio.


    Assunto = dúvida

    quarta-feira, 18 de abril de 2012 02:30
  • Olá Claudio,

    Vamos a explicação :)

    SqlDataAdapter da = new SqlDataAdapter(command);
            da.Fill(dt);
    

    O SqlDataAdapter é uma classe que contém um série de comandos próprios para o carregamento e atualização de dados de um banco de dados SQL. No caso, estou fazendo com que o SqlDataAdapter internamente execute o SqlCommand e preencha o DataTable (no caso chamado de "dt") com os dados vindos do banco de dados. O DataTable é uma representação de uma tabela dentro do .Net, assim como em uma tabela do SQL ele também tem colunas e linhas.

        StringBuilder strBldr = new StringBuilder();
        foreach (DataRow item in dt.Rows)
        {
            strBldr.Append(item["Nome"].ToString() + "; ");
        }
    

    Neste bloco estou executando um laço de repetição (looping) acessando cada linha do DataTable, isto é, acessando cada registro vindo da consulta executada, e concatenando o conteúdo da coluna "NOME" (não sei se essa coluna realmente existe em sua tabela, veja qual coluna corresponde ao nome das lojas em sua tabela) de todos os itens resultantes de sua consulta. Neste caso, para concatenar o nome das tabelas estou utilizando um StringBuilder, que é uma classe própria para a concatenação e manipulação de strings. Ele possui melhor performance que o tipo de dados string para o concatenamento de dados.

    using (SqlConnection conn = new SqlConnection("..."))

    Acho que é interessante citar o trecho acima...

    Nesle crio uma conexão com o banco de dados, como não conheço seu banco de dados coloquei o conteúdo "..." como sua connection string. Connection strings são um conjunto de palavras-chave que auxiliam na conexão com bancos de dados. Vc terá de utilizar sua própria connection string.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    • Marcado como Resposta Claudio 007-006 quarta-feira, 18 de abril de 2012 13:41
    quarta-feira, 18 de abril de 2012 02:41
    Moderador
  •  Legal, cara :D Me ajudou muito!!

       StringBuilder strBldr = new StringBuilder();
        foreach (DataRow item in dt.Rows)
        {
            strBldr.Append(item["Nome"].ToString() + "; ");
        }

    Então, fiz umas pesquisas sobre os comandos que enviou... No caso o Foreach iria "compilar" a tabela "Nome_Loja" do meu banco de dados, certo?  poderia me explicar a parte .ToString + "; "?

    O dataRow faz a consulta na coluna, certo?

    Desde já, agradeço a atenção,

    att

    Cláudio.


    Assunto = dúvida

    quarta-feira, 18 de abril de 2012 13:56
  • Olá Claudio,

    Na verdade o Foreach é um comando de iteração, assim como o For.

    A parte do '.ToString + "; "' é simples, irei acessar o conteúdo do campo "Nome", converte-lo em String, e concatenar com um ponto e virgula, apenas para separar um nome do outro.

    O datarow representa a linha da tabela do banco de dados no seu DataTable.

    Quando vc faz um item["NOME"], vc esta acessando a coluna de uma tabela.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    quarta-feira, 18 de abril de 2012 14:31
    Moderador
  • Cara, agora que realmente entendi, reli o que escreveu, creio que me expressei mal... Não para apresentar resultados na Textbox, é para armazená-los e enviá-los quando a Chkbox for marcada, enviando somente para os usuários cujo valor na tabela Exportar seja 'S'... Desculpa por ter me expressado mal.

    Assunto = dúvida

    quarta-feira, 18 de abril de 2012 17:43
  • Olá Claudio,

    Se vc reparar, o comando SQL que estamos utilizando possui um filtro que já retorna todos os registros que possuem o campo Exportar igual a S. Nesse caso todos os resultados retornados pela consulta já possuem o campo Exportar igual a S.

    Vc disse: "enviando somente para os usuários cujo valor". O que vc deseja enviar? Um e-mail? Na tabela de lojas existem dados dos usuários?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    quarta-feira, 18 de abril de 2012 20:46
    Moderador
  •  Então, o "valor" seria o texto escrito na textBox, tipo, pode ser desde números até caracteres, qualquer coisa que o a pessoa escrever deve ser enviada para todos marcados com 'S' na tabela exportar... Assim:

     Eu tenho aquela textBox que havia mencionado, certo? Essa textBox vai salvar um texto, esse será enviado para todos clientes da coluna "Nome_Loja" que estiverem com a coluna "Exportar" marcado com 'S' e ficará disponível para futuras consultas no sistema.


    Assunto = dúvida

    quinta-feira, 19 de abril de 2012 10:55
  • Olá Claudio,

    Nesse caso, pelo o que entendi, vc quer fazer uma atualização na base de dados. Gravando um determinado valor em uma coluna da base de dados de todos os cliente que estiverem com a coluna Exportar marcada como S. Que dados estão contidos na coluna Nome_Loja? Vc tem uma tabela só para clientes?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    quinta-feira, 19 de abril de 2012 11:52
    Moderador
  • Tenho sim, se chama "Tab_anotacao"

    Por exemplo, na textBox o cara vai enviar a msgm:

    "Já passei pela loja."

    Essa msgm da textBox teria que que ficar registrada na "Tab_anotacao" para todas as lojas que na "Tab_Loja" estiverem com 'S' na coluna "Exportar" :D

    Agradeço a atenção e o apoio,

    Claudio.


    Assunto = dúvida

    quinta-feira, 19 de abril de 2012 13:26
  • Cara, eu fiz esse:

      if (chkEnvio.Checked == true)
                {
                    ddlLoja.Enabled = false;
                    {
                        DataTable DT = new DataTable();
                        string strSQL;
                         strSQL = "UPDATE tab_anotacao";
                        {
                            SqlCommand selecionar = conn.CreateCommand();
                            selecionar.CommandText = "select * from 'Tab_Loja' where 'Exportar' = 'S'";
                            selecionar.CommandType = System.Data.CommandType.Text;
                            SqlDataAdapter db = new SqlDataAdapter(selecionar);
                            db.GetFillParameters(DT);
                        }
                            foreach (DataRow Exportar in DT.Rows)
                               if (Exportar > 0)
                                   ExecuteQuery(strSQL);

    Mas ainda não está rodando...


    Assunto = dúvida

    quinta-feira, 19 de abril de 2012 16:20
  • Beleza!

    Estou entendendo seu problema, então , só para que eu possa gerar o código para vc. Vc precisa:

    - Inserir um registro na "tab_anotacao", incluindo o comentário feito no seu textbox, para todas as lojas que estiverem no banco de dados com o campo "EXPORTAR" igual a S.

    Agora, uma pergunta: existe algum campo ligando a tabela TAB_LOJA e a tabela TAB_ANOTACAO?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    quinta-feira, 19 de abril de 2012 17:23
    Moderador
  • Então, eu pensei em tentar um UPDATE e tentar concatenar as 2 com o resultado daquele foreach... mas não tem.

    Como eu faria esse registro na Tab_anotacao?


    Assunto = dúvida

    quinta-feira, 19 de abril de 2012 17:40
  •  Cara, tipow, esse comando do btn_salvar, estou pensando em mudar a posição da minha chkBox e ai teria que bolar um For para pegar as empresas 'S', certo?

     protected void btnSalvar_Click(object sender, EventArgs e)
            {
                string strSQL = string.Empty;

                int IDLoja = Convert.ToInt32(ddlLoja.SelectedValue);
                string Data = Utilitario.ConverteData(txtData.Text.Substring(0, 10));
                string Hora = Utilitario.ConverteHora(txtData.Text.Substring(11));

                if (ItemSelecionado > 0)
                {
                    strSQL = "UPDATE Tab_Anotacao SET Anot_TX_Descricao = '" + TextAnotacoes.Text + "' WHERE Anot_ID_Anotacoes = " + ItemSelecionado.ToString();

                    Session["mensagem"] = "Anotação Alterada com Sucesso";
                }
                else
                {
                    strSQL = "INSERT INTO Tab_Anotacao(Anot_ID_Loja, Anot_DT_Data, Anot_HR_Hora, Anot_TX_Descricao, Anot_SG_Visualizar)";
                    strSQL += " VALUES (" + IDLoja + ", " + Data + ", " + Hora + ", '" + TextAnotacoes.Text + "', 'S')";

                    Session["mensagem"] = "Anotação Incluída com Sucesso";
                }

                if (strSQL.Trim() != "")
                {
                    ControlShopCS.DB d = new DB();
                    d.ExecuteQuery(strSQL);
                    d = null;

                    ltlMensagem.Text = Session["mensagem"].ToString();
                }


    Assunto = dúvida

    quinta-feira, 19 de abril de 2012 17:46
  • Certo Carlos,

    É este mesmo o caminho :)


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    quinta-feira, 19 de abril de 2012 18:42
    Moderador
  • Legal :D Mas então, eu poderia fazer algo assim:

    if (chkEnvio.checked == true)

     Combobox.Visibilidade = False;

     Teria como criar uma função dentro do botão salvar (Aquele que mencionei acima)  e ativá-lo só depois que o estado do Checked ficasse "== True"? Ou seja, ativar uma função do botão salvar dentro da área do Chkbox?


    Assunto = dúvida

    sexta-feira, 20 de abril de 2012 10:44
  • Olá Claudio,

    Neste caso, existe um evento no CheckBox que se chama "OnChecked" (algo assim) que é disparado quando o controle é marcado/desmarcado.

    Neste evento vc deve colocar o código habilitando ou desabilitando o botão.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    sexta-feira, 20 de abril de 2012 11:58
    Moderador
  • Bom Dia!

    Então, cheguei nesse código:

            {
                int i;
                string strSQL = string.Empty;
                string buscaSQL;
                buscaSQL = "SELECT * FROM Tab_Loja WHERE Exportar = 'S'";

                int IDLoja = Convert.ToInt32(ddlLoja.SelectedValue);
                string Data = Utilitario.ConverteData(txtData.Text.Substring(0, 10));
                string Hora = Utilitario.ConverteHora(txtData.Text.Substring(11));

                if (chkEnvio.Checked == true)
                {
                    ddlLoja.Enabled = false;
                }
                for (i = 0; i < buscaSQL.Length; i++)

                {
                    strSQL = "UPDATE Tab_Anotacao SET Anot_TX_Descricao = '" + TextAnotacoes.Text + "' WHERE Anot_ID_Anotacoes = " + ItemSelecionado.ToString();
                }
                {
                    Session["mensagem"] = "Anotação Alterada com Sucesso";
                }
            }

      Será que vocÊ poderia avaliá-lo para mim? Creio que a página fará o  que quero, agora eu tenho que modificar outros erros que ela tá dando, mas em questão do problema que relatei, espero que seja isso :D

     Muito obrigado pelo apoio!!


    Assunto = dúvida

    sexta-feira, 20 de abril de 2012 14:21
  • Cara, ainda estou com uma dúvida.. (Algumas)

     Infelizmente não tenho acesso aos dados do BD (apenas as tabelas e talz) Ai o exemplo do seu foreach para selecionar os dados da DB não deram certo :/

    Consegui fazer a chkEnvio desabilitar o combobox. Agora se puder me ajudar com esse bloco:

    private void CarregaLoja()
            {
                    if (ddlLoja.Enabled == false)
                    {
                        int i;
                        string strSQL;
                        strSQL = "SELECT ( cast( Codigo_Loja as varchar )+ '-' + cast (Nome_Loja as varchar)) AS NomeCodigoLoja FROM Tab_Loja WHERE Exportar = ('S') AND NomeCodigoLoja = "+ Session ["NomeCodigoLoja"].ToString() +"";

                         ControlShopCS.DB d2 = new DB();
                         DataTable dt2 = new DataTable();
                         d2.ExecuteQuery(strSQL, ref dt2);

                        for (i = 0; i < strSQL.Length; i++)
                        {
                            ddlLoja.DataValueField = "NomeCodigoLoja";
                            ddlLoja.DataTextField = "";
                            ddlLoja.DataSource = dt2;
                            ddlLoja.DataBind();
                        }
                    }
                    else
                    {
                        string strSQL;
                        strSQL = " SELECT Codigo_Loja, Nome_Loja FROM Tab_Loja WHERE visualizar='S' AND Codigo_Shop = " + Session["Shop_Select"].ToString() + " ORDER BY Nome_Loja ";

                        ControlShopCS.DB d2 = new DB();
                        DataTable dt2 = new DataTable();
                        d2.ExecuteQuery(strSQL, ref dt2);

                        ddlLoja.DataValueField = "Codigo_Loja";
                        ddlLoja.DataTextField = "Nome_Loja";
                        ddlLoja.DataSource = dt2;
                        ddlLoja.DataBind();
                       
                    }
            }

    A ideia dele é a seguinte:

    - Se o chkEnvio estiver selecionado, o objetivo é enviar para TODOS os usuários que tiverem "S" Como flag na Coluna Exportar do banco de dados.

    Não sei se o problema é ai ou no bloco salvar (creio que não) mas segue:

    protected void btnNovo_Click(object sender, EventArgs e)
            {
                PanelCadastro.Visible = true;
                PanelLista.Visible = false;
                PanelLoja.Visible = false;
                TextAnotacoes.Focus();
            }

            protected void btnSalvar_Click(object sender, EventArgs e)
            {
                string strSQL = string.Empty;

                int IDLoja = Convert.ToInt32(ddlLoja.SelectedValue);
                string Data = Utilitario.ConverteData(txtData.Text.Substring(0, 10));
                string Hora = Utilitario.ConverteHora(txtData.Text.Substring(11));
                if (chkEnvio.Checked == true)
                {
                        strSQL = "INSERT INTO Tab_Anotacao(Anot_ID_Loja, Anot_DT_Data, Anot_HR_Hora, Anot_TX_Descricao, Anot_SG_Visualizar)";
                        strSQL += " VALUES (" + IDLoja + ", " + Data + ", " + Hora + ", '" + TextAnotacoes.Text + "', 'S')";

                        Session["mensagem"] = "Anotação Incluída Para Todos Sucesso";
                }

                else if (ItemSelecionado > 0)
                {
                    strSQL = "UPDATE Tab_Anotacao SET Anot_TX_Descricao = '" + TextAnotacoes.Text + "' WHERE Anot_ID_Anotacoes = " + ItemSelecionado.ToString();
                    Session["mensagem"] = "Anotação Alterada com Sucesso";
                }
                else
                {
                    strSQL = "INSERT INTO Tab_Anotacao(Anot_ID_Loja, Anot_DT_Data, Anot_HR_Hora, Anot_TX_Descricao, Anot_SG_Visualizar)";
                    strSQL += " VALUES (" + IDLoja + ", " + Data + ", " + Hora + ", '" + TextAnotacoes.Text + "', 'S')";

                    Session["mensagem"] = "Anotação Incluída com Sucesso";
                }

                if (strSQL.Trim() != "")
                {
                    ControlShopCS.DB d = new DB();
                    d.ExecuteQuery(strSQL);
                    d = null;

                    ltlMensagem.Text = Session["mensagem"].ToString();
           

    Desde já agradeço a atenção.


    Assunto = dúvida


    sexta-feira, 4 de maio de 2012 15:20