2011-03-18 7 views
12

これは私の(ラフ)コード(DAL):のExecuteNonQuery()

int i; 
// Some other declarations 

SqlCommand myCmdObject = new SqlCommand("some query"); 

conn.open(); 
i = myCmdObject.ExecuteNonQuery(); 
conn.close(); 

問題がある:私のSELECTクエリに存在するレコードが存在するにもかかわらず、iの値は-1のまま。

何が問題なのですか?

答えて

39

どのような種類を行うのですか? ExecuteNonQueryを使用すると、UPDATEINSERTおよびDELETEクエリが対象となります。 the documentation通り:

UPDATE、INSERTについて

、及び DELETEステートメント、戻り値は コマンドによって影響を受けた行の 数です。トリガーが挿入または更新される テーブルに存在する場合、 戻り値が挿入または 更新動作及びトリガ又はトリガ によって影響を受けた行の数の両方によって影響を受ける 行の数を含みます。他のすべてのタイプの ステートメントの場合、戻り値は-1です。

+1

StoredProcedureを実行すると、戻り値は何ですか?表、 – Raghuveer

1

正確なクエリを投稿できますか? ExecuteNonQueryメソッドは、ExecuteNonQueryメソッドが返す最後のクエリが実行された後に、@@ROWCOUNT Sql Server変数を返します。

1

何がしたいことは、クエリから使用するだけで、単一の整数を取得する場合:あなたは、クエリの

myCmdObject.ExecuteScalar() 
+0

ExecuteScalarは、実行されたクエリの最初の行の最初の列の値である値のみを返します。 –

+0

それは当てはまりますが、私が言ったように、単一の整数を選択すると、最初の行の最初の列にあるはずです:) – IordanTanev

1

ExecuteNonQuery方法がないクエリがあるSQL文などINSERTUPDATEのために使用され、...あなたはあなたの文が結果を返すことが予想される場合ExecuteScalarまたはExecuteReaderを使用したい(つまり、クエリ) 。 MSDNから

0

SqlCommand.ExecuteNonQuery Method

あなたは( 例えば、 データベースの構造を照会またはデータベースを作成するテーブルなど オブジェクト)カタログ操作を実行 には、ExecuteNonQueryを使用することができ、または変更しますUPDATE、INSERT、またはDELETE ステートメントを実行して、データセット を使用せずにデータベース内のデータ を削除します。

は、ExecuteNonQueryは どの行、任意の出力パラメータまたはパラメータにマッピング 戻り値を返していないが データが取り込まれます。

ステートメントの場合、戻り値は、 コマンドの影響を受けた行数 です。トリガーが挿入または更新される テーブルに存在する場合、 戻り値が挿入または 更新動作及びトリガ又はトリガ によって影響を受けた行の数の両方によって影響を受ける 行の数を含みます。他のすべてのタイプの ステートメントの場合、戻り値は-1です。 ロールバックが発生した場合、戻り値は -1です。

あなたは、このようにあなたが得る-1

0

をあなたは、アップデートを実行し、削除、 またはステートメントを挿入したい場合は、あなたが は、ExecuteNonQueryを使用する必要があり、SELECTクエリを使用しています。 ExecuteNonQuery は、文の の影響を受ける行の数を返します。あなたがINSERTUPDATEDELETEためEXECUTENONQUERY()を使用

How to Set Count On

5

しかし、あなたはあなたが値またはレコードセットを返すべきではありませんSQL文を実行するたびに、のExecuteNonQueryを使用しなければならないEXECUTEREADER() .........

11

を使用する必要がありますSELECTため。

したがって、更新、削除、または挿入ステートメントを実行する場合は、ExecuteNonQueryを使用する必要があります。 ExecuteNonQueryは、文の影響を受ける行の数を返します。これは非常にいいと思いますが、SQL Server 2005 IDEまたはVisual Studioを使用してストアドプロシージャを作成するたびに、すべてのものを破壊する小さな行が追加されます。

その行は次のとおりです。SET NOCOUNT ON;この行は、「結果の一部として返されるTransact-SQLステートメントの影響を受ける行の数を示すメッセージを停止する」SQL ServerのNOCOUNT機能を有効にします。したがって、ストアドプロシージャは常に-1を返すようになりますアプリケーション(私の場合はWebアプリケーション)から呼び出されます。

結論として、ストアドプロシージャからその行を削除すると、ステートメントの影響を受ける行の数を示す値が取得されます。

ハッピープログラミング!

http://aspsoft.blogs.com/jonas/2006/10/executenonquery.html

関連する問題