principiante Posted November 2, 2009 at 12:10 AM Report Share #294339 Posted November 2, 2009 at 12:10 AM Ola fez um pequeno programa em c#.Onde tenho uma datagredview para me mostrar os dados da BD access, insiro, altero e procura funciona tudo direitinho. quando clico numa linha da datagredview abre-me outro form para eu poder alterar os dados na BD até ai funciona bem, o problema é quando eu faço uma procura ele faz a procura direitinho mas quando eu clico na linha para abrir o form e alterar os dados dá-me o seguinte erro ( Object reference not set to an instance of an object. ) este erro só aparece quando faço a procura. Alguém me pode dar uma ajuda com este erro. Obrigado desde já Link to comment Share on other sites More sharing options...
Guest f-22 Posted November 2, 2009 at 11:33 PM Report Share #294429 Posted November 2, 2009 at 11:33 PM Se poderes exibir o código era mais fácil. Já viste se estás a afectar a datasource correctamente quando fazes uma pesquisa? Link to comment Share on other sites More sharing options...
principiante Posted November 3, 2009 at 01:20 PM Author Report Share #294476 Posted November 3, 2009 at 01:20 PM O meu código é este. //**************************************************************** //verifica se o campo de ID da etiqueta esta a ZERO //************************************************************ if (textBoxPROCURA.Text.Length == 0) { txtinfcat = ("Preenxa o Codigo do Produto antes de fazer a procura ."); FormINFADICIONAR Falt = new FormINFADICIONAR();// ABRE O FormALTERAÇÃO Falt.txtinfcat = txtinfcat; Falt.ShowDialog(); return; } else { if (checkb_ID.Checked) { //************************************************************ //FAZ A PROCURA PELO O ID_DA ETIQUETA // //CRIA A STRING DE CONECÇAO (sqlStrig) criterio = textBoxPROCURA.Text.ToString(); string queryString = "SELECT MENSSAGEM,PRODUTO,ID_ETIQUETA,COD_PRODUTO,PREÇO_A,PREÇO_N,DATA FROM ETIQUETAS where ID_ETIQUETA like '%" + criterio + "%'"; //VERIFICA SE A sqlString não é nula ou vazia if (queryString != null && queryString != "") carregaGrid(queryString); Conn.Close(); } else { //************************************************************ //FAZ A PROCURA PELO COD CLIENTE //*********************************************************** criterio = textBoxPROCURA.Text.ToString(); //CRIA A STRING DE CONECÇAO (sqlStrig) string queryString = "SELECT MENSSAGEM,PRODUTO,ID_ETIQUETA,COD_PRODUTO,PREÇO_A,PREÇO_N,DATA FROM ETIQUETAS where COD_PRODUTO like '%" + criterio + "%'"; //VERIFICA SE A sqlString não é nula ou vazia if (queryString != null && queryString != "") carregaGrid(queryString); Conn.Close(); } } } private void carregaGrid(string criterioSQL) { //define o dataset ds = new DataSet(); //cria uma conexão usando a string de conexão Conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\TESTE BD\\" + bd); try { //abre a conexao Conn.Open(); if (Conn.State == ConnectionState.Open) { da = new OleDbDataAdapter(criterioSQL, Conn); da.Fill(ds, "Tabela"); //exibe os dados no datagridview dataGridView1.DataSource = ds; dataGridView1.DataMember = "Tabela"; } } catch (System.Exception e) { txtinfcat = (e.Message.ToString()); FormINFADICIONAR Falt = new FormINFADICIONAR();// ABRE O FormINFADICIONAR Falt.txtinfcat = txtinfcat; Falt.ShowDialog(); return; } } Link to comment Share on other sites More sharing options...
paulo_jcg Posted November 3, 2009 at 05:34 PM Report Share #294529 Posted November 3, 2009 at 05:34 PM Esse erro aparece quando tentas aceder a uma propriedade/método de um objecto que ainda não foi criado. O ideal é criares uns breakpoints e fazeres debug linha-a-linha que facilmente descobres o bicho 👍 Fica bem Link to comment Share on other sites More sharing options...
principiante Posted November 3, 2009 at 06:52 PM Author Report Share #294549 Posted November 3, 2009 at 06:52 PM O erro aparece nesta linha. ID_LINHA = dataGridView1[0, linhaAtual].Value.ToString(); Mas porque é que só me da este erro nesta linha quando faço a procura.Se actualizar os dados não dá este erro e a rutina é a mesma . ele depois de fazer uma procura eu clico na linha e despara um evento, esse evento é o mesmo tanto quando quero actualizar a bd como quando faço a procura.só que quando faço a procura ele não me consegue recuperar o (value) diz que esta nula. Link to comment Share on other sites More sharing options...
Saco Posted November 4, 2009 at 12:00 AM Report Share #294623 Posted November 4, 2009 at 12:00 AM Essa linha não aparece no código que mostraste... assim é um bocado difícil... Link to comment Share on other sites More sharing options...
principiante Posted November 4, 2009 at 12:47 PM Author Report Share #294674 Posted November 4, 2009 at 12:47 PM Essa linha aparece aqui no evento da datagredview,que é para me ir buscar os dados da datagredview e coloca-los nas respetivas textbox do form3.Mas o engraçado é que só me da o erro quando faço a procura,e depois clico na linha da datagredview para alterar os dados e ai dá esse erro. #region Evento Click De Linha Datagredview... private void dataGridView1_CellContentDoubleClick_1(object sender, DataGridViewCellEventArgs e) { try { //obtem o código do cliente a partir da linha selecionada no datagridview linhaAtual = int.Parse(e.RowIndex.ToString()); } catch (Exception ex) { txtinfcat = ("Erro..." + ex.Message); FormINFADICIONAR Falt = new FormINFADICIONAR();// ABRE O FormINFADICIONA Falt.txtinfcat = txtinfcat; Falt.ShowDialog(); return; } if (linhaAtual >= 0) { //obtem dados do datagridview e atribui as variáveis definidas no formulario f3 obtemDadosGrid(); FormALTERAÇÃO f3 = new FormALTERAÇÃO();// ABRE O FormALTERAÇÃO // f3.ID_LINHA = ID_LINHA; f3.MENSSAGEM = MENSSAGEM; f3.PREÇO_N = PREÇO_N; f3.COD_PRODUTO = COD_PRODUTO; f3.PREÇO = PREÇO; f3.PRODUTO = PRODUTO; f3.ETIQUETA = ETIQUETA; //ABRE O FORM ALTERAÇAO f3.ShowDialog(); //atualiza o grid dataGridView1.Update(); iniciaAcesso(); } } private void obtemDadosGrid() { //****************************************************************************** //a primeira coluna é a coluna 0 a segunda é a coluna 1 , e , assim por diante //******************************************************************************* // ID_LINHA = dataGridView1[0, linhaAtual].Value.ToString(); MENSSAGEM = dataGridView1[1, linhaAtual].Value.ToString(); PRODUTO = dataGridView1[2, linhaAtual].Value.ToString(); ETIQUETA = dataGridView1[3, linhaAtual].Value.ToString(); COD_PRODUTO = dataGridView1[4, linhaAtual].Value.ToString(); PREÇO = dataGridView1[5, linhaAtual].Value.ToString(); PREÇO_N = dataGridView1[6, linhaAtual].Value.ToString(); } #endregion Link to comment Share on other sites More sharing options...
principiante Posted November 9, 2009 at 12:50 AM Author Report Share #295211 Posted November 9, 2009 at 12:50 AM Já esta resolvido obrigado a todos.o problema estava aqui. Errado. string queryString = "SELECT MENSSAGEM,PRODUTO,ID_ETIQUETA,COD_PRODUTO,PREÇO_A,PREÇO_N,DATA FROM ETIQUETAS where COD_PRODUTO like '%" + criterio + "%'"; Correto. string queryString = "SELECT * FROM ETIQUETAS where COD_PRODUTO like '%" + criterio + "%'"; Link to comment Share on other sites More sharing options...
cro Posted November 9, 2009 at 04:47 PM Report Share #295273 Posted November 9, 2009 at 04:47 PM Deve usar procedimentos e não passar a string SQL para a BD, assim facilitas o uso de SQL Injection 😉 Link to comment Share on other sites More sharing options...
principiante Posted November 9, 2009 at 07:24 PM Author Report Share #295311 Posted November 9, 2009 at 07:24 PM Pois mas eu ainda sou novo no C# ainda estou a aprender.Mas obrigado pela dica.Ainda não sei como fazer isso. Link to comment Share on other sites More sharing options...
cro Posted November 11, 2009 at 10:14 AM Report Share #295543 Posted November 11, 2009 at 10:14 AM Bem eu faço mais ou menos isto: public int gravarUtilizador(string nome, string login, string email, DateTime datanasc, string sexo, string password) { int status = 0; SqlConnection objConn = Conexao(); objConn.Open(); // conn = new SqlConnection(abd.strconn); // conn.Open(); SqlCommand cmd; try { //Gerar Passwor~d string passwordString = Utilities.CreatePassword(8); //MD5 MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider(); byte[] hashedBytes; UTF8Encoding encoder = new UTF8Encoding(); hashedBytes = md5Hasher.ComputeHash(encoder.GetBytes(passwordString)); cmd = new SqlCommand("o004_sp_gravarUtilizador", objConn); cmd.Parameters.Add(new SqlParameter("@nome", nome)); cmd.Parameters.Add(new SqlParameter("@login", login)); cmd.Parameters.Add(new SqlParameter("@pass", hashedBytes)); cmd.Parameters.Add(new SqlParameter("@email", email)); cmd.Parameters.Add(new SqlParameter("@datanasc", datanasc)); cmd.Parameters.Add(new SqlParameter("@sexo", sexo)); cmd.CommandType = CommandType.StoredProcedure; int a = cmd.ExecuteNonQuery(); objConn.Close(); } catch { status = -1; objConn.Close(); } return status; } E do outro lado crio um procedimento que recebe (porra isto nao funciona mto bem em ie7, a caixa de texto...) create proc XXX @var1 int @var2 varchar(20) as begin select 1 end Link to comment Share on other sites More sharing options...
principiante Posted November 11, 2009 at 06:51 PM Author Report Share #295637 Posted November 11, 2009 at 06:51 PM Ok vou tentar fazer isso obrigado,já agora podias-me dar uma ajuda ,eu queria meter no meu soft um combobox para quando adiciono um novo produto a BD adicionar os produtos por categorias, e quando fizesse a procura antes selecionava uma categoria na combobox ,assim podia fazer a procura por categorias.mas não sei como fazer isso podias-me dar uma ideia como se implementa isso. Link to comment Share on other sites More sharing options...
cro Posted November 12, 2009 at 03:24 PM Report Share #295832 Posted November 12, 2009 at 03:24 PM Se cada produto tem uma categoria, passas a categoria para o procedimento, e no procedimento fazes algo do tipo: select * from Produtos where CategoriaId=@VarRecebida isto vai retornar um datasource que pode ser uma datatable e depois é so fazer o databind dessa datatable à combobox.datasource... Penso que respondi à tua pergunta, mas nao tenho a certeza 😄 Link to comment Share on other sites More sharing options...
principiante Posted November 12, 2009 at 07:03 PM Author Report Share #295879 Posted November 12, 2009 at 07:03 PM Desculpa não entendi ,Eu estava a pensar em adicionar uma nova tabela para cada categoria ,assim quando seleccionasse essa categoria bastava percorrer essa tabela.Será feito assim? 😄 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