【问题标题】:executescalar: Object cannot be cast from DBNull to other typesexecutescalar:对象不能从 DBNull 转换为其他类型
【发布时间】:2019-09-08 19:35:23
【问题描述】:

我在运行程序期间没有获取数据/值时遇到问题,我收到以下错误:

对象不能从 DBNull 转换为其他类型。

我尝试使用 if dr.hasrow() 对其进行验证,但仍然出现错误。

drqry = "SELECT max(num) FROM tbCVinfo WHERE cvno LIKE '%" & cvstr & "%'"

cmd2.CommandText = drqry
cmd2.Connection = con

Dim result As String = ""

cv = Convert.ToInt32(cmd2.ExecuteScalar())
'''''''''in this section I'm getting the error.

cv = cv + 1
If cv >= 0 And cv <= 9 Then
  ...............
Else
    cn = "0001"
End If
cn = result

cvno = cn

【问题讨论】:

  • 这是一个调试问题。错误很清楚,单步执行,它中断的行是您的问题,特别是ExecuteScalar 调用,因为它可能不返回除DBNull 之外的任何内容。可以通过更改您的查询来解决...
  • 如果没有匹配的记录,则聚合函数如 MAX 返回 NULL,这意味着 ADO.NET 中的 DBNull.Value。显然这不是整数,因此可以将其转换为Integer。您需要修改查询以使其始终返回Integer,或者修改您的 VB 代码以使其能够处理空值。
  • 顺便说一下,如果值已经是 Integer 但只是装箱,即通过 Object 引用提供,那么 CInt 将比 Convert.ToInt32 更合适,因为没有实际的转换完成;只是投射。
  • 如果 dr.HasRows = True Then If dr.IsDBNull(0) = False Then dr.Close() cv = Convert.ToInt32(cmd2.ExecuteScalar())
  • 我已经修改过了。但在代码的 else 部分它不会返回值

标签: mysql vb.net executescalar


【解决方案1】:

解决此问题的一种简单方法是检查返回值是否为DBNull

Dim cv As Integer
Dim queryResult = cmd2.ExecuteScalar()
If IsDBNull(queryResult) Then
    ' No matching records. Do something about it.
Else
    cv = DirectCast(queryResult, Integer)
End If

【讨论】:

    猜你喜欢
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多