• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

principiante

Ajuda a identificar erro C#

14 mensagens neste tópico

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á

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se poderes exibir o código era mais fácil. Já viste se estás a afectar a datasource correctamente quando fazes uma pesquisa?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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;

            }

         

        }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 

:thumbsup: Fica bem

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Essa linha não aparece no código que mostraste... assim é um bocado difícil...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 + "%'";

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Deve usar procedimentos e não passar a string SQL para a BD, assim facilitas o uso de SQL Injection ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois mas eu ainda sou novo no C# ainda estou a aprender.Mas obrigado pela dica.Ainda não sei como fazer isso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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? :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora