Jump to content
Sign in to follow this  
principiante

Ajuda a identificar erro C#

Recommended Posts

principiante

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á

Share this post


Link to post
Share on other sites
f-22

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

Share this post


Link to post
Share on other sites
principiante

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;

            }

         

        }

Share this post


Link to post
Share on other sites
paulo_jcg

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

Share this post


Link to post
Share on other sites
principiante

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.

Share this post


Link to post
Share on other sites
principiante

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

Share this post


Link to post
Share on other sites
principiante

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

Share this post


Link to post
Share on other sites
cro

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

Share this post


Link to post
Share on other sites
principiante

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

Share this post


Link to post
Share on other sites
cro

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

Share this post


Link to post
Share on other sites
principiante

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.

Share this post


Link to post
Share on other sites
cro

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

Share this post


Link to post
Share on other sites
principiante

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

Share this post


Link to post
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
Sign in to follow this  

×
×
  • 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.