Vb.net 在没有返回记录的情况下执行标量陷阱错误

Vb.net 在没有返回记录的情况下执行标量陷阱错误,vb.net,ado.net,Vb.net,Ado.net,我得到以下代码: Dim lJobName As String = "" SQLCommand.CommandText = "Select JobName from Jobs where Id = @Id " SQLCommand.Parameters.Add(New SqlParameter("@Id", SqlDbType.Int)) SQLCommand.Parameters(0).Value = var_id lJobName = SQLCommand.ExecuteScalar()

我得到以下代码:

Dim lJobName As String = ""
SQLCommand.CommandText = "Select JobName from Jobs where Id = @Id "
SQLCommand.Parameters.Add(New SqlParameter("@Id", SqlDbType.Int))
SQLCommand.Parameters(0).Value = var_id
lJobName = SQLCommand.ExecuteScalar()
如果找不到记录,如何捕获?

ExecuteScalar()如果有空结果集,则返回
Nothing
,分配到字符串时应保留该结果集,因此我将尝试以下方法:

Dim lJobName as String = String.Empty
lJobName = SqlCommand.ExecuteScalar()
If lJobName Is Nothing Then
    'Do something with the error condition
Else
    'Do something with lJobName which contains a valid result.
End If
当然,如果导致SqlException,这对您没有帮助,但是它应该处理在结果集中找不到行的问题


我尽量避免将字符串与无进行比较,即使它在VB中也可以工作

Visual Basic.NET运行时不会将任何内容计算为空字符串;即“”。但是,.NET Framework不会,并且每当尝试对Nothing执行字符串操作时,它都会抛出异常

加上伪编码器的答案不会像当前显示的那样工作(oJobname从未设置为任何值)


不管手册上说什么,与“无”相比是行不通的。因此,当结果集为空时,如果lJobName为Nothing,则不会触发

与DBNull.Value相比,该值确实适用于我:

If lJobName Is DBNull.Value Then
    'Do something with the error condition
Else
    'Do something with lJobName which contains a valid result.
End If

值得注意的是,当结果集为空(即未找到任何记录)时,这不是“错误”。

我认为可以在查询语句中处理这种情况:

从TableName中选择ISNULL(FieldID,“0”)

然后在程序中验证结果:

若然 ...... 其他的 ......
endif

实际上不是DBNull.Value。ExecuteScalar return
结果集中第一行的第一列,或一个空引用(Visual Basic中没有任何内容)
感谢您纠正我无法阅读文档的错误。我更新了我的答案。是的,比IsDbNull更好使用的是Nothing。另外,lJobName=oJobName是一种隐式转换,不能使用选项strict,最好调用oJobNameString.ToString。Empty与Nothing不同,这就是为什么我没有使用
If String.IsNullOrEmpty(lJobName)然后
哇,主要的剪切和粘贴错误,我已经改变了我的帖子,以表明我的意图。我明白你的意图。尽管如此,
String
仍然可以保存
Nothing
的值。不使用它的唯一原因是,如果您想要实现一种模式,该模式对于不可为空的值类型(如
Integer
Decimal
)非常有效,您的答案就是一个例子。不过,您确实应该纠正您关于“不作为空字符串计算任何内容”的错误陈述。
If lJobName Is DBNull.Value Then
    'Do something with the error condition
Else
    'Do something with lJobName which contains a valid result.
End If