Jump to content
Sign in to follow this  
Nmar93

Referência do Objecto

Recommended Posts

Nmar93

Boas,

Eu estou a fazer uma pequena gestão de Base de Dados, e eu numa listView faço um duplo-clique sobre um indice qualquer(neste caso estou a fazer sobre jogos) e abre um form de edição do jogo. Posso mudar plataforma, categoria do jogo, etc...

Mas ao carregar aparece-me uma maldita mensagem de erro:

"A referência do objecto não foi definida como uma instância de um objecto"

Ao fazer um BreakPoint, o código passa-me para a excepção exactamente:

   Dim sql As New StringBuilder("Update Jogos Set Codigo=")
            sql.Append(j.Codigo).Append(",'")
            sql.Append("Plataforma='").Append(Geral.ProtegePlicas(j.Plataforma).Append("','")

'O BreakPoint ao passar pelo ProtegePlicas, passa logo para a Exception. 

            sql.Append("Categoria='").Append(Geral.ProtegePlicas(j.Categoria)).Append("','")
            sql.Append("NomeJogo='").Append(Geral.ProtegePlicas(j.NomeJogo)).Append("','")
            sql.Append("Fabricante='").Append(Geral.ProtegePlicas(j.EditoraJogo)).Append("','")
            sql.Append("PEGI='").Append(Geral.ProtegePlicas(j.PEGI)).Append("',")
            sql.Append("Preco=").Append(j.Preco).Append(",")
            sql.Append("CodigoPlataforma=").Append(j.CodigoPlataforma).Append(",")
            sql.Append("CodigoCategoria=").Append(j.CodigoCategoria).Append(",")
            sql.Append("CodigoPegi=").Append(j.CodigoPegi).Append(")")

O pior é que este erro já me apareceu várias vezes e consegui resolver, mas agora não estou a ver o que faça.

Eu enganei-me no tópico onde coloquei este post na 1ª vez. Pus no Visual Basic mesmo, não no .NET...

Se me pudessem ajudar agradecia imenso!...

Share this post


Link to post
Share on other sites
Caça

A variável Geral ou a variável J, no momento que as estás a chamar, tem o valor de Nothing.

Falta-te antes um Geral = New QualQuerCoisa, e o mesmo para o J


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Nmar93

E onde é que as devo pôr?

O Geral apenas serve para fazer um pequeno Replace nas plicas. Caso o utilizador puser 2 plicas, aquilo passa para 1. Portanto não será necessário fazer um New.

A minha função completa é assim:

 Public Shared Function EditarJogo(ByVal j As Jogo) As Boolean
        Dim res As Boolean = False
        Dim cn As SqlConnection = Nothing
        Dim cmd As SqlCommand = Nothing

        Try
            cn = New SqlConnection(_cs)
            cn.Open()

            Dim sql As New StringBuilder("Update Jogos Set Codigo=")
            sql.Append(j.Codigo).Append(",'")
            sql.Append("Plataforma='").Append(Geral.ProtegePlicas(j.Plataforma)).Append("','")
            sql.Append("Categoria='").Append(Geral.ProtegePlicas(j.Categoria)).Append("','")
            sql.Append("NomeJogo='").Append(Geral.ProtegePlicas(j.NomeJogo)).Append("','")
            sql.Append("Fabricante='").Append(Geral.ProtegePlicas(j.EditoraJogo)).Append("','")
            sql.Append("PEGI='").Append(Geral.ProtegePlicas(j.PEGI)).Append("',")
            sql.Append("Preco=").Append(j.Preco).Append(",")
            sql.Append("CodigoPlataforma=").Append(j.CodigoPlataforma).Append(",")
            sql.Append("CodigoCategoria=").Append(j.CodigoCategoria).Append(",")
            sql.Append("CodigoPegi=").Append(j.CodigoPegi).Append(")")

            cmd = New SqlCommand(sql.ToString, cn)
            cmd.Connection = cn
            cmd.CommandText = sql.ToString
            cmd.ExecuteNonQuery()
            res = True

        Catch ex As Exception
            MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Finally
            If Not cn Is Nothing Then
                cn.Close()
            End If
        End Try
        Return res
    End Function

Share this post


Link to post
Share on other sites
Caça

Presumo que a estejas a passar a variável J por parâmetro com um valor válido, por isso o erro deve estar na variável Geral.

Onde e como é que a estás a declarar?


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Nmar93

O meu código 'tá é uma valente confusão.

Depois de teres falado do geral, decidi tirar e passou para este erro:

erronx.jpg

A Query sem ter aqueles parametros fica (o que pus de acordo com a imagem): {Update Jogos Set Codigo=43,'Plataforma='','Categoria='','NomeJogo='Formula1','Fabricante='CodeMasters','PEGI='',

Preco=55,CodigoPlataforma=1,CodigoCategoria=2,CodigoPegi=2)}

