System.Int32复数不能转换为System.String的类型

问题描述

|| 我是.net的新手,当我运行该程序时,它报告错误“无法将类型为system.int32的对象强制转换为类型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
出什么事了,您能帮我吗? 非常感谢你。     

解决方法

        似乎数据读取器的位置i处的值是一个int,但是您正试图像字符串一样检索它。尝试:
dr.GetInt32(i)
不知道什么是胡言乱语。 :) 如果您尝试将其分配给字符串,请执行以下操作:
Convert.ToString(dr.GetInt32(i))
    ,        看来您的数据库将基础字段存储为整数,而不是字符串。因此,您需要调用dr.GetInt32(i),然后将该结果整数转换为字符串。     ,        您正在使用一种专门用于从结果集中读取字符串值的方法。在这种情况下,您正在读取的值是一个整数,因此该方法将引发异常。如果您想正确读取值但将其存储为字符串,则可以尝试:
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
    ,        您需要在调用此方法之前检查null。 参见MSDN:   不执行任何转换;   因此,检索到的数据必须   已经是一个字符串。      调用IsDBNull以检查是否为空   调用此方法之前的值。     ,        当然,有趣的答案也没有错(除了CodeInChaos对Kon的第二次答复,尽管我怀疑那只是一个错误陈述)。但是,您可以从这些答案中学到什么?
GetString(foo)
方法期望将int32类型作为其参数(对于我来说是foo,对于您来说是i),它表示所搜索列的从零开始的序数位置的序数位置。同样,其余的“ 5”方法专用于预期的数据类型,“ 6”除外。 正如YetAnotherUser和Justin Niessner明确指出的那样,\“不执行任何转换\”,并且\“ ...用于读取字符串值的方法...引发异常... \”。这是数据访问层,性能非常重要。您应该知道所查询列的数据类型。如果不这样做,则使用贾斯汀建议的返回对象an6的方法。 您的“ 8”参数是根据需要定义的,不是问题。 接收对象的类型。属性
tbuser.Text
也不是问题,但是如果将
GetString(foo)
方法更改为
GetInt32(foo)
GetValue(foo)
,这时将需要
*value*.ToString()
(或
Convert.ToString(*value*)
)作为Column [i]中的值。 了解每一列的数据存储的数据类型,或使用性能较低的'GetValue(foo)\'方法并将结果转换为接收类型。