You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 15:20:25