-1

SQLデータベースに接続するVB.NETアプリケーションでエラーが発生します。接続は正常ですが、何らかの理由でこのエラーを修正できません。修正しようとすると、スクリプトのある部分から別の部分に移動します(どちらも昨日は機能していました)。エラーの詳細は次のとおりです。

エラー

残念ながら、この結果がどのように生成されたかを説明するのは困難です。これは、コードの複数の部分で発生したためです。これらの部分に共通するのは、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をオンにしたために、特に2つの新しい問題が発生しました。

  • 1つ目は次のとおりです。

エラー1:Option Strict Onは、遅延バインディングを許可しません。

問題のコードは次のとおりです。

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番目は:

エラー2:Option Strict Onは、「オブジェクト」から「文字列」への暗黙的な変換を許可しません。

問題のコードは次のとおりです。

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 に答える 4

4

相互運用コードを記述している場合や、難解なデータベースプロバイダーとインターフェイスしている場合を除き、常に(99.999999%の確率で)VB.NETコードをで記述する必要があります。Option Strict On

ファイルの先頭に「OptionStrictOn」という単語を配置するだけです。

これにより、処理しているようなエラーをキャッチできます。

Option Strict Onあなたが書いたようにあなたなしでコードを書くことは許されます:

Form1.Label1.Text = ListBox1.SelectedItem

そのコードの問題は、オブジェクト(ListBox1.SelectedItem)を文字列(Form1.Label1.Text)に暗黙的に変換しようとすることです。

オプションstrictをオンにすると、コンパイラーは前もってエラーを出します。

次に、コードを次のように書き直す必要があります。

If ListBox1.SelectItem IsNot Nothing then
    Form1.Label1.Text = ListBox1.SelectedItem
End If
于 2011-09-04T22:07:38.097 に答える
1

今のところこの行に焦点を当てます。

Form1.Label1.Text = ListBox1.SelectedItem

この行でNullReferenceExceptionが発生する場合は、次のいずれかが真である必要があります。

  • Form1がnull
  • Form1.Label1がnull
  • ListBox1がnull

上記の行の直前に次のような行を追加することで、これを判断できます。

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

trueを出力する行が表示されるはずです。それが最初の手がかりです。しかし、次の質問は、なぜそれがnullなのかということです。あなたがこれまでに示したことから、私は言うことができません。

于 2011-09-04T20:34:31.950 に答える
1

ListBox1.SelectedItemこれらの状況の両方でNothingではないことを確認してください。

于 2011-09-04T20:35:07.270 に答える
0

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 2
番目のエラーは、コードを次のように変更することで修正する必要があります。

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

Option Explicit Onは、データ型を明示的に変換する必要があることを意味します。

于 2011-09-05T07:59:12.093 に答える