none
Problema ao gravar dados em textbox RRS feed

  • Pergunta

  • Boa noite,

    Estou desenvolvendo um projeto (em camadas)em que tenho um form com vários textbox e tem um botão de pesquisa. Quando o usuário digita algo no campo CPF e clica no botão de pesquisar, todos os outros textbox deverão ser preenchidos com os respectivos dados que consta no BD (SqlServer). Como faço isso?? Já faz um tempo que estou quebrando a cabeça e não consigo desenvolver algo do tipo...

    Grato pela atenção.

    sábado, 29 de dezembro de 2012 05:29

Respostas

  • Já creie um projeto de teste e lhe enviei em seu E-mail..!

    Debuga o código com BreakPoint para vc ver o funcionamento de passo-a-passo.

    Atenciosamente

    André


    domingo, 30 de dezembro de 2012 22:29

Todas as Respostas

  • ...

    O que você está usando para acesso aos dados?

    Tá usando algum framework?

    Mostra ai..


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    sábado, 29 de dezembro de 2012 10:35
  • Olá, Fernando..!

    1º. Qual o SGBD que vc esta utilizando.?

    2º. Você falou que quando o usuário digita qualquer coisa dentro do TextBox-CPF, vc já imaginou se ele digitar apenas alguns digitos, então sistema irá trazer mais de um registro, isso será um grande erro.

    3º. Assim como o "Murilo" sitou, mostra ai o que vc fez e ta usando.!

    4º. Mas o que vc esta querendo não é tão complicado, primeiro basta vc pensar de possiveis acontecimentos que podem ocorre quando o usuário estive utilizando seu sistema.

    // --> Fala um pouco mais para que possamos ajuda.!

    passa ai seu email que vou lhe enviar um exemplo. que tenho aki em minha maquina..!

    Atenciosamente

    André

    sábado, 29 de dezembro de 2012 12:42
  • "O que você está usando para acesso aos dados?". Seria o Banco de Dados?? Se for, estou utilizando o SqlServer.

    "Tá usando algum framework?". Estou começando a desenvolver faz pouco tempo, o que seria framework?

    Com alguns dados da Net, eu montei algo assim...

    Na minha camada DAL, eu criei um método para fazer a pesquisa:

    -----------------------------------------------------------------------

    public string SelecionarPaciente(clPaciente pac)
            {
                SqlCommand cmd = new SqlCommand("Pcd_PesquisaPaciente", conexao.AbrirConexao());
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.AddWithValue("@PAC_NOME", pac.nome);
                cmd.Parameters.AddWithValue("@PAC_CPF", pac.cpf);
                cmd.Parameters.AddWithValue("@PAC_ENDERE", pac.endereco);
                cmd.Parameters.AddWithValue("@PAC_BAIRRO", pac.bairro);
                cmd.Parameters.AddWithValue("@PAC_CIDADE", pac.cidade);
                cmd.Parameters.AddWithValue("@PAC_CEP", pac.cep);
                cmd.Parameters.AddWithValue("@PAC_UNIFED", pac.unidade_federativa);
                cmd.Parameters.AddWithValue("@PAC_TELEFO", pac.telefone);
                cmd.Parameters.AddWithValue("@PAC_CEL", pac.celular);
                cmd.Parameters.AddWithValue("@PAC_EMAIL", pac.email);
                cmd.Parameters.AddWithValue("@PAC_OBS", pac.observacao);
                

                SqlDataAdapter adp = new SqlDataAdapter(cmd);
                DataTable ds = new DataTable();
                adp.Fill(ds);

                if (ds.Rows.Count > 0)
                {
                    pac.nome = ds.Rows[0]["PAC_NOME"].ToString();
                    pac.cpf = ds.Rows[0]["PAC_CPF"].ToString();
                    pac.endereco = ds.Rows[0]["PAC_ENDERE"].ToString();
                    pac.bairro = ds.Rows[0]["PAC_BAIRRO"].ToString();
                    pac.cep = ds.Rows[0]["PAC_CEP"].ToString();
                    pac.unidade_federativa = ds.Rows[0]["PAC_UNIFED"].ToString();
                    pac.telefone = ds.Rows[0]["PAC_TELEFO"].ToString();
                    pac.celular = ds.Rows[0]["PAC_CEL"].ToString();
                    pac.email = ds.Rows[0]["PAC_EMAIL"].ToString();
                    pac.observacao = ds.Rows[0]["PAC_OBS"].ToString();


                }                
                else 
                {
                    MessageBox.Show("ERRO AQUI!!");
                }

                return SelecionarPaciente(pac);
                //conexao.FecharConexao();

    -----------------------------------------------------------------------

    e no botão que server para efetuar a pesquisa eu fiz isso:

    -----------------------------------------------------------------------

    clPacienteDAL pacdal = new clPacienteDAL();

                pac.nome = textBox2.Text.ToUpper();
                pac.cpf = pac.Formatar(maskedTextBox1.Text);
                pac.endereco = textBox3.Text.ToUpper();
                pac.bairro = textBox5.Text.ToUpper();
                pac.cidade = textBox4.Text.ToUpper();
                pac.cep = pac.Formatar(maskedTextBox2.Text);
                pac.unidade_federativa = comboBox1.Text;
                pac.telefone = pac.Formatar(maskedTextBox3.Text);
                pac.celular = pac.Formatar(maskedTextBox4.Text);
                pac.email = textBox6.Text;
                pac.observacao = textBox7.Text.ToUpper();

                pacdal.SelecionarPaciente(pac);

    -----------------------------------------------------------------------

    E quando eu rodo a aplicação, acontece um erro aqui:

    adp.Fill(ds);

    sábado, 29 de dezembro de 2012 13:59
  • Olá,

    1º Estou usando o SqlServer;

    2º Eu imaginei essa situação, mas primeiro eu  quero ver a aplicação rodando e depois que estiver tudo certo eu vou tratar para que isso não aconteça;

    3º Eu coloquei o método que trata isso no resposta que dei ao Murilo;

    4º Já pensei nisso e é como eu mencionei no item 2.

    Tudo que eu fiz até o momento foi com ajuda da Net e de fóruns, no último caso, eu lhe envio meu e-mail....fico grato!

    sábado, 29 de dezembro de 2012 14:05
  • Ok, sem problemas, mas vou postar aki a parte que acho que vai lhe ajuda, se fica interessado dé uma olhada e faz um teste....minha inteção era te mandar tudo que fiz.., mas olha aew 30% do projeto, acho que esta parte irá lhe ajuda..!!

    //1º. OLHA AEW O CODIGO DO SQL QUE USEI PRA FAZER O //TESTE..
    /*
    Create Database BDProduto
    Go
    
    Use BDProduto
    Go
    
    Create Table Produtos
    (
        Pro_codigo Int Identity(1,1)    Not Null,
        Pro_descricao Varchar(50)        Not Null,
        Pro_pvenda    Decimal(10,2)        Not Null,
        Pro_saldo    Int                    Not Null
    )
    Go
    
    Insert Into Produtos Values ('Computador Positivo Preto', 850, 1)
    Insert Into Produtos Values ('Monitor Samsung', 200, 1)
    Insert Into Produtos Values ('Tv Semp', 200, 1)
    Go
    */
    
    //2º.CRIAR UMA CLASS "Atributos" PARA DEFINIR TRIBUTOS //DE TIPO CAMPOS E PROPRIEDADE PARA ARMAZENAMENTO DE //DADOS E TRANSFERENCIA DOS MESMO.
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace AjudaForumRetornoTxt
    {
        class Atributos
        {
            private int pro_codigo;
            public int Pro_codigo
            {
                get { return pro_codigo; }
                set { pro_codigo = value; }
            }
    
            private string pro_descricao;
            public string Pro_descricao
            {
                get { return pro_descricao; }
                set { pro_descricao = value; }
            }
    
            private decimal pro_pvenda;
            public decimal Pro_pvenda
            {
                get { return pro_pvenda; }
                set { pro_pvenda = value; }
            }
    
            private int pro_saldo;
            public int Pro_saldo
            {
                get { return pro_saldo; }
                set { pro_saldo = value; }
            }
    
        }
    }
    
    //3º CRIAR UM CLASS "Bll" REGRA DE NEGOCIO
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace AjudaForumRetornoTxt
    {
        class Bll
        {
            public void BuscarProduto(Atributos objProduto, int codigo)
            {
                try
                {
                    Dal conDal = new Dal();
                    conDal.PesquisaProduto(objProduto, codigo);
                }
                catch (Exception ex)
                {                
                    throw ex;
                }
            }
        }
    }
    
    //4º. CRIAR UMA CLASS "Dal" DEFINIDA ESPECIALMENTE //PARA CONEXÃO DA BASE
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.SqlClient; // -> Aki
    using System.Data; // -> Aki
    
    namespace AjudaForumRetornoTxt
    {
        class Dal
        {
            //String de Conexão
            string conexao = (@"Server = .\SQLEXPRESS; Database = BDProduto; Integrated Security = true");
            //Instanciando a Class de Conexão e para ser chamada somente quando necessário
            SqlConnection conn = null;
    
            public void PesquisaProduto(Atributos objProduto, int codigo)
            {            
                try
                {
                    using (conn = new SqlConnection(conexao))
                    {
                        SqlCommand cmd = new SqlCommand("Select * From Produtos Where Pro_codigo = " + codigo, conn);                    
                        cmd.CommandType = CommandType.Text;
    
                        conn.Open();
                        SqlDataReader read = cmd.ExecuteReader();
    
                        if (read.HasRows)
                        {
                            while (read.Read())
                            {
                                objProduto.Pro_codigo = Convert.ToInt32(read["Pro_codigo"]);
                                objProduto.Pro_descricao = read["Pro_descricao"].ToString();
                                objProduto.Pro_pvenda = Convert.ToDecimal(read["Pro_pvenda"]);
                                objProduto.Pro_saldo = Convert.ToInt32(read["Pro_saldo"]);   
                            }
                            read.Close();
                        }
                        else
                        {
                            throw new Exception("Não existe produto cadastro com este código..!");
                        }                       
                    }
                }
                catch (SqlException ex)
                {
                    throw ex;
                }
                finally
                {
                    conn.Close();
                }
            }
        }
    }
    
    //5º. E AKI ABAIXO O CODIGO POR TRAS DO BUTTON. QUE IRA FAZER A CONSULTA..
    
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace AjudaForumRetornoTxt
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void btnPesquisar_Click(object sender, EventArgs e)
            {
                try
                {
                    if (!string.IsNullOrEmpty(txtCodigo.Text))
                    {
                        int codigo = Convert.ToInt32(txtCodigo.Text);
                        Atributos objProduto = new Atributos();
                        Bll bll = new Bll();
                        bll.BuscarProduto(objProduto, codigo);
    
                        txtNome.Text = objProduto.Pro_descricao;
                        txtValor.Text = objProduto.Pro_pvenda.ToString();
                        txtSaldo.Text = objProduto.Pro_saldo.ToString();
                    }
                    else
                    {
                        MessageBox.Show("Informe um código a ser pesquisado..!");
                        txtCodigo.Focus();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Erro = " + ex.Message);
                    txtCodigo.Focus();
                }
               
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                txtCodigo.Focus();
            }
        }
    }
    
    //OK, VER AI..! TENHO CERTEZA QUE SE FIZER DO JEITO //QUE ESTA AKI VAI DA CERTO..
    
    

    At

    André

    e desculpas..!




    sábado, 29 de dezembro de 2012 15:31
  • André,

    No método public void PesquisaProduto(AtributosobjProduto, intcodigo),

    porque você colocou AtributosobjProduto, intcodigo ??

    Porque vc colocou SqlDataReaderread =cmd.ExecuteReader(); ??

    E no trecho txtNome.Text =objProduto.Pro_descricao, pq vc não colocou objProduto.Pro_descricao.ToString();??

    Ainda não testei na aplicação, mas acho que irá ajudar, qualquer dúvida eu lhe incomodo novamente....

    sábado, 29 de dezembro de 2012 16:24
  • Fernando, sem problema pode fica avontade gosto de ajudá..!

    Então vamos lá eu vou te explicar..!

    <<""porque você colocou AtributosobjProduto, intcodigo ??"">>

    R = O que que acontese, como eu falei criar um "Class" e definir os seguintes tritubos do tipo campo e propriedades, no cajo na chamado do método já estou instanciando a Class e a memsa irá receber o valores lido na base de dados..! O int codigo é codigo ou o cpf que estou transferindo quando o método ser executado e passando para a expressão Sql..ou seja, este é o filtro..!

    <<""Porque vc colocou SqlDataReaderread =cmd.ExecuteReader(); ??"">>

    R = Pq ele vai fazer uma leitura dos dados e passar essa leitura para as propriedadesda Class Atributos..! Desta mesma forma eu consigo retorna uma coleção de dados..!

    <<""E no trecho txtNome.Text =objProduto.Pro_descricao, pq vc não colocou objProduto.Pro_descricao.ToString();??"">>

    R = Proque o Pro_descricao já é string, ou seja, já esta da forma que o TextBox espera! mas do jeito que vc adicionou ai da certo também, no caso dos outro campos é pq são de tipo de dados diferente de string..! por isso tenho que converte pra string até pq os TextBox esperam valores do tipo string.!

    Atenciosamente

    André

    sábado, 29 de dezembro de 2012 17:17
  • André,

    No botão de pesquisar eu fiz isso, 

    textBox2.Text = pac.nome.ToString();
    maskedTextBox1.Text = pac.cpf.ToString();

    e apresenta esse o erro Referência de objeto não definida para uma instância de um objeto. na primeira linha.

    No código, eu preciso especificar qual campo será usado como filtro ou somente na query, que no caso eu estou usando procedure.....

    O método que faz a pesquisa ficou assim agora:

    SqlCommand cmd = new SqlCommand("Pcd_PesquisaPaciente", conexao.AbrirConexao());
    cmd.CommandType = CommandType.StoredProcedure;

     SqlDataReader read = cmd.ExecuteReader();

     pac.nome = read[pac.nome].ToString();
     pac.cpf = read[pac.cpf].ToString();
    read.Close();


    sábado, 29 de dezembro de 2012 17:55
  • Desta forma não vai funciona..!

    1º. RESPONDENDO SUA PERTUNGA..

    -*/*--------------------------------------------------------------------------------------------------------------------*/

    <<<No código, eu preciso especificar qual campo será usado como filtro ou somente na query, que no caso eu estou usando procedure.....>>>

    R = Vc precisa dentro do seu formulário dar uma opção de filtro para o usuário, tipo.

    Ex.. Digite o código do cliente dentro do campo código e clica no botão pesquisar..!!

    Então ai sim vai funcioná pq é uma opção do usuário..!

    Se vc definir isso na Query ele sempre vai retorna os dados que vc definil lá..!

    Ex..: Select * From Cliente Where Cli_codigo = 1

    Sempre retornará o cliente do código 1..

    ------------------

    Seria isto, se isso for sua duvida..!

    -*/*--------------------------------------------------------------------------------------------------------------------*/

    Pelo o que eu estou vendo, assim como vc disse que esta usando Procedure, mas veja bem. Nesta linha.

    << "SqlCommand cmd = new SqlCommand("Pcd_PesquisaPaciente", conexao.AbrirConexao());
    cmd.CommandType = CommandType.StoredProcedure;" >>

    Se vc olhar bem vc não esta passando nem um parametro de "filtro".

    Obs. Uma opião minha..! Eu não usaria procedure nesta situação..!! Eu também utilizo PROCEDURES em meus projetos, mas somente para INSERT, UPDATE OU DELETE E OUTROS TIPOS DE PROCESSO QUE NÃO SERÁ NEM UM TIPO DE RETORNO, mas para retorna dados eu utilizo sempre o DataSet que é uma boa pratica de programçao pq a mesma oference um recuso de trabalho de forma desconectada com a Base e o SqlDataRead e tem também o DataTable.!!

    Faz o seguinte, para que eu possa lhe ajuda, que de minha parte não ter nem um problema, me mostra um print deste seu forme e especifica o que que vc esta querendo fazer..! Assim eu posso lhe ajuda e dá algumas dicas..!!

    Isto é se puder, sem compromisso, até pq talvez vc não queria mostra sua tela....!!!

    Mas se vc for ver e análisa este Threads aki, eu já postei um código com 3 class adicional pra tenta te ajuda..! Então eu quero te ajuda..!!!Falou..

    Ver ai o que vc pode me passa de informação..! Para que isso possa lhe ajuda..!

    T+

    André


    sábado, 29 de dezembro de 2012 18:47
  • Desta forma não vai funciona..!

    1º. RESPONDENDO SUA PERTUNGA..

    -*/*--------------------------------------------------------------------------------------------------------------------*/

    <<<No código, eu preciso especificar qual campo será usado como filtro ou somente na query, que no caso eu estou usando procedure.....>>>

    R = Vc precisa dentro do seu formulário dar uma opção de filtro para o usuário, tipo.

    Ex.. Digite o código do cliente dentro do campo código e clica no botão pesquisar..!!

    Então ai sim vai funcioná pq é uma opção do usuário..!

    Se vc definir isso na Query ele sempre vai retorna os dados que vc definil lá..!

    Ex..: Select * From Cliente Where Cli_codigo = 1

    Sempre retornará o cliente do código 1..

    ------------------

    Seria isto, se isso for sua duvida..!

    -*/*--------------------------------------------------------------------------------------------------------------------*/

    Pelo o que eu estou vendo, assim como vc disse que esta usando Procedure, mas veja bem. Nesta linha.

    << "SqlCommand cmd = new SqlCommand("Pcd_PesquisaPaciente", conexao.AbrirConexao());
    cmd.CommandType = CommandType.StoredProcedure;" >>

    Se vc olhar bem vc não esta passando nem um parametro de "filtro".

    Obs. Uma opião minha..! Eu não usaria procedure nesta situação..!! Eu também utilizo PROCEDURES em meus projetos, mas somente para INSERT, UPDATE OU DELETE E OUTROS TIPOS DE PROCESSO QUE NÃO SERÁ NEM UM TIPO DE RETORNO, mas para retorna dados eu utilizo sempre o DataSet que é uma boa pratica de programçao pq a mesma oference um recuso de trabalho de forma desconectada com a Base e o SqlDataRead e tem também o DataTable.!!

    Faz o seguinte, para que eu possa lhe ajuda, que de minha parte não ter nem um problema, me mostra um print deste seu forme e especifica o que que vc esta querendo fazer..! Assim eu posso lhe ajuda e dá algumas dicas..!!

    Isto é se puder, sem compromisso, até pq talvez vc não queria mostra sua tela....!!!

    Mas se vc for ver e análisa este Threads aki, eu já postei um código com 3 class adicional pra tenta te ajuda..! Então eu quero te ajuda..!!!Falou..

    Ver ai o que vc pode me passa de informação..! Para que isso possa lhe ajuda..!

    T+

    André

    Olha eu de novo....com relação a primeira pergunta, foi apenas uma pergunta boba mesmo, pois em minha procedure eu passei tudo por parâmetros. Só estou respondendo a isso, pois para quem ler não pensar que sou tapado.....rsrs.

    Em relação a sua opinião, vou acatar, pois pelo visto vc tem boa experiência nessa área......Qual diferença entre Dataset e Datatable?? O print que vc pediu, seria do código do form de pesquisa? me passa seu e-mail que eu lhe mando.

    T+.


    domingo, 30 de dezembro de 2012 02:14
  • --------------------------------------------------------------------------------------------------------------------

    1º. RESPONDENDO SUA PERGUNTA

    DataSet:

    É projetada explicitamente para tratar o acesso a toda a fonte de dados de forma independente. Podem ser usadas múltiplas e diferentes fontes de dados, intercaladas com dados de XML, ou usadas para controlar dados locais da aplicação. O DataSet contém uma coleção de uma ou mais DataTable, com as suas colunas e linhas de dados, assim como chaves primárias e estrangeiras e possibilita relacionamento entre esses objetos.


    DataTable:

    Os objetos DataTable são usados para representar tabelas em um DataSet. Um DataTable representa uma tabela em memória com dados relacionados e pode ser usado de forma independente de uma DataSet.

    --------------------------------------------------------------------------------------------------------------------

    O print que eu queria era da tela do Formulário que vc esta tentando adiciona o código por trás.!

    Mas como vc resaltou e pediu pra te passa meu E-mail, esta aki..!!

    inforoliver@gmail.com

    Ver o que vc consegui passa que vou ver como que pode fica bom pra vc e tbm vou comenta as linha falando o que cada uma esta fazendo assim vai fica melho o seu entedimento no final vou cria um *.doc com um diagrama que vai fica legal..! Vc vai ter  100% de aproveitamento, não esquece do script da base de dados pra ter o trabalho de digitar tudo, e lá adicionar tudo que vc precisa.!Ok

    T+

    André


    domingo, 30 de dezembro de 2012 13:53
  • Kra, já lhe enviei....
    domingo, 30 de dezembro de 2012 17:49
  • Ok, recebi aki, vou dar uma olhada.

    Ok

    domingo, 30 de dezembro de 2012 18:52
  • Já creie um projeto de teste e lhe enviei em seu E-mail..!

    Debuga o código com BreakPoint para vc ver o funcionamento de passo-a-passo.

    Atenciosamente

    André


    domingo, 30 de dezembro de 2012 22:29
  • Depois de várias trocas de e-mail tentando identificar a situação, eis a solução

    método da camada DAL

    --

     public void SelecionarPaciente(clPaciente pac)
            {
                SqlCommand cmd = new SqlCommand("SELECT * FROM ClinicaFisio.dbo.PACIENTE where PAC_NOME = @PAC_NOME", conexao.AbrirConexao());///*PAC_NOME, PAC_CPF, PAC_ENDERE, PAC_BAIRRO, PAC_CIDADE, PAC_CEP, PAC_UNIFED, PAC_TELEFO, PAC_CEL, PAC_EMAIL, PAC_OBS*/
                cmd.CommandType = CommandType.Text;

                cmd.Parameters.AddWithValue("@PAC_NOME", pac.nome);

                SqlDataReader read = cmd.ExecuteReader();//Porque SqlDataReader e logo após ExecuteReader, traduzindo -> ExecuteReader = Execute a Leitura, ou seja, será feita a feitura de tudo conforme a parâmetrização se tem filtro ou não.            

                if (read.HasRows)
                {
                   while (read.Read())
                   {
                      pac.nome = read["PAC_NOME"].ToString();
                      pac.cpf = pac.Formatar(read["PAC_CPF"].ToString());
                      pac.endereco = read["PAC_ENDERE"].ToString();
                   }

                   read.Close();//Fecha a leitura de dados
                }
                else
                {
                   throw new Exception("Erro aqui!!");
                }
            }

    --No código do botão de pesquisa, foi add o seguinte código.

    private void button1_Click(object sender, EventArgs e)
            {           
                if (textBox2.Text != string.Empty)
                {
                    pac.nome = textBox2.Text;
                    pacdal.SelecionarPaciente(pac);

                    textBox2.Text = pac.nome;
                    maskedTextBox1.Text = pac.cpf;
                    textBox3.Text = pac.endereco;                
                }
                else 
                {
                    MessageBox.Show("Primeiro informe um nome a ser pesquisado.!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Information); // Aki, vc sabe
                }
            }

    ------------------------------------------------------------------------------------------------------------------

    Agradeço ao André pela grande ajuda e pelo Murilo.

    Abraços.

    segunda-feira, 31 de dezembro de 2012 18:54