Jump to content

Visualizar dados de uma BD em textbox´s


D3POD

Recommended Posts

Boa tarde, estou a tentar visualizar os dados que tenho numa BD em Access.

Eu já tenho isso feito para uma datagridview, mas isso é no primeiro form.

A ideia é que ao clicar no botão alterar, seja aberto o form2 com as textbox's e que os dados correspondestes ao cliente seleccionado no form1 sejam colocados nos respectivos textbox's.

Assim posso alterar os dados que lá estão e posso fazer gravar... e isso actualiza a BD.

O código que tenho é este (atenção que este código está errado e já foi alterado podendo nem fazer sentido):

private void Form3_Load(object sender, EventArgs e)
{
 // Uso da classe Classeid
 txt_id.Text = Convert.ToString(Classeid.id);
 string id_clientes = txt_id.Text;
 
 // Conexão à BD
 OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Clientes.accdb;Persist Security Info=False");

 // String de Filtro
 string query = "SELECT * FROM Clientes [Nome] = @nome, [Telefone] = @telefone, [Telemóvel] = @telemovel, [Morada] = @morada, [Contribuinte] = @contribuinte, [Email] = @email, [Licença] = @licenca, [Chave de Activação] = @activacao WHERE ID = @ID_Cliente";

 // Comando da BD
 OleDbCommand cmd = new OleDbCommand(query, conn);
 cmd.Parameters.Add("@ID_Cliente", OleDbType.Integer).Value = id_clientes;
 txt_nome.Text = Convert.ToString(cmd.Parameters.Add("@nome", OleDbType.VarChar).Value);
 
 conn.Open();
 cmd.ExecuteReader();
 conn.Close();
 cmd = null;
}

A classe serve para guardar o valor do IDcliente e para o colocar na textboxID...

Isto porque quando fizer guardar ele vai ler o ID do cliente a essa textboxID.

Anteriormente experimentei criar um Datadapter e por ai fora mas não consegui... depois virei me para as experiências e deu neste código final.

Cumprimentos 😉

Link to comment
Share on other sites

  • Replies 40
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Cá estou eu de novo e penso que mais perto do que pretendo 😉

Tenho este código e estou com duas dificuldades...

Uma porque me está a dar um erro " Gclient.Form3.cclient()' é um 'método', que não é válido no contexto especificado

Não sei qual é o problema pois nunca me surgiu :S

Por outro lado estou com dificuldade em efectuar o SELECT.

O que pretendo é que o form ao ser iniciado verifique qual o valor da classe e que dependendo desse valor carregue os dados do cliente. Esse valor da classe é o ID do cliente na BD Access.

Aqui vai o código:

private void Form3_Load(object sender, EventArgs e)
{
 // Uso da classe Classeid
 txt_id.Text = Convert.ToString(Classeid.id);
 string id_clientes = txt_id.Text;
 
 strConn = "SELECT * FROM Clientes WHERE Nome";
 txt_nome.Text = cclientes.Rows.Count.ToString();
}

private void txt_id_TextChanged(object sender, EventArgs e)
{
}

public DataTable cclientes()
{
 OleDbConnection bdconn = new OleDbConnection (conn);
 OleDbCommand cmd = bdconn.CreateCommand();

 cmd.CommandText = strConn;
 OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);

 bdconn.Open();
 DataTable tabela = new DataTable();
 adapter.Fill(tabela);
 return tabela;
}

Foi preciso muitas horas de volta disto para chegar aqui e penso que dá para perceber onde estou com problemas... mas deixei em bold e com tamanho de letra maior.

strConn = "SELECT * FROM Clientes WHERE Nome";

eu aqui estou a fazer um select mas não vou filtrar o cliente em especifico mas sim todos os clientes...

Sei que ainda podia colocar Nome = a qualquer coisa, mas não ia dar no que pretendo na mesma.

Alguém me consegue dar uma ajuda?

Muito obrigado desde já 😉

Link to comment
Share on other sites

Isto está muito tremido...

Para usar o método cclientes é assim: cclientes(). Da forma como tens era se fosse uma variável ou propriedade da classe.

O teu código ficaria:

txt_nome.Text = cclientes().Rows.Count.ToString()

Agora o que tens para preencher a tabela não está nada bem, basicamente tens um Adapter o que está correcto, mas precisas afectar a propriedade SelectCommand desse adapter com a tua query. COmo não sabias o que fazer tens uma instância de um OleDbCommand e não está a fazer nada:

Correctamente terias algo do género:

OleDbDataAdapter adapter = new OleDbDataAdapter(
"select * from Clientes where ClientId = " + Convert.ToString(Classeid.id), bdconn);
adapter.Fill(tabela);

Usei Classid.id porque suponho que será aí que tens o id do cliente pelo qual queres filtrar a query. O nome ClientId do select altera para o que tiveres no teu Modelo de dados.

