无法将参数值从List`1转换为String

时间:2017-03-17 06:06:41

标签: vb.net listbox

我收到错误消息: “无法将参数值从List`1转换为String” 我不知道如何纠正这个问题。当我尝试将cleaningList保存到数据库中的Cleaner对象时,会发生这种情况。 我是视觉基础的新手,并感谢任何反馈,以帮助使这个程序工作。

Public Class FrmMain

Dim currentRoom As String
Dim lastId As Integer
Dim cleaners As New BindingList(Of Cleaner)

'new instance of cleaner and storing it in a reference variable
Dim currentCleaner As New Cleaner()

'-------------Functions----------------
Private Function connectWithDb() As SqlConnection
    'create a connection string
    Dim connectionString As String = "Server=(LocalDB)\MSSQLLocalDB;Integrated Security=true;AttachDbFileName=C:\Users\Julia\Desktop\JklimeckFinalProject\JklimeckFinalProject\cleanerLists.mdf;"
    'create connection object and tell it how to connect using connectionString
    Dim dbConnection As New SqlConnection(connectionString)

    'open the connection
    dbConnection.Open()
    'return the connection
    Return dbConnection
End Function

'function to change the list to a string seperated by commas
Public Function changeToString() As String
    'turn the list of strings into a single string for the database
    'trim the leading white space so it won't show up when the list is
    'converted back later
    currentCleaner.CleaningList = LTrim(String.Join(",", currentCleaner.ItemList.ToArray()))

    Return currentCleaner.CleaningList

End Function

'public function to get index of items that are selected 
Public Function GetAllItems(index As Integer) As CheckState
End Function

'function to generate a cleaning list
Public Function getCleanList() As List(Of String)

    'if statement to display tasks in lbxTasks
    Dim indexChecked As Integer
    'variable to hold the tasks that are listed depending on the room 
    'selected ' for current cleaner
    Dim itemList As New List(Of String)

    'determine the room and create the list of tasks depending on the checked boxes
    If currentRoom = "Living Room" Then
        itemList.AddRange(currentCleaner.LivRoomTasks)
    ElseIf currentRoom = "Kitchen" Then
        itemList.AddRange(currentCleaner.KitchenTasks)
    ElseIf currentRoom = "Bathroom" Then
        itemList.AddRange(currentCleaner.BathroomTasks)
    ElseIf currentRoom = "Bedroom" Then
        itemList.AddRange(currentCleaner.BedroomTasks)
    ElseIf currentRoom = "Dining Room" Then
        itemList.AddRange(currentCleaner.DinRoomTasks)
    ElseIf currentRoom = "Office" Then
        itemList.AddRange(currentCleaner.OfficeTasks)
    ElseIf currentRoom = "Laundry Room" Then
        itemList.AddRange(currentCleaner.LauRoomTasks)
    ElseIf currentRoom = "General" Then
        itemList.AddRange(currentCleaner.GeneralTasks)
    End If

    For Each indexChecked In cbxRoomItems.CheckedIndices
        lbxTasks.Items.Add(itemList.Item(indexChecked).ToString)
    Next

    Return itemList

End Function

'function to seperated the string version of the list
Public Function changeToList() As List(Of String)
    'change the comma separated sting back to a list by spliting it at the commas
    lbxTasks.Items.AddRange(currentCleaner.CleaningList.Split(New Char() {","c}))
    Return currentCleaner.ItemList
End Function


Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles Me.Load
    'when the application loads, show list of cleaners and display by name
    lbxNames.DataSource = cleaners
    lbxNames.DisplayMember = "Name"

    Dim dbConnection As SqlConnection = connectWithDb()

    'string of sql
    Dim sqlString As String = "SELECT * FROM Cleaner"
    'command object pass in what to run and the object
    Dim selectCommand As New SqlCommand(sqlString, dbConnection)
    'place in a try catch block to keep exceptions from crashing application
    Try
        'variable to hold the sqlDataReader object
        Dim reader As SqlDataReader = selectCommand.ExecuteReader()

        If reader.HasRows Then
            'read is boolean
            While reader.Read
                'call the sub
                populateCleaners(reader)
            End While
        End If

        reader.Close()

        'determine the highest ID number in the database
        'and store it in a class level variable so we can access it
        'where ever it is needed
        Dim identSql As String = "SELECT IDENT_CURRENT('Cleaner') as lastID"
        Dim identCom As New SqlCommand(identSql, dbConnection)
        Dim identReader As SqlDataReader = identCom.ExecuteReader

        If identReader.HasRows Then
            identReader.Read()
            lastId = CInt(identReader.Item("lastId"))
        End If

    Catch ex As Exception

    End Try

    'close and dispose the connection to the db
    dbConnection.Close()
    dbConnection.Dispose()

End Sub

