Ошибка, которую нельзя исправить? - PullRequest
0 голосов
/ 05 сентября 2011

Я получаю сообщение об ошибке в моем VB.NET приложении, которое подключается к моей базе данных SQL. Подключается нормально, но по какой-то причине я не могу исправить эту ошибку. Когда я пытаюсь это исправить, он перемещается из одной части моего сценария в другую часть моего сценария (обе из которых работали вчера). Детали ошибки:

Error

К сожалению, мне сложно описать, как я получил этот результат, потому что он произошел во многих частях моего кода, и единственное, что объединяет эти части, это их взаимодействие со Listbox1.

Первая часть кода, чтобы получить эту ошибку была:

Dim sqlpage As MySqlCommand = New MySqlCommand("SELECT * FROM [" & frmMain.ListBox1.SelectedItem.value & "]", con)

Тогда я получил точно такую ​​же ошибку для:

Private Sub ListBox1_SelectedValueChanged( _
    ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles ListBox1.SelectedValueChanged

    Try
        Form1.Label1.Text = ListBox1.SelectedItem
        Form1.Show()
    Catch myerror As MySqlException
        MessageBox.Show("Error Setting Up Project Page: " & myerror.Message)
    End Try
End Sub

Более конкретно:

Form1.Label1.Text = ListBox1.SelectedItem

А потом я получил это еще несколько раз, но я думаю, что приведенных выше примеров будет достаточно.

Поскольку в приведенных выше примерах «С блочными переменными» нет, единственной другой опцией является то, что она связана с объектом. Я пробовал разные методы определения и переопределения переменных объекта, связанных с ошибкой. Тем не менее, результаты совпадают.

В ответ на ответ Juxtaposition моя первоначальная проблема была решена, однако две новые проблемы возникли именно потому, что я включил Option Strict.

  • Первое:

Ошибка 1: опция «Строгое вкл.» Запрещает позднюю привязку.

Код, о котором идет речь:

Try
    ' Retrieving the projects list.
    con.Open()
    DataAdapter2.SelectCommand = sqlprojects
    DataAdapter2.Fill(ds2, "projects")
    ListBox1.Items.Clear()

    For Each DataRow In ds2.Tables("projects").Rows

        ' Error occurs on the line below
        ListBox1.Items.Add(DataRow("project_name"))
    Next
    con.Close()

Catch myerror As MySqlException
    MessageBox.Show("Error Retrieving Projects List: " & myerror.Message)
End Try
  • Второй:

Ошибка 2: опция «Строгое вкл.» Запрещает неявные преобразования из «объекта» в «строку».

Код, о котором идет речь:

Private Sub ListBox1_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedValueChanged

    Try
        If ListBox1.SelectedItem IsNot Nothing Then

            ' Error occurs on the line below
            Form1.Label1.Text = ListBox1.SelectedItem
        End If

        Form1.Show()
    Catch myerror As MySqlException
        MessageBox.Show("Error Setting Up Project Page: " & myerror.Message)
    End Try
End Sub

Это сработало ... поэтому я благодарю всех вас за ваше время и терпение.

Ответы [ 4 ]

4 голосов
/ 05 сентября 2011

Вы должны всегда (99,999999% времени) писать код VB.NET с Option Strict On, если только вы не пишете код взаимодействия или не взаимодействуете с поставщиком эзотерических баз данных.

Простопоместите слова «Option Strict On» вверху вашего файла.

Это позволит вам отлавливать ошибки, подобные той, с которой вы имеете дело.

Без Option Strict On вам разрешенонапишите код, как вы написали:

Form1.Label1.Text = ListBox1.SelectedItem

Проблема с этим кодом заключается в том, что implicity пытается преобразовать объект (ListBox1.SelectedItem) в строку (Form1.Label1.Text).

Включите опцию строго, и компилятор выдаст вам сообщение об ошибке.

Затем вы будете вынуждены переписать ваш код следующим образом:

If ListBox1.SelectItem IsNot Nothing then
    Form1.Label1.Text = ListBox1.SelectedItem
End If
1 голос
/ 05 сентября 2011

Убедитесь, что ListBox1.SelectedItem не является Ничто в обоих этих обстоятельствах.

1 голос
/ 05 сентября 2011

Сфокусируйтесь на этой строке на данный момент:

Form1.Label1.Text = ListBox1.SelectedItem

Если в этой строке вы получаете исключение NullReferenceException, то должно выполняться одно из следующих условий:

  • Форма 1 является нулевой
  • Form1.Label1 является нулевым
  • ListBox1 равен нулю

Вы можете попытаться определить это, добавив строки, подобные этим непосредственно перед строкой выше:

Console.Writeline("Form1: " & (Form1 Is Nothing))
Console.Writeline("Form1.Label1: " & (Form1.Label1 Is Nothing))
Console.Writeline("ListBox1:" & (ListBox1 Is Nothing))

Вы должны увидеть строку, которая выводит true; это первая подсказка. Но тогда следующий вопрос, почему это нуль? Из того, что вы пока показали, я не могу сказать.

0 голосов
/ 05 сентября 2011

Ваши исходные ошибки могут быть исправлены без использования Option Explicit On.Вы должны убедиться, что Listbox.SelectedItem имеет значение перед его использованием.Код должен быть написан как:

If frmMain.ListBox1.SelectedItem IsNot Nothing Then
    Dim sqlpage As MySqlCommand = New MySqlCommand("SELECT * FROM [" & frmMain.ListBox1.SelectedItem.value & "]", con)
End If 

и

Try
    If ListBox1.SelectedItem IsNot Nothing Then
        Form1.Label1.Text = ListBox1.SelectedItem
    End If

    Form1.Show()
Catch myerror As MySqlException
    MessageBox.Show("Error Setting Up Project Page: " & myerror.Message)
End Try

Обновление № 2 Вторую ошибку следует исправить, изменив код на:

If ListBox1.SelectedItem IsNot Nothing Then
    Form1.Label1.Text = ListBox1.SelectedItem.ToString
End If

Опция Явное включение означает, что вам необходимо явно преобразовать типы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...