Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

aesp

[VB.NET] Ler chave de registo

Mensagens Recomendadas

aesp

Boa noite,

Tenho o seguinte problema:

Estou a tentar ler uma chave uma chave do registo que poussui informações sobre as instancias do SQL Server. O processo que estou a utilizar é igual ao que uso para ler a chave do .NET Framework mas não sei porque ele é como se ignorasse a chave do SQL Server.

Deixo aqui o bloco de código:

        Dim regPath As String = Nothing
        Dim subKey As Microsoft.Win32.RegistryKey = Nothing
        Dim InstalledInstances As String = Nothing

        Try
            regPath = "SOFTWARE\Microsoft\Microsoft SQL Server"
            subKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(regPath)
            InstalledInstances = subKey.GetValue("InstalledInstances")
        Catch ex As Exception
            MessageBox.Show("Not installed")
        End Try

        If InstalledInstances <> Nothing Then
            MessageBox.Show("Installed")
        Else
            MessageBox.Show("Not installed")
        End If

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Caça

A chave "InstalledInstances" devolve um array de strings e tu estás a tentar colocar a informação numa string, sendo assim troca o teu código por este

        Dim regPath As String = Nothing
        Dim subKey As Microsoft.Win32.RegistryKey = Nothing
        Dim InstalledInstances() As String = Nothing

        Try
            regPath = "SOFTWARE\Microsoft\Microsoft SQL Server"
            subKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(regPath)
            InstalledInstances = subKey.GetValue("InstalledInstances")
        Catch ex As Exception
            MessageBox.Show("Not installed")
        End Try

        If InstalledInstances.Length > 0 Then
            MessageBox.Show("Installed")
        Else
            MessageBox.Show("Not installed")
        End If


Pedro Martins

Não respondo a duvidas por PM

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
aesp

Ele está a devolver o valor de Nothing ao array das InstalledInstances,e não deveria uma vez que no TryCath ele ganha valores.  :dontgetit:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock
Dim installed As Array = subKey.GetValue("InstalledInstances")
        For i As Integer = 0 To  installed.Length - 1
            MsgBox(installed(i))
        Next

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
aesp

Dim installed As Array = subKey.GetValue("InstalledInstances")
        For i As Integer = 0 To  installed.Length - 1
            MsgBox(installed(i))
        Next

Experimentei o que colocaste dá uma Exception.

Em relação a tua questão Caça, eu estou a fazer o Step Debug e quando chega à altura de ele mostrar a message box a variável está com o valor 'Nothing'.

Obrigado.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Caça

Se ela foi preenchida no momento em que leste a chave e quando vais mostrar o seu valor é igual a nothing, tens de a estar a limpar em qualquer sitio... Mostra o teu código.


Pedro Martins

Não respondo a duvidas por PM

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
aesp
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim regPath As String = Nothing
        Dim subKey As Microsoft.Win32.RegistryKey = Nothing
        Dim InstalledInstances() As String = Nothing

        Try
            regPath = "SOFTWARE\Microsoft\Microsoft SQL Server"
            subKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(regPath)
            InstalledInstances = subKey.GetValue("InstalledInstances")

            'Código do Bioshock (Gera uma exception)
            Dim installed As Array = subKey.GetValue("InstalledInstances")
            For i As Integer = 0 To installed.Length - 1
                MsgBox(installed(i))
            Next
        Catch ex As Exception
            MessageBox.Show("Not installed")
        End Try

        If InstalledInstances.Length > 0 Then
            MessageBox.Show("Not installed")
        Else
            MessageBox.Show("Installed")
        End If
    End Sub

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Caça

Não estou a ver problema nenhum no código, que exception é que o código do @bioshock está a gerar? Acho que não está a gerar nenhuma...


Pedro Martins

Não respondo a duvidas por PM

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
aesp

Com o código do Bioshock ele entra do Catch, se o retirar ele vai às MessageBox's e dá outra Exception, dizendo NullReferenceException.

Catch Exception:

ejcwh.png

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
aesp

Em que linha é que o erro deu?

