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时做的那样,这才是安全且能避免类型问题的正确做法。
修复步骤
把查询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()检查插入FixedAssetMaster的代码完整性
你提供的插入代码末尾被截断了,要确保插入时的@UnitNo参数直接传入UnitNoTxt.Text(因为表中UNIT_NO是nvarchar类型),不要做不必要的类型转换,保持参数和字段类型一致。养成参数化查询的习惯
所有涉及用户输入的SQL语句都要用参数化,不仅能避免类型转换错误,还能彻底杜绝SQL注入攻击,这是数据库操作的最佳实践。
内容的提问来源于stack exchange,提问作者hasni
相关产品推荐
相关产品推荐

