1

私のサイトのある領域では、特定のユーザーセットへのアクセスを制御する必要があります。

これは、SQLサーバーデータベース上のテーブルに対してユーザーのIDをチェックすることによって行われます。IDが存在する場合、アクセスが許可されます。

SELECT 1 FROM admin WHERE userID = @userID

データベース内の行の存在を確認する方法がいくつかあることに気付き、どちらかを使用することの利点があるのか​​、それとも標準があるのか​​疑問に思いました。

SqlDataReader1つ目は、 :に行が存在するかどうかを確認することです。

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

2つ目は、戻り値が以下DBNullを使用しているかどうかを確認することExecuteScalar()です。

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

どちらを使うべきですか?もっと良い方法はありますか?それは本当に重要ですか?

4

3 に答える 3

4

オーバーヘッドが少ないため、2番目のオプション。
ただし、ご注意ください

ExecuteScalarは、次のオブジェクトを返します。

結果セットの最初の行の最初の列、または結果セットが空の場合はnull参照(Visual BasicではNothing)

クエリは何も返さない可能性があるため、DBNullではなくnullをチェックすることをお勧めします

if (SqlCommand.ExecuteScalar() == null)
{ 
    //redirect 
}
于 2012-11-23T10:43:50.310 に答える
2

どちらもパフォーマンスの点では同じです。

ExecuteScalarは、データセットの最初の行から最初の値のみを返します。内部では、ExecuteReader()と同じように扱われ、DataReaderが開かれ、値が選択され、その後DataReaderが破棄されます。私も常にその動作について疑問に思っていましたが、1つの利点があります。それは、フレームワーク内で行われることです。スピードの面でフレームワークと競争することはできません。

これら2つの違いは次のとおりです。

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は、複数の行/列を持つすべての結果セットに使用されます(たとえば、sometableのSELECT col1、col2)。

ソース

于 2012-11-23T10:43:29.027 に答える