Link to comment
Share on other sites

Boas amigo, muito obrigado pela tua ajuda 😉

Então devo passar para propriedade correcto? pois assim dá me um erro que não pode converter o System.Data.DataTable em String.

Coloquei o código assim:

public DataTable cclientes()
{
 OleDbConnection bdconn = new OleDbConnection (conn);
 OleDbCommand cmd = bdconn.CreateCommand();
 
 cmd.CommandText = strConn;
 OleDbDataAdapter adapter = new OleDbDataAdapter(
     "select * from Clientes where ClientId = " + Convert.ToString(Classeid.id), bdconn);

 DataTable tabela = new DataTable();
 adapter.Fill(tabela);
 return tabela; 
}

Só não o testei porque tenho o erro do cclient...

Link to comment
Share on other sites

Não necessariamente...

Ora cclientes() é uma função, devolve uma DataTable portanto não podes afectar essa função a uma TextBox que está à espera de uma string.

Se queres mostrar na TextBox o número de Linhas do DataSet... Não sei bem qual o objectivo disso mas pronto, podes fazer:

txt_nome.Text = cclientes().Rows.Count.ToString();

Isto daria na caixa de texto txt_nome o número de linhas da DataTable, como eu acho que o que tu queres é o nome do cliente deveria ser mais assim:

txt_nome.Text = cclientes().Rows[0]["ClientName"].ToString();

Substitui ClientName pelo que tens no Modelo de Dados para o nome do cliente

Link to comment
Share on other sites

Olá de novo, muito obrigado por tudo 😉

Neste momento tenho este código:

private void Form3_Load(object sender, EventArgs e)
{
 // Uso da classe Classeid
 txt_id.Text = Convert.ToString(Classeid.id);
 strConn = "SELECT * FROM Clientes WHERE Nome";
 txt_nome.Text = cclientes().Rows[0]["Nome"].ToString(); 
}

private void txt_id_TextChanged(object sender, EventArgs e)
{
}

public DataTable cclientes()
{
 OleDbConnection bdconn = new OleDbConnection (conn);
 OleDbCommand cmd = bdconn.CreateCommand();
 
 cmd.CommandText = strConn;
 OleDbDataAdapter adapter = new OleDbDataAdapter(
     "select * from Clientes where ClientId = " + Convert.ToString(Classeid.id), bdconn);

 DataTable tabela = new DataTable();
 adapter.Fill(tabela);
 return tabela; 
}

Se percebi tudo o que me explicas-te penso que fosse isto a que deveria ter chegado... claro que ainda falta o resto do código para as outras textbox's...

Mas ao correr o programa não me aparece o nome do cliente no textbox...

Será que me falta alguma coisa?

Tenho estado, em conjunto com o que me vão explicando, a estudar o processo de criação deste projecto e também a seguir alguns tutoriais que me vão ajudando noutras partes que estou a adiantar.

Este projecto vai me servir de base para outro que irei fazer, bastante mais complexo, mas terei de terminar primeiro este 😛

Desde já obrigado por toda a ajuda 😉 Aos poucos estou a aprender muitas coisas novas 😉

Link to comment
Share on other sites

"Nome" é o nome do cliente na BD? O id está a chegar correctamente certo?

Só uma coisa mais, se vais fazer o mesmo para outras textboxes aconselho a chamar o método cclientes() apenas uma vez no Load do Form como tens, não chames o método por cada TextBox...

Tenta dar nomes mais coerentes às variáveis e aos teus métodos. Por exemplo cclientes() não me diz nada, ficaria melhor se fosse GetClientById() ou simplesmente GetClient().

E se é uma função apenas usada no Form3 pode ser privada, não precisa de ser pública...

Link to comment
Share on other sites

Boas, o "Nome" é o nome da coluna referente ao nome do cliente na tabela de clientes.

Sim o ID aparece 1... ou dependendo do que coloco...

Dá-me ideia que a conexão com a BD para ir buscar os dados não está a ser feita... mas não encontro erro nenhum.

Sim vou fazer isso, passar a privado, colocar nomes mais expecificos para melhor entender o código e vou chamar o metodo no Load 😉

Obrigado pelos conselhos... 😉

Link to comment
Share on other sites

Pois, se não tens nenhum erro em Runtime é porque está a ser preenchida DataTable, ou seja tens uma linha na posição 0 da tabela e existe uma coluna chamada "Nome", agora essa coluna é que parece não trazer valor. Não podes experimentar com uma outra coluna que saibas vir preenchida, ou então fazer debug e analisar o conteúdo da DataTable.

Link to comment
Share on other sites

Boas, já verifiquei e mesmo com outra coluna... como a morada ou email continua a não aparecer...

