Ошибка конвертации в vb.net? - PullRequest
0 голосов
/ 14 июля 2010

Я озадачен, почему он не извлекает данные и продолжает говорить, что у меня есть ошибка «InvalidCastException», в настоящее время я делаю это в компактной среде и совершенно новичок в этом, я искал способ поиска данных в базу списка на то, что я мало знаю о Java. это мое создание таблицы и вставка во время formload

 Dim createTable3 As SqlCeCommand = connection.CreateCommand
        createTable3.CommandText = "CREATE TABLE product(product_id int IDENTITY(0,1) PRIMARY KEY,product_name nvarchar(50),bought_price float,sales_price float)"
        connection.Open()
        createTable3.ExecuteNonQuery()
 Dim insertCmd2 As SqlCeCommand = connection.CreateCommand
        insertCmd2.CommandText = "INSERT INTO product(product_name,bought_price)Values('Food',1.00)"
        insertCmd2.ExecuteNonQuery()

        Dim insertCmd3 As SqlCeCommand = connection.CreateCommand
        insertCmd3.CommandText = "INSERT INTO product(product_name,bought_price)Values('Orange',1.50)"
        insertCmd3.ExecuteNonQuery()

        Dim insertCmd4 As SqlCeCommand = connection.CreateCommand
        insertCmd4.CommandText = "INSERT INTO product(product_name,bought_price)Values('Apple',3.00)"
        insertCmd4.ExecuteNonQuery()

        Dim insertCmd5 As SqlCeCommand = connection.CreateCommand
        insertCmd5.CommandText = "INSERT INTO product(product_name,bought_price)Values('Fruit',2.00)"
        insertCmd5.ExecuteNonQuery()
        connection.Close()

это код для кнопки получения информации

 Dim itmListItem As ListViewItem
        Dim shtFieldCntr As Short

        Dim loopCmd As SqlCeCommand = connection.CreateCommand
        loopCmd.CommandText = "SELECT * FROM product"
        connection.Open()
        Dim dr As SqlCeDataReader = loopCmd.ExecuteReader

        Do While dr.Read
            itmListItem = New ListViewItem()

            If dr.IsDBNull(dr(0)) Then
                itmListItem.Text = ""
            Else
                itmListItem.Text = dr(0)
            End If

            For shtFieldCntr = 1 To dr.FieldCount()
                If dr.IsDBNull(shtFieldCntr) Then
                    itmListItem.SubItems.Add("")
                Else
                    itmListItem.SubItems.Add(dr.GetString(shtFieldCntr)) ' error this line
                End If
            Next shtFieldCntr

            lvProduct.Items.Add(itmListItem)
        Loop
        connection.Close()

фотография alt text

1 Ответ

2 голосов
/ 14 июля 2010

Если вы просматриваете документацию для SqlCeDataReader.GetString, в разделе «Примечания» упоминается, что:

Преобразования не выполняются;следовательно, полученные данные уже должны быть строкой.

Именно поэтому вы получаете InvalidCastException.Ни одно из ваших полей, кроме product_name, не является строками.Что вам нужно сделать, это что-то вроде:

itmListItem.SubItems.Add(Convert.ToString(dr.GetValue(shtFieldCntr)))

Когда вы знаете, что представляют собой все поля в таблице, было бы более разумно вызывать их, а затем явно добавлять их в подэлементы, например:

Dim productId As Int32 = dr.GetInt32(dr.GetOrdinal("product_id"))
Dim productName As String = dr.GetString(dr.GetOrdinal("product_name"))

itmListItems.SubItems.Add(productId)
itmListItems.SubItems.Add(productName)
...