如何在列表框(从访问数据库)中显示所选项目到文本框?

时间:2017-03-16 14:51:32

标签: database vb.net ms-access

您好我正在尝试在此视频中类似的列表框中显示所选产品: https://www.youtube.com/watch?v=QbbZzaMZGhY

在视频中,当他点击列表框中的某个项目时,其值会在文本框中显示(价格和名称)。我查看了源代码,但他没有使用数据库。在我的情况下,我需要使用访问数据库列出我的所有产品及其ID和价格。以下是我到目前为止所要求的内容:

Private Sub listboxitems_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles listboxitems.SelectedIndexChanged
        Using lbconn As New OleDb.OleDbConnection("PROVIDER=Microsoft.ACE.Oledb.12.0; Data Source = C:\Users\USER PC\Desktop\orderDB1.accdb")
            Using lbcmd As New OleDb.OleDbCommand("SELECT productid, product, price FROM productlog WHERE productid = ? AND product = ? AND price = ?", lbconn)

            'Set your values here.  The parameters must be added in the same order that they 
            'appear in the sql SELECT command
            Dim prodidparam As New OleDbParameter("@productid", Me.txtproductid.Text)
            Dim prodparam As New OleDbParameter("@product", Me.txtproduct.Text)
            Dim priceparam As New OleDbParameter("@price", Me.txtprice.Text)

            lbcmd.Parameters.Add(prodidparam)
            lbcmd.Parameters.Add(prodparam)
            lbcmd.Parameters.Add(priceparam)

            'Open the connection
            lbconn.Open()
            txtproduct.Text = listboxitems.SelectedItem
            Using lbreader As OleDbDataReader = lbcmd.ExecuteReader()
                While lbreader.Read
                    txtproductid.Text = lbreader.GetInt32("productid").ToString()
                    txtproduct.Text = lbreader.GetString("product")
                    txtprice.Text = lbreader.GetString("price").ToString()
                End While
            End Using
        End Using
    End Using

End Sub

在线:     txtproduct.Text = listboxitems.SelectedItem

我设法在文本框中显示其名称,但它不是来自我的数据库。我不能只在项目中键入他们的价格和名称,但我需要我的数据源来自数据库。到目前为止,应用程序中没有显示任何内容。我错过了什么?谢谢。

编辑:表单加载代码,其中列表框中填充了数据库。

Private Sub shop_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    'Create a connection to the database
    provider = "PROVIDER=Microsoft.ACE.Oledb.12.0; Data Source="
    datafile = "C:\Users\USER PC\Desktop\orderDB1.accdb"
    connString = provider & datafile
    myConnection.ConnectionString = connString

    'Open the connection with error handling
    Try
        If Not myConnection.State = ConnectionState.Open Then

        End If
        myConnection.Open()
    Catch OleDbExceptionErr As OleDbException
        MessageBox.Show(OleDbExceptionErr.Message)
    Catch InvalidOperationErr As InvalidOperationException


        MessageBox.Show(InvalidOperationErr.Message)
    End Try


    'Command Object. Select from productlog. 'productlog name of table'

    Dim objcmd As New OleDbCommand("SELECT * FROM productlog", myConnection)

    'data adapter and data table.
    Dim da As New OleDbDataAdapter(objcmd)
    Dim dt As New DataTable("productlog")
    da.Fill(dt)



    'Create connection and release resources
    myConnection.Close()
    myConnection.Dispose()
    myConnection = Nothing
    objcmd.Dispose()
    objcmd = Nothing
    da.Dispose()
    da = Nothing

    'fill from access to the listbox
    For Each row As DataRow In dt.Rows
        listboxitems.Items.Add(row.Item("product"))
    Next



    'Release resources
    dt.Dispose()
    dt = Nothing
End Sub

编辑:代码更新

Private Sub listboxitems_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles listboxitems.SelectedIndexChanged
    Using lbconn As New OleDb.OleDbConnection("PROVIDER=Microsoft.ACE.Oledb.12.0; Data Source = C:\Users\USER PC\Desktop\orderDB1.accdb")
        Using lbcmd As New OleDb.OleDbCommand("SELECT productid, product, price FROM productlog WHERE product = ?", lbconn)

            'Set your values here.  The parameters must be added in the same order that they 
            'appear in the sql SELECT command
            Dim prodparam As New OleDbParameter("@product", listboxitems.SelectedItem)
            Dim prodidparam As New OleDbParameter("@productid", listboxitems.SelectedItem)
            Dim prodpriceparam As New OleDbParameter("@price", listboxitems.SelectedItem)


            lbcmd.Parameters.Add(prodparam)
            lbcmd.Parameters.Add(prodidparam)
            lbcmd.Parameters.Add(prodpriceparam)


            'Open the connection
            lbconn.Open()
            txtproduct.Text = listboxitems.SelectedItem
            Using lbreader As OleDbDataReader = lbcmd.ExecuteReader()
                While lbreader.Read
                    txtproductid.Text = listboxitems.SelectedItem.ToString()' iknow im missing alot in this line of code i just dont know what that is'
                    txtproduct.Text = listboxitems.SelectedItem.ToString()
                    txtprice.Text = listboxitems.SelectedItem.ToString()
                End While
            End Using
        End Using
    End Using

End Sub

我更改了get语句导致我有一个错误,说不能将类型整数转换为字符串。我很抱歉,如果我真的很难这个堆栈溢出就像我的第一道防线和我同时的最后一招。

1 个答案:

答案 0 :(得分:1)

您的查询错误。您希望从productid表中取回productpriceproductlog,其中搜索的记录等于您提供的产品,产品和价格作为参数。

你看到了问题吗?

如果您已经知道这些值,为什么要问数据库?我想你的任务是找到存储在当前列表项中的产品的产品和价格。如果是这样,则无需使用文本框,您的查询应为

SELECT productid, product, price FROM productlog WHERE product = ? 

参数是列表框项目提取的数据

Dim prodidparam As New OleDbParameter("@product", listboxitems.SelectedItem)

现在您的代码可以到达while循环并使用缺少的信息设置文本框。当然这是有效的,因为您的表中有不同的产品名称(意思是,没有两个具有相同产品名称的记录)

修改
看看下面的评论,你似乎很困惑如何使用GetPos,GetString,GetInt32和最终的GetDecimal。 一旦你打电话给 lbreader.Read(),就会在你的处置上有一条记录转移到你的文本框中。但是没有必要考虑。您应该调用适合基础列的数据类型的各种GetXXXX。用于VB.NET编译器应用的自动类型转换的VB.NET程序员经常忽略这个问题。这些转换并不存在于较低级别的NET中,最好避免这些转换,以免出现细微问题。

但是,要调用OleDbDatareader.GetXXXX,您需要返回记录中字段的序号位置。因此,您需要先调用OleDbDataReader.GetPos,然后使用GetPos返回的值从GetXXXXX调用中提取信息。

Using lbreader As OleDbDataReader = lbcmd.ExecuteReader()
     While lbreader.Read
           Dim pos = lbreader.GetPos("product")
           txtProduct.Text = lbreader.GetString(pos)
           pos = lbreader.GetPos("productid")
           txtProductID.Text = lbreader.GetInt32(pos).ToString()
           pos = lbreader.GetPos("Price")
           txtPrice.Text = lbreader.GetDecimal(pos).ToString()
     End While
End Using

最后一行使用GetDecimal,假设列Price是数据库中的数字小数(因为它应该是货币值),如果不是,则使用相应的GetXXXXX。另请注意,最后两个GetXXXX返回Int32和Decimal。要将这些值分配给string类型的属性(如Text),您应该使用显式转换为字符串(ToString())