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

VB程序运行报InvalidCastException 字符串转Double无效问题求助

错误根因

这个异常是VB.NET中+运算符的隐式类型转换逻辑导致的,和你有没有手动声明Double类型变量无关:

  • VB中+运算符有双重语义:两边都是字符串时执行拼接,只要任意一边是数值类型,就会优先执行算术加法,尝试把所有操作数隐式转换为Double类型做数值计算。
  • 你的代码里SQL拼接链存在多个数值类型值:ContadorListing是数值计数器、Val(txtPrecio)和Val(txtCantidad)的返回值本身就是Double类型、Login.JugadorLogeado/ItemListado如果存储的是数值型ID,也属于数值类型。
  • 当拼接执行到第一个+时,左侧是"INSERT INTO Listing (ID_Listing, precio, cantidad_item, ID_Usuario, ID_Item, Tipo_Listing) VALUES ("字符串,右侧是数值类型的ContadorListing,编译器直接触发算术加法逻辑,尝试把左侧的SQL开头字符串转成Double参与计算,自然抛出转换失败的异常。
  • 额外代码问题:你当前只创建了OleDbCommand对象,没有执行命令的逻辑,就算拼接不报错也不会真的插入数据;同时直接拼接SQL存在SQL注入风险、特殊字符转义错误问题,数据库连接没有异常保护,出错时会导致连接泄漏。
可行修复方案
  • 字符串拼接统一使用VB专用的&运算符,该运算符只会执行字符串拼接逻辑,会自动把两侧操作数转为字符串,不会触发算术加法的隐式转换。
  • 弃用SQL字符串拼接写法,改用参数化查询,从根源规避类型转换、SQL注入、单引号转义问题。
  • 使用Using块托管数据库连接、命令对象,自动释放资源,不需要手动调用Close(),出现异常也不会泄漏连接。
  • 补充命令执行逻辑,调用ExecuteNonQuery()完成插入操作。

修复后的参考代码:

Private Sub btnCrearListing_Click(sender As Object, e As EventArgs) Handles btnCrearListing.Click
    ' 用Using块自动释放连接资源
    Using conexion As New OleDbConnection("你的数据库连接字符串")
        ' SQL语句用参数占位符,不要直接拼接值
        Dim sql As String = "INSERT INTO Listing (ID_Listing, precio, cantidad_item, ID_Usuario, ID_Item, Tipo_Listing) VALUES (@ID_Listing, @precio, @cantidad_item, @ID_Usuario, @ID_Item, @Tipo_Listing)"
        Using CrearListing As New OleDbCommand(sql, conexion)
            ' 按实际字段类型给参数赋值,不需要手动做字符串转换
            CrearListing.Parameters.AddWithValue("@ID_Listing", ContadorListing)
            CrearListing.Parameters.AddWithValue("@precio", Decimal.Parse(txtPrecio.Text))
            CrearListing.Parameters.AddWithValue("@cantidad_item", Integer.Parse(txtCantidad.Text))
            CrearListing.Parameters.AddWithValue("@ID_Usuario", Login.JugadorLogeado)
            CrearListing.Parameters.AddWithValue("@ID_Item", ItemListado)
            CrearListing.Parameters.AddWithValue("@Tipo_Listing", cboTipoListing.Text)
            
            conexion.Open()
            ' 执行插入命令
            CrearListing.ExecuteNonQuery()
            ContadorListing += 1
        End Using
    End Using
End Sub

注意:如果输入框的内容可能不是合法数字,建议加Decimal.TryParse/Integer.TryParse做前置校验,避免输入非法内容抛出格式异常。

内容的提问来源于stack exchange,提问作者Manuel Villanueva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:45:43