【问题标题】:ExecuteReader.HasRows vs ExecuteScalar() is DBNullExecuteReader.HasRows 与 ExecuteScalar() 是 DBNull
【发布时间】:2012-11-23 10:35:22
【问题描述】:

在我网站的某个区域,我需要控制对一组特定用户的访问。

这是通过对照 SQL Server 数据库上的表检查用户 ID 来完成的。如果 ID 存在,则授予他们访问权限:

SELECT 1 FROM admin WHERE userID = @userID

我注意到有几种方法可以检查数据库中是否存在行,并且想知道使用其中任何一种是否有任何好处,或者是否有标准。

首先是通过检查SqlDataReader中是否存在行:

if (!SqlCommand.ExecuteReader().HasRows)
{ 
    //redirect 
}

第二种是使用ExecuteScalar()检查返回值是否为DBNull

if (SqlCommand.ExecuteScalar() is DBNull)
{ 
    //redirect 
}

我应该使用哪个?有没有更好的办法?真的很重要吗?

【问题讨论】:

  • 我认为后者更可取,因为您只需要truefalse。前者会创建一堆你不会利用的对象(IE DataReader),那么为什么要添加这个结构开销呢?
  • 另一个可能更具可读性:SELECT CASE WHEN EXISTS(SELECT 1 FROM admin WHERE userID=@userID) THEN 1 ELSE 0 END AS IsAdmin。然后你可以使用:bool isAdmin = reader.GetBoolean(0);.

标签: c# sql


【解决方案1】:

第二个选项,因为您的开销更少。
不过请注意

ExecuteScalar 返回的对象是

结果集中第一行的第一列,或者为空 如果结果集为空,则引用(在 Visual Basic 中为空)

您的查询可能不会返回任何内容,因此最好检查 null 而不是 DBNull

if (SqlCommand.ExecuteScalar() == null)
{ 
    //redirect 
}

【讨论】:

    【解决方案2】:

    两者在性能方面是相同的。

    ExecuteScalar 只返回数据集第一行的第一个值。在内部,它被视为 ExecuteReader(),打开 DataReader,选择值,然后销毁 DataReader。我也一直想知道这种行为,但它有一个优点:它发生在框架内......并且你无法在速度方面与框架竞争。

    这两者的区别如下:

    ExecuteReader():
    
    1.will work with Action and Non-Action Queries (Select)
    2.Returns the collection of rows selected by the Query.
    3.Return type is DataReader.
    4.Return value is compulsory and should be assigned to an another object DataReader.
    
    ExecuteScalar():
    
    1.will work with Non-Action Queries that contain aggregate functions.
    2.Return the first row and first column value of the query result.
    3.Return type is object.
    4.Return value is compulsory and should be assigned to a variable of required type.
    

    取自

    http://nareshkamuni.blogspot.in/2012/05/what-is-difference-between.html

    【讨论】:

      【解决方案3】:

      在您的情况下,它不会影响太多性能,因此您可以使用它们中的任何一个。

      • ExecuteScalar 通常在查询返回单个值时使用。如果返回更多,则结果是第一行的第一列。一个例子可能是SELECT @@IDENTITY AS 'Identity'.
      • ExecuteReader 用于具有多行/多列的任何结果集(例如,SELECT col1, col2 from sometable)。

      SOURCE

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多