2010-07-14 39 views
0

我很疑惑为什么它不检索数据,并一直说我有一个错误“InvalidCastException”,我目前在紧凑的框架中执行这些操作,并且对它来说是全新的,我四处搜索寻找一种获取数据的方法一个ListView基于我对java的了解。 这些都是在formloadvb.net中的转换错误?

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

回答

2

如果审查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) 
+0

谢谢,但是,你知道如何解决最大索引问题吗?因为第一列是最后一行的id号,它不应该是空的,我认为这是由于fieldcount我必须-1 – sutoL 2010-07-14 17:14:08

+0

@kyrogue - 我已经以一种有希望回答您的评论的方式添加了答案....从可维护性的角度来看,总是更好 - 如果没有别的话,可以调出公司的名称你正在访问的列,而不是循环他们:) – Rob 2010-07-14 17:21:50

+0

嗨,我没有使用你的方式,因为教给我的是使用循环,它基本上是一个该死的速成课程,并且ms库信息不是作为java的信息,它们就像是已经知道它的人的目标。但是,你可能会看看我发布的图片,为什么ID缺失值? – sutoL 2010-07-14 17:44:58