VB.NET读取SQL数据时遇varchar转int转换失败错误求助
问题解决:Varchar转Int失败的SQL查询错误
核心问题原因
你的SQL语句里WHERE UserID = 10307直接写了数字10307,而UserID是varchar类型,SQL Server会尝试把所有UserID字段的值转换成int类型来和10307比较,当遇到102A这种无法转成int的值时,就会抛出转换失败的错误——这和你用GetValue还是GetString无关,错误是在执行SQL查询的时候触发的,不是读取数据阶段。
直接修复方法
把SQL语句里的10307加上单引号,当成字符串来匹配:
SELECT * FROM Users WHERE UserID = '10307'
对应VB.NET代码里的CommandText改成:
cmd.CommandText = "SELECT * FROM Users WHERE UserID = '10307'"
更推荐的优化方案:使用参数化查询
直接拼接字符串容易引发SQL注入,参数化查询更规范,能彻底避免类型匹配问题:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 用Using语句自动释放资源,无需手动Close Using con As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Database.mdf;Integrated Security=True;User Instance=True") Using cmd As New SqlCommand("SELECT UserName FROM Users WHERE UserID = @UserID", con) ' 添加参数,指定类型为Varchar,避免类型转换问题 cmd.Parameters.Add("@UserID", SqlDbType.VarChar).Value = "10307" Try con.Open() ' 因为只取单个值,用ExecuteScalar更高效 Dim userName As String = Convert.ToString(cmd.ExecuteScalar()) If Not String.IsNullOrEmpty(userName) Then MsgBox(userName) Else MsgBox("未找到该用户") End If Catch ex As SqlException MessageBox.Show(ex.Message) End Try End Using End Using End Sub
优化点说明
- 用
Using语句自动管理连接和命令的资源,无需手动调用Close,避免资源泄漏 - 只查询需要的
UserName字段,而不是SELECT *,减少不必要的数据传输 - 参数化查询彻底避免SQL注入风险,同时明确参数类型,杜绝类型转换错误
- 用
ExecuteScalar代替SqlDataReader,仅需获取单个值时代码更简洁高效
内容的提问来源于stack exchange,提问作者KevinJay
相关产品推荐
相关产品推荐