'Sub to populate the database with a new character
Private Sub populateCleaners(reader As SqlDataReader)
    Dim dbCleaner As New Cleaner()

    changeToString()

    'get info from reader and store into new object
    dbCleaner.Id = CInt(reader.Item("Id"))
    dbCleaner.Name = reader.Item("Name").ToString
    dbCleaner.CleaningList = reader.Item("CleaningList").ToString

    'add to binding list
    cleaners.Add(dbCleaner)
End Sub

'----------------Butttons------------------

'add to list button
Private Sub btnClean_Click(sender As Object, e As EventArgs) Handles btnClean.Click

    'label to show the correct list is being displayed
    lblCurrentCleaner.Text = currentCleaner.Name

    getCleanList()

End Sub

'save cleaning list 
Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
    Dim newCleaner As New Cleaner()


    'referencing object and assigning it to the Name property for the new cleaner
    newCleaner.Name = txtName.Text
    'exception if the user does not enter a name
    Try
        newCleaner.Name = txtName.Text
    Catch ex As Exception
        MessageBox.Show("a cleaner has no name")
    End Try



    For ctr = 0 To lbxTasks.Items.Count - 1
        newCleaner.ItemList.Add(lbxTasks.Items(ctr).ToString)
        'change this list to a string
        changeToString()
    Next
    newCleaner.CleaningList = changeToString()

    lbxTasks.Items.Clear()
    cleaners.Add(newCleaner)
    currentCleaner = newCleaner


    'update a cleaning list if the Id is already in the database, or create a new object
    Dim dbConnection As SqlConnection = connectWithDb()
    Dim sqlString As String
    If currentCleaner.Id > 0 Then
        sqlString = "UPDATE Cleaner SET Name = @name, CleaningList = @cleaningList WHERE Id = @id"
    Else
        sqlString = "INSERT INTO Cleaner (Name, CleaningList) VALUES(@name, @cleaningList)"
        'increment the last Id and save that id number to the new entry in the db
        lastId += 1
        currentCleaner.Id = lastId
    End If


    Dim com As New SqlCommand(sqlString, dbConnection)

    'set the values of current cleaner in the database
    com.Parameters.Add("@id", SqlDbType.Int).Value = currentCleaner.Id
    com.Parameters.Add("@name", SqlDbType.VarChar).Value = currentCleaner.Name
    com.Parameters.Add("@cleaningList", SqlDbType.NVarChar).Value = currentCleaner.ItemList


    Try
        Dim result = com.ExecuteNonQuery()
        MessageBox.Show(result.ToString)
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try

End Sub

我有一个Cleaner类来存储公共属性。 在该程序中,用户点击不同的按钮,这些按钮使用在该房间中找到的不同项目填充清单框,通过选择项目并单击btnClean,它填充列表框,其中包含与用户选择的项目相关联的任务列表。我的问题似乎集中在该列表上;它存储在一个列表(String)中,但是我创建了一个函数将该列表转换为用逗号分隔的单个字符串,这样它就可以存储在数据库中,另一个函数可以将该列表分开,以便它可以显示在选择用户名时的列表框。

我不知道我在哪里出错。

抛出异常:

'save cleaning list 
Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
    Dim newCleaner As New Cleaner()


    'referencing object and assigning it to the Name property for the new cleaner
    newCleaner.Name = txtName.Text
    'exception if the user does not enter a name
    Try
        newCleaner.Name = txtName.Text
    Catch ex As Exception
        MessageBox.Show("a cleaner has no name")
    End Try



    For ctr = 0 To lbxTasks.Items.Count - 1
        newCleaner.ItemList.Add(lbxTasks.Items(ctr).ToString)
        'change this list to a string
        changeToString()
    Next


    lbxTasks.Items.Clear()
    cleaners.Add(newCleaner)
    currentCleaner = newCleaner


    'update a cleaning list if the Id is already in the database, or create a new object
    Dim dbConnection As SqlConnection = connectWithDb()
    Dim sqlString As String
    If currentCleaner.Id > 0 Then
        sqlString = "UPDATE Cleaner SET Name = @name, CleaningList = @cleaningList WHERE Id = @id"
    Else
        sqlString = "INSERT INTO Cleaner (Name, CleaningList) VALUES(@name, @cleaningList)"
        'increment the last Id and save that id number to the new entry in the db
        lastId += 1
        currentCleaner.Id = lastId
    End If


    Dim com As New SqlCommand(sqlString, dbConnection)

    com.Parameters.Add("@name", SqlDbType.VarChar).Value = currentCleaner.Name
    com.Parameters.Add("@cleaningList", SqlDbType.NVarChar).Value = currentCleaner.ItemList

    Try
        Dim result = com.ExecuteNonQuery()
        MessageBox.Show(result.ToString)
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try

End Sub

再次感谢您的任何建议/帮助!

0 个答案:

没有答案