2012-01-22 5 views
1

クエリは常に-1を返します。理由はわかりません。誰かが説明してくれますか?カウント値は常に-1のままです。Count常に-1 SQL Serverを返します。 ASP.NET C#

string query = "SELECT COUNT(*) AS Emails FROM users"; 

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    SqlCommand command = new SqlCommand(query, connection); 
    command.Parameters.AddWithValue("@email", email); 

    try 
    { 
     connection.Open(); 
     count = command.ExecuteNonQuery(); 

     if (count > 0) 
      return "Something Wrong1"; 
    } 
    catch 
    { 
     return "Something Wrong2"; 
    } 

    return count + "Every thing ok"; 
} 
+2

[MSDN](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx)から:UPDATE、INSERT、およびDELETEステートメントの場合、戻り値は次のとおりです。コマンドの影響を受ける行の数挿入または更新される表にトリガーが存在する場合、戻り値には、挿入操作または更新操作の両方によって影響を受ける行数と、トリガーの影響を受ける行数が含まれます。他のすべてのタイプのステートメントの場合、戻り値は-1です。 – SWeko

+2

あなたが戻ってきた 'count'の値ではありません。' .ExecuteNonQuery'は、SQL文によって**影響を受ける**行の数を返します。 - 行に影響を与えるものはないので、-1を返します。 。代わりに '.ExecuteScalar()'を使用して、クエリが返す1つの列値を返します。 –

答えて

4

これは、ExecuteNonQueryがクエリの結果を返さないため、SQLサーバー上で実行するだけです。戻り値は、文の影響を受ける行の数です。文が行に影響を与えない場合は-1です。 ExecuteNonQuery(名前が示すように)は、問合せ結果を戻すためのものではなく、データを変更する文(INSERT、DELETE、UPDATEなど)を実行するためのものです。ドキュメントの状態:

UPDATE、INSERTについて

、およびDELETEステートメントは、戻り値はコマンドによって影響を受けた行の 数です。 (...)他のすべてのタイプの ステートメントの場合、戻り値は-1です。ロールバックが発生すると、戻り値 の値も-1になります。

あなたは使用することができます

count = (int)command.ExecuteScalar(); 

は、あなたが探しているのカウントを取得するには。 docs for ExecuteScalarにも例があります。

+0

ありがとうございました。問題は緩和されています。迅速な返信をいただき、ありがとうございます。 –

1

私は、おそらく何を意味すると、SQL文がするためのものであることを考える:

SELECT COUNT(*) FROM users WHERE Email = @email 

それに加えて、あなたは、カウントを取得するためにExecuteScalarメソッドを使用する必要があります。

0

私はC#のエキスパートではありませんが、command.ExecuteNonQuery()は正しく表示されていません... クエリです。