2011-05-27 78 views
0

我是新来的.net,当我运行该程序时,它报告错误“无法将类型为System.Int32的对象强制转换为类型系统。字符串”System.Int32 cound不能转换为System.String的类型

进口System.Data 进口System.Data.SqlClient的 进口System.Data.Sql分部类_Default 继承System.Web.UI.Page

Protected Sub btn_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn.Click 
    Dim constr As String 
    constr = ConfigurationManager.ConnectionStrings("libConstr").ConnectionString   Dim conn As SqlConnection 
    conn = New SqlConnection(constr) 
    conn.Open() 
    Dim com As SqlCommand 
    com = New SqlCommand() 
    com.Connection = conn 
    com.CommandText = "select * from library" 
    Dim dr As SqlDataReader 
    dr = com.ExecuteReader() 

    Dim i As Integer 
    i = 0 
    Do While dr.Read() 
     If tbuser.Text = dr.GetString(i) Then //here report the error:无法将类型为System.Int32的对象强制转换为类型System.String(System.Int32 cound not be cast to the type of System.String) 
      If tbid.Text = dr.GetString(i + 1) Then 
       Response.Redirect("library.aspx") 
      End If 
      i = i + 1 
     End If 
    Loop 

End Sub 

有什么问题,你可以帮助我。 非常感谢。

回答

0

您需要在调用此方法之前检查空值。

MSDN

不会进行任何转换;因此,检索的数据必须是 已经是一个字符串。

调用IsDBNull在调用此方法之前检查空值 值。

2

看起来,数据读取器的位置i的值是一个整数,但您试图检索它,就好像它是一个字符串。尝试:dr.GetInt32(i)

不确定什么是一些胡言乱语。 :)

如果你想将其分配给一个字符串,那么这样做:Convert.ToString(dr.GetInt32(i))

+0

但我认为tbuser.Text是字符串类型。 – hon 2011-05-27 15:54:19

+0

乱码是中文电脑上的错误信息。 – CodesInChaos 2011-05-27 15:54:51

+0

@hon然后你需要先读取它作为字符串,并调用'ToString()'的结果。 – CodesInChaos 2011-05-27 15:55:23

0

好像你的数据库存储基础字段为整数,而不是字符串。因此,您需要调用dr.GetInt32(i),然后将生成的整数转换为字符串。

0

您正在使用专门用于从结果集中读取字符串值的方法。在这种情况下,您正在读取的值是一个整数,因此该方法抛出异常。如果你想正确读取值,但它存储为一个字符串,我会尝试:

If tbuser.Text = dr.GetValue(i).ToString() Then 
    If tbid.Text = dr.GetValue(i + 1).ToString() Then 
     Response.Redirect("library.aspx") 
    End If 
End If 
0

有趣的答案,肯定的,并没有一个是错误的(与CodeInChaos的第二次答复昆的例外,虽然我怀疑这只是一个错误的陈述)。但是,你能从这些答案中学到什么?

GetString(foo)方法需要一个int32类型作为它的参数(对我来说是foo,我是你),它表示所寻找列的从零开始的序数位置的序数位置。同样,其余的Get*type*(foo)方法特定于预期的数据类型,但GetValue(foo)除外。由于YetAnotherUser和Justin Niessner明确指出“没有转换被执行”,并且“...方法...用于读取字符串值...正在抛出异常...”。这是数据访问层,性能很重要。您应该知道所寻求列的数据类型。如果你不这样做,那么使用Justin建议的方法返回一个对象GetValue(foo)

您的i参数是根据需要定义的,而不是问题。

接收对象的类型。财产,tbuser.Text,也不是问题,但它会是如果您将GetString(foo)方法更改为GetInt32(foo)GetValue(foo),此时您需要*value*.ToString()(或Convert.ToString(*value*))作为列[i]的值。

了解每个列的数据存储的数据类型,或者使用性能较低的'GetValue(foo)'方法并将结果转换为接收类型。

相关问题