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

时间:2011-05-27 15:50:46

标签: asp.net vb.net

我是.net的新手,当我运行该程序时,它报告错误“无法将类型为System.Int32的对象强制转换为类型System.String”

导入System.Data 导入System.Data.SqlClient Imports System.Data.Sql Partial Class _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

出了什么问题,你能帮助我吗? 非常感谢你。

5 个答案:

答案 0 :(得分:2)

似乎数据读取器的位置i处的值是一个int,但是您尝试检索它,就像它是一个字符串一样。尝试:dr.GetInt32(i)

不确定一些乱码是什么。 :)

如果您尝试将其分配给字符串,请执行以下操作:Convert.ToString(dr.GetInt32(i))

答案 1 :(得分:0)

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

请参阅MSDN

  

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

     

调用IsDBNull检查null   调用此方法之前的值。

答案 2 :(得分:0)

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

答案 3 :(得分: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

答案 4 :(得分:0)

有趣的答案,当然,没有错(除了CodeInChaos对Kon的第二次回复,但我怀疑这只是一个错误的陈述)。但是,你能从这些答案中学到什么?

GetString(foo)方法需要int32类型作为其参数(对我来说是foo,我为你),它表示所搜索列的从零开始的序号位置的序数位置。同样,剩余的Get*type*(foo)方法特定于预期的数据类型,但GetValue(foo)除外。

正如YetAnotherUser和Justin Niessner明确指出的那样,“没有执行任何转换”,而“......方法......用于读取字符串值......正在抛出异常......”。这是数据访问层,性能非常宝贵。您应该知道所寻找的列的数据类型。如果不这样做,则使用返回对象GetValue(foo)的方法,如Justin所建议的那样。

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

接收object.property tbuser.Text的类型也不是问题,但如果您将GetString(foo)方法更改为GetInt32(foo)GetValue(foo),则会出现问题。 ,此时您需要*value*.ToString()(或Convert.ToString(*value*))来获取Column [i]中的值。

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