19

This is my (rough) code (DAL):

int i;
// Some other declarations

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

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

The problem is: Even though there is a record present on my SELECT query, the value in i remains -1.

What could be the problem?

JAD
  • 2,035
  • 4
  • 21
  • 35
painotpi
  • 6,894
  • 1
  • 37
  • 70

9 Answers9

49

What kind of query do you perform? Using ExecuteNonQuery is intended for UPDATE, INSERT and DELETE queries. As per the documentation:

For UPDATE, INSERT, and DELETE statements, the return value is the number of rows affected by the command. When a trigger exists on a table being inserted or updated, the return value includes the number of rows affected by both the insert or update operation and the number of rows affected by the trigger or triggers. For all other types of statements, the return value is -1.

Fredrik Mörk
  • 155,851
  • 29
  • 291
  • 343
  • 2
    What is the return value, if we run a StoredProcedure which will Insert or Update or Delete a Record in a Table, – Raghuveer May 31 '12 at 10:29
17

Whenever you want to execute an SQL statement that shouldn't return a value or a record set, the ExecuteNonQuery should be used.

So if you want to run an update, delete, or insert statement, you should use the ExecuteNonQuery. ExecuteNonQuery returns the number of rows affected by the statement. This sounds very nice, but whenever you use the SQL Server 2005 IDE or Visual Studio to create a stored procedure it adds a small line that ruins everything.

That line is: SET NOCOUNT ON; This line turns on the NOCOUNT feature of SQL Server, which "Stops the message indicating the number of rows affected by a Transact-SQL statement from being returned as part of the results" and therefore it makes the stored procedure always to return -1 when called from the application (in my case a web application).

In conclusion, remove that line from your stored procedure, and you will now get a value indicating the number of rows affected by the statement.

Happy programming!

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

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
8

You use EXECUTENONQUERY() for INSERT,UPDATE and DELETE.

But for SELECT you must use EXECUTEREADER().........

sealz
  • 5,348
  • 5
  • 40
  • 70
SHRUTI PATEL
  • 125
  • 4
7

Because the SET NOCOUNT option is set to on. Remove the line "SET NOCOUNT ON;" in your query or stored procedure.

See more at SqlCommand.ExecuteNonQuery() returns -1 when doing Insert / Update / Delete.

Alex Nguyen
  • 1,032
  • 12
  • 27
1

Could you post the exact query? The ExecuteNonQuery method returns the @@ROWCOUNT Sql Server variable what ever it is after the last query has executed is what the ExecuteNonQuery method returns.

John Leidegren
  • 59,920
  • 20
  • 131
  • 152
1

If what you want is to get just a single integer from the query, use:

myCmdObject.ExecuteScalar()
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
IordanTanev
  • 6,130
  • 5
  • 40
  • 49
  • 1
    ExecuteScalar will return only on value that is first column value of the first row in the executed query. – Pranay Rana Mar 18 '11 at 07:25
  • That is true but as i said when selecting single integer it is supposed to be in the first column of the first row :) – IordanTanev Mar 18 '11 at 07:27
1

The ExecuteNonQuery method is used for SQL statements that are not queries, such as INSERT, UPDATE, ... You want to use ExecuteScalar or ExecuteReader if you expect your statement to return results (i.e. a query).

madd0
  • 9,053
  • 3
  • 35
  • 62
1

From MSDN: SqlCommand.ExecuteNonQuery Method

You can use the ExecuteNonQuery to perform catalog operations (for example, querying the structure of a database or creating database objects such as tables), or to change the data in a database without using a DataSet by executing UPDATE, INSERT, or DELETE statements.

Although the ExecuteNonQuery returns no rows, any output parameters or return values mapped to parameters are populated with data.

For UPDATE, INSERT, and DELETE statements, the return value is the number of rows affected by the command. When a trigger exists on a table being inserted or updated, the return value includes the number of rows affected by both the insert or update operation and the number of rows affected by the trigger or triggers. For all other types of statements, the return value is -1. If a rollback occurs, the return value is also -1.

You are using SELECT query, thus you get -1

AminM
  • 1,658
  • 4
  • 32
  • 48
Andrew Savinykh
  • 25,351
  • 17
  • 103
  • 158
0

if you want to run an update, delete, or insert statement, you should use the ExecuteNonQuery. ExecuteNonQuery returns the number of rows affected by the statement.

How to Set Count On

Gubi
  • 415
  • 2
  • 10
  • 20