Bj Molo Ответов: 1

Я попытался заселиться в treeview


Я разрабатываю приложение, которое имеет базу данных accdb, и в ней есть три таблицы. Я попытался заполнить таблицы в treeview in vb.net но это дает мне ошибку. Пожалуйста, мне нужна помощь.

Его всплывающая ошибка в этот момент говорит мне о необработанном исключении типа "система".InvalidOperationException' произошло в системе,.Data.dll

Дополнительная информация: с этой командой уже связан открытый Datareader, который будет закрыт в первую очередь

Dim querry2 As String = "select ID,Heading,Level from tblgrouplevel"
       cmd2 = New OleDbCommand(querry2, con)
       dat2 = cmd.ExecuteReader
       While dat2.Read()
           list2(dat2.Item(1).ToString).Add(dat2.Item(2).ToString)
       End While


Что я уже пробовал:

Imports System.Data.OleDb
Public Class Form1
    Private con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" & _
                               "Data Source=Makebills.accdb;")
    Dim list1 As New List(Of String)
    Dim list2 As New Dictionary(Of String, List(Of String))
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        con.Open()
        Dim cmd As New OleDbCommand
        Dim cmd2 As New OleDbCommand
        Dim dat As OleDbDataReader
        Dim dat2 As OleDbDataReader

        Dim querry As String = "select ID,Levels from tbltoplevels"
        cmd = New OleDbCommand(querry, con)
        dat = cmd.ExecuteReader
        While dat.Read()
            list1.Add(dat.Item(1).ToString)
            list2.Add(dat.Item(1).ToString, New List(Of String))
        End While


        Dim querry2 As String = "select ID,Heading,Level from tblgrouplevel"
        cmd2 = New OleDbCommand(querry2, con)
        dat2 = cmd.ExecuteReader
        While dat2.Read()
            list2(dat2.Item(1).ToString).Add(dat2.Item(2).ToString)
        End While

        con.Close()

        For Each item In list1
            Dim GrandfatherNOde As TreeNode = TreeView1.Nodes.Add(item)
            For Each Str As String In list2(item)
                Dim fatherNode As TreeNode = GrandfatherNOde.Nodes.Add(Str)
            Next
        Next

    End Sub
End Class

Richard Deeming

Если вы хотите, чтобы мы помогли вам исправить ошибку, вы должны сказать нам, что это за ошибка и где она происходит.

Нажмите на зеленую ссылку "улучшить вопрос" и добавьте полную информацию об ошибке в свой вопрос. Не забудьте сообщить нам, из какой строки кода выбрасывается ошибка.

Bj Molo

Спасибо за быстрый ответ на мой вопрос, который я действительно ценю, он все еще дает мне ошибку
Тусклые настройки как ConnectionStringSettings = ConfigurationManager.ConnectionString("connectionString")
Возврат нового OleDbConnection(настройки.Параметр connectionString)

Спасибо

Bj Molo

Спасибо, что я смог это решить...

1 Ответов

Рейтинг:
12

Richard Deeming

Вы повторно используете одно и то же соединение в нескольких запросах. Не делай этого. Вместо этого создайте соединение, когда это необходимо, и избавьтесь от него, как только вы закончите с ним. Оберните все одноразовые предметы в Using блок, чтобы убедиться, что они всегда утилизируются должным образом.

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

Imports System.Configuration
Imports System.Data.OleDb

Public Class Form1
    Private Shared Function CreateConnection() As OleDbConnection
        Dim settings As ConnectionStringSettings = ConfigurationManager.ConnectionString("connectionString")
        Return New OleDbConnection(settings.ConnectionString)
    End Function
    
    Private Shared Sub LoadTopLevels(ByVal list1 As List(Of String), ByVal list2 As Dictionary(Of String, List(Of String)))
        Using con As OleDbConnection = CreateConnection()
            Using cmd As New OleDbCommand("select ID,Levels from tbltoplevels", con)
                con.Open()
                Using reader As OleDbDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
                    While reader.Read()
                        Dim key As String = reader.Item(1).ToString()
                        list1.Add(key)
                        list2.Add(key, New List(Of String))
                    End While
                End Using
            End Using
        End Using
    End Sub
    
    Private Shared Sub LoadGroupLevels(ByVal list2 As Dictionary(Of String, List(Of String)))
        Using con As OleDbConnection = CreateConnection()
            Using cmd As New OleDbCommand("select ID,Heading,Level from tblgrouplevel", con)
                con.Open()
                Using reader As OleDbDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
                    While reader.Read()
                        Dim key As String = reader.Item(1).ToString()
                        list2(key).Add(reader.Item(2).ToString())
                    End While
                End Using
            End Using
        End Using
    End Sub
    
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim list1 As New List(Of String)
        Dim list2 As New Dictionary(Of String, List(Of String))
        LoadTopLevels(list1, list2)
        LoadGroupLevels(list2)
        
        For Each item In list1
            Dim GrandfatherNOde As TreeNode = TreeView1.Nodes.Add(item)
            For Each Str As String In list2(item)
                Dim fatherNode As TreeNode = GrandfatherNOde.Nodes.Add(Str)
            Next
        Next
    End Sub
End Class