O que eu reparei foi ao fazer o BreakPoint sobre os objectos que estão em ComboBoxes, se encontram vazios, mas os seus respectivos Códigos (ou ID's) não.

Ora, ponho Plataforma : PlayStation 3 e o J.Plataforma diz Nothing enquanto que o J.CodigoPlataforma diz que é 1. E isso está correcto. O 1 equivale à Ps3, 2 à Xbox e 3 a PS3/Xbox/PC. Tambem é o mesmo com a Categoria e PEGI. Ficam sem nome, mas o código tambem está certo.

Agora não sei é o que mudar... :S

Share this post


Link to post
Share on other sites
Caça

Estás a fazer confusão nas plicas,

Troca

sql.Append(j.Codigo).Append(",'")

por

sql.Append(j.Codigo).Append(", ")

em todos


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Nmar93

EDIT!

Como já esperava, a mensagem que agora me apresenta (depois de me teres dito para tirar a plica) diz:

Incorrect Syntax near 'Categoria=','

Como já esperava, a Categoria está vazia. Poderá ser por causa do problema apresentado em baixo...

Acho que o erro pode ser a maneira como preenchi as ComboBoxes:

     Dim arrPlataforma As ArrayList = DataConn.GetPlataforma()
            For i As Integer = 0 To arrPlataforma.Count - 1
                Dim P As Plataforma
                P = CType(arrPlataforma(i), Plataforma)
                cmbPlataforma.Items.Add(P)
            Next
            cmbPlataforma.Text = Objecto.Plataforma

            Dim arrCategoria As ArrayList = DataConn.GetCategoria()
            For i As Integer = 0 To arrCategoria.Count - 1
                Dim C As Categoria
                C = CType(arrCategoria(i), Categoria)
                cmbCategoria.Items.Add(C)
            Next
            cmbCategoria.Text = Objecto.Categoria

            Dim arrPegi As ArrayList = DataConn.GetPegi()
            For i As Integer = 0 To arrPegi.Count - 1
                Dim P As Pegi
                P = CType(arrPegi(i), Pegi)
                cmbPegi.Items.Add(P)
            Next
            cmbPegi.Text = Objecto.PEGI

O GetCategoria, GetPlataforma, GetPegi são funções iguaizinhas, apenas vou buscar à Base de Dados o seu código e nome à sua tabela correspondente.

Peço desculpa por estas dúvidas... mas não consigo ficar descansado sem acabar isto...

Share this post


Link to post
Share on other sites
Caça

Ou não, mostra como está agora o código da função EditarJogo


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Nmar93

Cá está:

(Eu sou muito azelha e cego com as plicas)

   Public Shared Function EditarJogo(ByVal j As Jogo) As Boolean
        Dim res As Boolean = False
        Dim cn As SqlConnection = Nothing
        Dim cmd As SqlCommand = Nothing

        Try
            cn = New SqlConnection(_cs)
            cn.Open()

            Dim sql As New StringBuilder("Update Jogos Set Codigo=")
            sql.Append(j.Codigo).Append(",")
            sql.Append("Plataforma='").Append(j.Plataforma).Append("','")
            sql.Append("Categoria='").Append(j.Categoria).Append("','")
            sql.Append("NomeJogo='").Append(j.NomeJogo).Append("','")
            sql.Append("Fabricante='").Append(j.EditoraJogo).Append("','")
            sql.Append("PEGI='").Append(j.PEGI).Append("',")
            sql.Append("Preco=").Append(j.Preco).Append(",")
            sql.Append("CodigoPlataforma=").Append(j.CodigoPlataforma).Append(",")
            sql.Append("CodigoCategoria=").Append(j.CodigoCategoria).Append(",")
            sql.Append("CodigoPegi=").Append(j.CodigoPegi).Append(")")

            cmd = New SqlCommand(sql.ToString, cn)
            cmd.Connection = cn
            cmd.CommandText = sql.ToString
            cmd.ExecuteNonQuery()
            res = True

        Catch ex As Exception
            MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Finally
            If Not cn Is Nothing Then
                cn.Close()
            End If
        End Try
        Return res
    End Function

Share this post


Link to post
Share on other sites
Caça

E estas não se alteram?

            sql.Append("Plataforma='").Append(j.Plataforma).Append("','")
            sql.Append("Categoria='").Append(j.Categoria).Append("','")
            sql.Append("NomeJogo='").Append(j.NomeJogo).Append("','")
            sql.Append("Fabricante='").Append(j.EditoraJogo).Append("','")

coloca assim

            sql.Append("Plataforma='").Append(j.Plataforma).Append("', ")
            sql.Append("Categoria='").Append(j.Categoria).Append("', ")
            sql.Append("NomeJogo='").Append(j.NomeJogo).Append("', ")
            sql.Append("Fabricante='").Append(j.EditoraJogo).Append("', ")


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Nmar93

Lol agora só me aparece um

Incorrect Syntax near ')'.

Eu desenrasco-me agora, já fizeste muito em ajudar-me com estas "coisinhas".

Eu em queries... esquece... xD

Brigado mais uma vez :D

Share this post


Link to post
Share on other sites
Caça

Troca

sql.Append("CodigoPegi=").Append(j.CodigoPegi).Append(")")

por

sql.Append("CodigoPegi=").Append(j.CodigoPegi)

Tens é de ter em atenção que não tens nenhum filtro na query(WHERE), por isso vai-te actualizar toda a tabela, é isso que queres?


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Nmar93

Correctissímo.

Mas como já tinha dito anteriormente, os objectos onde vão os nomes dos SelectedItems das ComboBoxes, encontram-se vazios, mas os seus respectivos códigos (ou ID's) não. Esses estão bem. Os nomes são o problema. A query ficou certa, já tinha feito dessa maneira mas diz que os nomes sao inválidos pois estão vazios (embora não estejam). Deve ter sido da mal forma como as preenchi... não sei...

Eu até mandei o código no post anterior pois estava em dúvida, mas agora tenho a certeza que é disso.

Thanks :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.