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?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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.
Method 2
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
Method 3
You use EXECUTENONQUERY()
for INSERT
,UPDATE
and DELETE
.
But for SELECT
you must use EXECUTEREADER()
………
Method 4
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.
Method 5
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.
Method 6
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).
Method 7
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
Method 8
If what you want is to get just a single integer from the query, use:
myCmdObject.ExecuteScalar()
Method 9
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.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0