【问题标题】:ExecuteScalar returns null for the query "grant connect,resource to user". Why?ExecuteScalar 为查询“grant connect,resource to user”返回 null。为什么?
【发布时间】:2014-10-24 01:42:30
【问题描述】:

我处于需要检查用户是否已成功获得访问权限的情况。但 ExecuteScalar 总是返回空值给我。所以我不确定如何验证以下查询是否已成功执行?

string query= "grant connect,resource to user";
oleDbCommand cmd = new oleDbCommand(query,conn);
object grantStatus = cmd.ExecuteScalar();    
if(grantStatus!=null)
{
response.write "Granted Access Successfully";
}

虽然它为用户成功授予访问权限,但grantStatus 对象始终具有空值。我该如何验证这一点?

【问题讨论】:

  • 看看执行标量的作用:ExecuteScalar()。它将返回SELECT 语句结果的第一行。
  • OleDbCommand.ExecuteScalar Method "结果集中第一行的第一列,如果结果集为空则为空引用。"
  • 在我的情况下我可以使用什么替代方案?
  • @Selva 你可以在你的查询结束时SELECT true...或者如果你愿意的话有条件的。然后将返回的对象转换回布尔值

标签: c# asp.net c#-4.0


【解决方案1】:

ExecuteScalar 在授权的情况下没有要返回的行/列值,因为授权不是查询。是DDL(实际上是DCL)。

查看 DDL 类型命令的 ExecuteNonQuery()。当没有返回数据时。它实际上返回 -1。

使用 ExecuteScalar,您必须假设只要没有引发异常并且您的语句有效,就没有错误。

您的代码缺少的是 try/catch 以及 using 块

与其完全重复自己,不如在这里查看我的答案:https://stackoverflow.com/a/26534021/257090

【讨论】:

  • 但大多数时候 ExecuteNonQuery() 返回 0 作为值。我可以用 0 返回值验证我的代码吗?
  • 如果您有时间,请回答我的其他帖子。 stackoverflow.com/questions/26414266/…
  • 是和不是。如果它要返回一个错误,它就会抛出一个异常。在这种情况下,您不会获得返回值。所以你只能验证成功,但是使用return验证成功,你会错过错误。
  • 我的回答中的第三句话就是这样说的。呼叫返回后,您可以立即假设成功。如果它抛出一个异常,你将永远不会在调用之后进入下一行,并且在异常处理程序中,假设为 false。
  • @Selva,请试试这个:编写一些不起作用的 SQL 代码,然后执行它,看看会发生什么。例如,除以零,授予一个不存在的角色,尝试做一些你没有权限的事情。然后,当您观察发生了什么时,您将可靠地理解您的代码,而不是根据其他人告诉您的内容来假设您的代码可能会做什么。这是我们其他人在 SO 出现之前所做的事情......
猜你喜欢
  • 2020-03-01
相关资源
最近更新 更多