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

nvarchar转int失败:FixedAssetMaster数据插入异常排查

解决FixedAssetMaster表插入时的类型转换错误问题

首先,咱们来定位这个错误的根源:你遇到的conversion failed when converting the nvarchar value 'p' to data type int错误,并不是来自UNIT_NO字段本身,而是来自你拼接SQL查询语句时的一个疏忽。

看你这段查询FixedAssetMaster的代码:

cmd.CommandText = "SELECT COUNT(*) FROM FixedAssetMaster WHERE ASSET_NUMBER=" & AssetTxt.Text & " AND LOC_DEPT=" & DeptCodeTxt.Text & " AND UNIT_NO='" & UnitNoTxt.Text & "';"

这里的ASSET_NUMBER和LOC_DEPT字段如果是nvarchar类型(从你用字符串输入的场景来看大概率是),你直接拼接值却没加单引号,SQL会把这些值当成数值类型来处理。如果AssetTxt.Text或DeptCodeTxt.Text里出现了非数字字符(比如你提到的'p'),SQL就会尝试把这个字符串转成int,自然就触发了类型转换错误。

另外,这种直接拼接用户输入的写法还存在严重的SQL注入风险,必须改成参数化查询——就像你保存ScanningData时做的那样,这才是安全且能避免类型问题的正确做法。

修复步骤

  1. 把查询FixedAssetMaster的代码改成参数化查询
    替换原来的查询代码为:

    cmd = New SqlCommand
    cmd.CommandText = "SELECT COUNT(*) FROM FixedAssetMaster WHERE ASSET_NUMBER = @AssetNumber AND LOC_DEPT = @LocDept AND UNIT_NO = @UnitNo;"
    cmd.Connection = Conn
    ' 添加参数,让SQL自动处理类型匹配
    cmd.Parameters.AddWithValue("@AssetNumber", AssetTxt.Text)
    cmd.Parameters.AddWithValue("@LocDept", DeptCodeTxt.Text)
    cmd.Parameters.AddWithValue("@UnitNo", UnitNoTxt.Text)
    
    rdmysql = cmd.ExecuteReader
    If rdmysql.Read = True Then
        reccount = Val(rdmysql.GetInt32(0))
    End If
    cmd.Dispose()
    rdmysql.Close()
    
  2. 检查插入FixedAssetMaster的代码完整性
    你提供的插入代码末尾被截断了,要确保插入时的@UnitNo参数直接传入UnitNoTxt.Text(因为表中UNIT_NO是nvarchar类型),不要做不必要的类型转换,保持参数和字段类型一致。

  3. 养成参数化查询的习惯
    所有涉及用户输入的SQL语句都要用参数化,不仅能避免类型转换错误,还能彻底杜绝SQL注入攻击,这是数据库操作的最佳实践。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:08:10