问题描述
||
我是.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)\'方法并将结果转换为接收类型。