执行ExecuteScalar遇DBNull转其他类型错误,已试dr.hasrow()仍报错
解决"Object cannot be cast from DBNull to other types."错误
首先咱们得揪出问题根源:你用ExecuteScalar()获取MAX(num)的结果,但当查询没有匹配数据时,这个方法会返回DBNull,直接用Convert.ToInt32()强制转换就触发了这个错误。另外你提到用dr.hasrow()验证没用——这是因为这段代码里你根本没用到DataReader对象,全程用的是ExecuteScalar(),这个验证方法自然完全不生效。
修复方案
你需要先捕获ExecuteScalar()的原始返回值,先判断它是否为DBNull,再进行转换操作。修改后的VB代码如下:
drqry = "SELECT max(num) FROM tbCVinfo WHERE cvno LIKE '%" & cvstr & "%'" cmd2.CommandText = drqry cmd2.Connection = con ' 先获取原始结果,判断是否为DBNull Dim maxResult As Object = cmd2.ExecuteScalar() Dim cv As Integer If maxResult Is DBNull.Value Then ' 没有匹配数据时的处理,比如默认设为0 cv = 0 Else ' 有数据时转换为Int32 cv = Convert.ToInt32(maxResult) End If cv = cv + 1 If cv >= 0 And cv <= 9 Then ' 这里放你的原有逻辑代码 Else cn = "0001" End If cn = result ' 注意:你之前定义的result是空字符串,这里可能需要调整逻辑 cvno = cn
额外安全提示
你的代码存在SQL注入风险!直接把cvstr拼进SQL语句里是非常危险的操作,建议改用参数化查询来规避风险,示例如下:
drqry = "SELECT max(num) FROM tbCVinfo WHERE cvno LIKE @cvstr" cmd2.CommandText = drqry cmd2.Connection = con ' 添加参数,通配符%要加在参数值里,而不是SQL语句中 cmd2.Parameters.AddWithValue("@cvstr", "%" & cvstr & "%")
内容的提问来源于stack exchange,提问作者DIANA ROSE ARNAIZ
相关产品推荐
相关产品推荐

