1

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

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

SELECT 1 FROM admin WHERE userID = @userID

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

首先是通过检查以下行是否存在SqlDataReader

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

第二个是检查返回值是否正在DBNull使用ExecuteScalar()

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

我应该使用哪个?有没有更好的办法?真的有关系吗?

4

3 回答 3

4

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

ExecuteScalar返回一个对象

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

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

if (SqlCommand.ExecuteScalar() == null)
{ 
    //redirect 
}
于 2012-11-23T10:43:50.310 回答
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

于 2012-11-23T11:06:28.433 回答
0

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

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

资源

于 2012-11-23T10:43:29.027 回答