2016-01-25 4 views
0

Я получаю это 3 предупреждения. Я хотел знать, как это исправить, спасибо заранее!Предупреждение Visual Basic

Предупреждения:

Предупреждение 1 Variable 'Id_Utilizador' используется, прежде чем оно было присвоено значение. Исключительное исключение ссылки может возникнуть во время выполнения. C: \ Users \ tiago \ Desktop \ Portaria \ Portaria_Programa \ Portaria_Programa \ frmAdmin_NewEdit.vb 332 37 Portaria_Programa

Предупреждение 2 Переменная «Id_Modulo» используется до того, как ей присвоено значение. Исключительное исключение ссылки может возникнуть во время выполнения. C: \ Users \ tiago \ Desktop \ Portaria \ Portaria_Programa \ Portaria_Programa \ frmAdmin_NewEdit.vb 332 60 Portaria_Programa

Предупреждение 3 Переменная 'DadosSai' используется до того, как ей присвоено значение. Исключительное исключение ссылки может возникнуть во время выполнения. C: \ Users \ Тьяго \ Desktop \ Портариа \ Portaria_Programa \ Portaria_Programa \ frmRel_EntradasSaidas.vb 222 37 Portaria_Programa

Код:

Private Sub NovoAcesso() 

    Dim Id_Utilizador 
    Dim Id_Modulo 

    Dim Count 

    If (cmbUtilizadores.Text <> "") Then 

     If (cmbModulos.Text <> "") Then 

      Cn.Open(cStringCon) 
      Rs.Open("Select count(id_utilizador), id_utilizador from acessos_utilizadores where nome_utilizador like '" & cmbUtilizadores.Text & "'", Cn) 

      Count = Rs.GetRows 

      Rs.Close() 

      If (Count(0, 0) > 0) Then 

       Id_Utilizador = Count(1, 0) 

       Rs.Open("Select count(id_modulo), id_modulo from acessos_modulos where nome_modulo like '" & cmbModulos.Text & "'", Cn) 

       Count = Rs.GetRows 

       Rs.Close() 

       If (Count(0, 0) > 0) Then 

        Id_Modulo = Count(1, 0) 

        Rs.Open("Select count(id_acesso) from acessos_acessos where id_utilizador = " & Id_Utilizador & "", Cn) 

        Count = Rs.GetRows 

        Rs.Close() 

        If (Count(0, 0) > 0) Then 

         Msg = "O utilizador seleccionado já dispõe de um acesso." 

        End If 

       Else 

        Msg = "Seleccione um módulo da lista." 

       End If 

      Else 

       Msg = "Seleccione um utilizador da lista." 

      End If 

      Cn.Close() 

     Else 

      Msg = "Seleccione um módulo da lista." 

     End If 

    Else 

     Msg = "Seleccione um utilizador da lista." 

    End If 

    If (Msg = "") Then 

     Cn.Open(cStringCon) 

     Cn.Execute("Insert into acessos_acessos(id_utilizador,id_modulo) " & _ 
        "values (" & Id_Utilizador & ", " & Id_Modulo & ")") 

     Cn.Close() 

     ActGrid = 1 

    End If 

    Count = Nothing 

End Sub 
+2

Включить опцию Strict – Plutonix

+1

Вы действительно должны определить, какими будут ваши переменные. Как бы то ни было, компилятор считает, что вы объявляете их как объекты, которые необходимо создать. Если это не так, то, используя их до этого, вы, вероятно, получите исключение с нулевой ссылкой, а компилятор достаточно умен, чтобы определить это. Так. Как говорит @Plutonix - включите опцию strict, и она будет выделять ошибки в вашем коде, который вы пропустили. Слушайте Плутоникс - он знает много о программировании. –

ответ

1

Значения Id_Utilizador и Id_Modulo не может иметь значение при их использовании. (Значение DadosSai не в этом коде, хотя это звучит, как он несет тот же риск.)

Это потому, что вы не всегда назначая для них значения. Для иллюстрации рассмотрим эту упрощенную версию:

Dim SomeValue 
If SomethingElse = True Then 
    SomeValue = SomeOtherValue 
End If 
UseTheValue(SomeValue) 

Что бы это сделать, если код SomethingElse не True? Ничто не было бы назначено переменной, и это могло бы легко сломать функцию, которая ее использует.

Либо инициализируйте свои переменные значениями по умолчанию, либо убедитесь, что все логические пути присваивают им значения до их использования.

+0

Спасибо за помощь, im kinda new to visual basic;) –

+0

@TiagoTurella: Рад, что я мог помочь. По мере того как вы получаете больше практики, вы, скорее всего, найдете способы реорганизовать свой код немного, чтобы такие вещи легче обнаружить. Ваши вложенные блоки 'If', вероятно, могут быть инвертированы в ряд предварительных условий, которые могут быть более легкими для чтения. Со временем вы можете воспользоваться некоторыми стандартными шаблонами рефакторинга: http://refactoring.com/catalog/ Кроме того, в качестве побочного примечания найдите что-то под названием «SQL-инъекция» и использование параметризованных запросов, чтобы избежать этого. В настоящее время ваш код широко открыт для этой уязвимости :) – David