Aqui > If InstalledInstances.Length > 0 Then
            MessageBox.Show("Not installed")
        Else
            MessageBox.Show("Installed")
        End If

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Tira-me esse Try Catch() daí. Não precisas dele porque não estás a chamar a mensagem que ele retorna. Para isso tens o código em baixo (que também tens de alterar).

Código completo:

 

Try
            Dim regPath As String = Nothing
            Dim subKey As Microsoft.Win32.RegistryKey = Nothing
            regPath = "SOFTWARE\Microsoft\Microsoft SQL Server"
            subKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(regPath)
            Dim installed As Array = subKey.GetValue("InstalledInstances")
            If (installed.Length = 0) Then
                MessageBox.Show("Erro...")
            Else
                For i As Integer = 0 To installed.Length - 1
                    MsgBox(installed(i))
                Next
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

E  claro que dá erro aí..em vez de InstalledInstances tens de ter apenas Installed..

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Caça

Aqui > If InstalledInstances.Length > 0 Then
            MessageBox.Show("Not installed")
        Else
            MessageBox.Show("Installed")
        End If

Mas esse código nem esta dentro do try... E já agora tens isso trocado, coloca antes = 0 em vez de > 0.

Que erro é que está a dar ai?

Dentro do Try as tuas três variáveis ficam com valor?


Pedro Martins

Não respondo a duvidas por PM

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
aesp

Tira-me esse Try Catch() daí. Não precisas dele porque não estás a chamar a mensagem que ele retorna. Para isso tens o código em baixo (que também tens de alterar).

Código completo:

 

Try
            Dim regPath As String = Nothing
            Dim subKey As Microsoft.Win32.RegistryKey = Nothing
            regPath = "SOFTWARE\Microsoft\Microsoft SQL Server"
            subKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(regPath)
            Dim installed As Array = subKey.GetValue("InstalledInstances")
            If (installed.Length = 0) Then
                MessageBox.Show("Erro...")
            Else
                For i As Integer = 0 To installed.Length - 1
                    MsgBox(installed(i))
                Next
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

E  claro que dá erro aí..em vez de InstalledInstances tens de ter apenas Installed..

Ainda assim persiste o mesmo erro.  🤔

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Não sabias dizer que estás com o Option Strict On?

Dim installed As Array = CType(subKey.GetValue("InstalledInstances"), Array)
For Each obj As Object In installed
                    MsgBox(obj)
                Next 

O resto mantém-se.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Não se pode manter. Mostra o código. É só copiares e colocares aqui com o GeSHi adequado. Não precisas de printscreens.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
aesp

Não se pode manter. Mostra o código. É só copiares e colocares aqui com o GeSHi adequado. Não precisas de printscreens.

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Try
            Dim regPath As String = Nothing
            Dim subKey As Microsoft.Win32.RegistryKey = Nothing

            regPath = "SOFTWARE\Microsoft\Microsoft SQL Server"
            subKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(regPath)
            Dim installed As Array = CType(subKey.GetValue("InstalledInstances"), Array)

            If (installed.Length = 0) Then
                MessageBox.Show("Erro...")
            Else
                For Each obj As Object In installed
                    MsgBox(obj)
                Next
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
End Sub

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Ele dá-te erro no ciclo? É quase impossível. Porque se ele não tivesse valor nenhum dava-te a mensagem:

MessageBox.Show("Erro...")

Como tem devia de apresentar os valores.

Pá..podes sempre substituir:

If (installed.Length = 0) Then

por:

If isNothing(installed) Then

Já verificaste se tens o que procuras no editor de registos?

Acabei de testar noutro PC e funcionou.. ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Caça

O problema dele deve ser a falta da chave, tenta assim

        Dim regPath As String = Nothing
        Dim subKey As Microsoft.Win32.RegistryKey = Nothing
        Dim InstalledInstances() As String = Nothing

        Try
            regPath = "SOFTWARE\Microsoft\Microsoft SQL Server"
            subKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(regPath)
            InstalledInstances = subKey.GetValue("InstalledInstances")
            If InstalledInstances Is Nothing Then
                MessageBox.Show("Not installed")
            Else
                MessageBox.Show("Installed")
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try


Pedro Martins

Não respondo a duvidas por PM

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.