D3POD Posted August 29, 2012 at 02:13 PM Report Share #473975 Posted August 29, 2012 at 02:13 PM 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 More sharing options...
D3POD Posted August 30, 2012 at 09:31 PM Author Report Share #474133 Posted August 30, 2012 at 09:31 PM 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 More sharing options...
rumbafum Posted August 31, 2012 at 08:03 AM Report Share #474157 Posted August 31, 2012 at 08:03 AM 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 More sharing options...
D3POD Posted August 31, 2012 at 11:38 AM Author Report Share #474172 Posted August 31, 2012 at 11:38 AM 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 More sharing options...
rumbafum Posted August 31, 2012 at 01:07 PM Report Share #474179 Posted August 31, 2012 at 01:07 PM 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 More sharing options...
D3POD Posted August 31, 2012 at 03:16 PM Author Report Share #474195 Posted August 31, 2012 at 03:16 PM 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 More sharing options...
rumbafum Posted August 31, 2012 at 11:18 PM Report Share #474234 Posted August 31, 2012 at 11:18 PM "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 More sharing options...
D3POD Posted September 1, 2012 at 12:45 PM Author Report Share #474250 Posted September 1, 2012 at 12:45 PM 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 More sharing options...
rumbafum Posted September 1, 2012 at 05:27 PM Report Share #474264 Posted September 1, 2012 at 05:27 PM 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 More sharing options...
D3POD Posted September 1, 2012 at 08:56 PM Author Report Share #474272 Posted September 1, 2012 at 08:56 PM 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 More sharing options...
D3POD Posted September 8, 2012 at 01:16 PM Author Report Share #474822 Posted September 8, 2012 at 01:16 PM Boas, ninguém me sabe consegues dar uma ajuda? Ainda não consegui sair da sepa torta 😞 Cumprimentos Link to comment Share on other sites More sharing options...
rumbafum Posted September 8, 2012 at 09:58 PM Report Share #474864 Posted September 8, 2012 at 09:58 PM Se substituires esta linha : Getclient().Rows[0]["Nome"].ToString() por Getclient().Rows[0]["ClientId"].ToString() Aparece o id do cliente correctamente? Link to comment Share on other sites More sharing options...
D3POD Posted September 9, 2012 at 04:47 PM Author Report Share #474893 Posted September 9, 2012 at 04:47 PM Boas coloquei assim? strConn = "SELECT * FROM Clientes WHERE ID"; txt_nome.Text = Getclient().Rows[0]["ID"].ToString(); E nada... na txt_nome não me apareceu nada... :S Se o código ID pela classe chega bem porque este não chega? Editado pois o código mudou e não consigo recuperar o que ca estava Link to comment Share on other sites More sharing options...
rumbafum Posted September 10, 2012 at 08:29 AM Report Share #474921 Posted September 10, 2012 at 08:29 AM Esse código está mesmo a ser chamado? Já colocaste um breakpoint na linha em questão para ver o que está a acontecer? Link to comment Share on other sites More sharing options...
D3POD Posted September 13, 2012 at 07:22 PM Author Report Share #475380 Posted September 13, 2012 at 07:22 PM Boas amigo efectuei o breakpoint... como posso ver agora onde pode estar o problema :S Link to comment Share on other sites More sharing options...
rumbafum Posted September 13, 2012 at 09:44 PM Report Share #475411 Posted September 13, 2012 at 09:44 PM 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 More sharing options...
D3POD Posted September 14, 2012 at 08:27 AM Author Report Share #475433 Posted September 14, 2012 at 08:27 AM Boas, então estava a fazer bem 😛 Quando faço o debug ele pára precisamente nesta linha: txt_nome.Text = Getclient().Rows[0]["ID"].ToString(); Portanto é certo que está aqui o erro correcto? Link to comment Share on other sites More sharing options...
rumbafum Posted September 14, 2012 at 08:33 AM Report Share #475434 Posted September 14, 2012 at 08:33 AM 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 More sharing options...
Rechousa Posted September 15, 2012 at 12:06 AM Report Share #475506 Posted September 15, 2012 at 12:06 AM @D3POD Viva! Por favor formata o código... Essa formatação não facilita a leitura e certamente dificultará a ajuda que necessitas 😉 Pedro Martins Sharing is Knowledge! http://www.linkedin.com/in/rechousa Link to comment Share on other sites More sharing options...
D3POD Posted September 15, 2012 at 10:05 PM Author Report Share #475574 Posted September 15, 2012 at 10:05 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now