我是.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
出了什么问题,你能帮助我吗? 非常感谢你。
答案 0 :(得分:2)
似乎数据读取器的位置i处的值是一个int,但是您尝试检索它,就像它是一个字符串一样。尝试:dr.GetInt32(i)
不确定一些乱码是什么。 :)
如果您尝试将其分配给字符串,请执行以下操作:Convert.ToString(dr.GetInt32(i))
答案 1 :(得分:0)
答案 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)'方法并将结果转换为接收类型。