Também tentei criar uma aplicação simples para ver se podia ser algum problema com as declarações de metodos que fiz e mesmo nessa mantem se o problema.

Vou deixar o código completo, pode me estar a escapar qualquer coisa...

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;

namespace Gclient
{
 public partial class Form3 : Form
 {
   public Form3()
   {
     InitializeComponent();
   }

   public string strConn = "";
   public string conn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Clientes.accdb;Persist Security Info=False";
   Form1 fr1 = new Form1();

   private void btn_alterar_Click(object sender, EventArgs e)
   {
     OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Clientes.accdb;Persist Security Info=False");
     string query = " UPDATE Clientes SET [Nome] = @nome, [Telefone] = @telefone, [Telemóvel] = @telemovel, [Morada] = @morada, [Contribuinte] = @contribuinte, [Email] = @email, [Licença] = @licença, [Activação] = @activação WHERE ID = @ID ";
     OleDbCommand command = new OleDbCommand(query, conn);
     command.Parameters.Add("@ID", OleDbType.Integer).Value = fr1.clientid ;
     command.Parameters.Add("@Nome", OleDbType.VarChar).Value = txt_nome.Text;
     command.Parameters.Add("@telefone", OleDbType.Integer).Value = Int32.Parse(txt_telf.Text);
     command.Parameters.Add("@telemovel", OleDbType.Integer).Value = Int32.Parse(txt_tele.Text);
     command.Parameters.Add("@morada", OleDbType.VarChar).Value = txt_morada.Text;
     command.Parameters.Add("@contribuinte", OleDbType.Integer).Value = Int32.Parse(txt_cont.Text);
     command.Parameters.Add("@email", OleDbType.VarChar).Value = txt_email.Text;
     command.Parameters.Add("@licenca", OleDbType.VarChar).Value = txt_serie.Text;
     command.Parameters.Add("@activacao", OleDbType.VarChar).Value = txt_activacao.Text;

     conn.Open();
     int x = command.ExecuteNonQuery();
     if (x < 1)
     {
       MessageBox.Show("Erro ao Actualizar", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
     else
     {
       MessageBox.Show ("Actualizado com sucesso", "Actualização", MessageBoxButtons.OK,MessageBoxIcon.Information);
     }
 
     conn.Close();
     command = null;
   }

   private void Form3_Load(object sender, EventArgs e)
   {
     // Uso da classe Classeid
     txt_id.Text = Convert.ToString(Classeid.id);

     strConn = "SELECT * FROM Clientes WHERE Nome";
     txt_nome.Text = Getclient().Rows[0]["Nome"].ToString();
   }

   private void txt_id_TextChanged(object sender, EventArgs e)
   {
   }

   public DataTable Getclient()
   {
     OleDbConnection bdconn = new OleDbConnection (conn);
     OleDbCommand cmd = bdconn.CreateCommand();

     cmd.CommandText = strConn;
     OleDbDataAdapter adapter = new OleDbDataAdapter(
         "select * from Clientes where ClientId = " + Convert.ToString(Classeid.id), bdconn);

     DataTable tabela = new DataTable();
     adapter.Fill(tabela);
     return tabela;
   }
 }
}

Espero que me consigam ajudar, pois estou a ficar baralhado com tudo isto.

Tenho lido muito tutoriais e não encontro o problema...

Link to comment
Share on other sites

Coloca o breakpoint na linha onde afectas a textbox e corre a aplicação em modo debug.

Se não parar nessa linha quando fizeres o processo onde preenches as textboxes alguma coisa não está bem.

Se parar no breakpoint como deveria inspeciona os valores da DataRow. Podes selecionar Getclient().Rows[0]["ID"].ToString() e QuickWatch por exemplo

Link to comment
Share on other sites

inspeciona os valores da DataRow como te disse e verifica se está preenchida, quais as colunas que tens etc

Seleciona isto quando parar no breakpoint: Getclient().Rows[0]["ID"].ToString();

e faz QuickWatch no menu de contexto do VS. vai abrir um popup com o valor, para veres os valores da DataRow coloca na popup Getclient().Rows[0]

Link to comment
Share on other sites

Boas, más noticias, ontem baixei o visual studio express 2012 for windows desktop e infelizmente o projecto deixou de abrir... :S

já procurei em foruns e nao existe hipotese, culpa minha, que estava com uma versão RC 😞

Já comecei o projecto do zero, também aproveito para colocar tudo como deve ser e com calma, pois tinha algumas falhas que estava a deixar para resolver depois e assim aproveito e resolvo já.

Espero segunda feira já ter tudo a funcionar até ao passo deste tópico e depois então vou testar, pode ser até que tivesse alguma falha a versão que eu estava a usar :S

assim que tiver chegado ao ponto volto a postar o código caso o problema continue 😉

Muito obrigado e até já 😉

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.