ExecuteNonQuery не возвращает результаты - PullRequest
17 голосов
/ 18 марта 2011

Это мой (грубый) код (DAL):

int i;
// Some other declarations

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

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

Проблема в том, что: хотя в моем запросе SELECT присутствует запись, значение в i остается -1.

В чем может быть проблема?

Ответы [ 9 ]

46 голосов
/ 18 марта 2011

Какой запрос вы выполняете? Использование ExecuteNonQuery предназначено для запросов UPDATE, INSERT и DELETE. Согласно документации :

Для ОБНОВЛЕНИЯ, ВСТАВКИ и УДАЛЕНИЯ заявления, возвращаемое значение количество строк, затронутых команда. Когда триггер существует на таблица вставляется или обновляется, возвращаемое значение включает в себя количество строки, затронутые как вставкой, так и операция обновления и количество строки, на которые воздействует триггер или триггеры. Для всех других типов заявления, возвращаемое значение -1. ​​

14 голосов
/ 08 апреля 2011

Всякий раз, когда вы хотите выполнить оператор SQL, который не должен возвращать значение или набор записей, следует использовать ExecuteNonQuery.

Поэтому, если вы хотите запустить оператор обновления, удаления или вставки,Вы должны использовать ExecuteNonQuery.ExecuteNonQuery возвращает количество строк, затронутых оператором.Это звучит очень хорошо, но всякий раз, когда вы используете IDE SQL Server 2005 или Visual Studio для создания хранимой процедуры, она добавляет небольшую строку, которая разрушает все.

Эта строка: SET NOCOUNT ON;Эта строка включает функцию NOCOUNT в SQL Server, которая «останавливает сообщение, указывающее количество строк, на которые воздействует инструкция Transact-SQL, как часть результатов» и поэтому хранимая процедура всегда возвращает -1, когдавызывается из приложения (в моем случае это веб-приложение).

В заключение удалите эту строку из хранимой процедуры, и теперь вы получите значение, указывающее число строк, затронутых оператором.

Счастливого программирования!

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

7 голосов
/ 18 марта 2011

Вы используете EXECUTENONQUERY() для INSERT, UPDATE и DELETE.

Но для SELECT вы должны использовать EXECUTEREADER() .........

6 голосов
/ 30 августа 2012

Поскольку опция SET NOCOUNT включена.Убрать строку «УСТАНОВИТЬ НОКУНТ ВКЛ .;»в вашем запросе или хранимой процедуре.

Подробнее на SqlCommand.ExecuteNonQuery () возвращает -1 при выполнении Вставка / Обновление / Удаление .

1 голос
/ 18 марта 2011

Метод ExecuteNonQuery используется для операторов SQL, которые являются , а не запросами, такими как INSERT, UPDATE, ... Вы хотите использовать ExecuteScalar или ExecuteReader, если вы ожидайте, что ваш оператор вернет результаты (например, запрос).

1 голос
/ 18 марта 2011

Если вы хотите получить из запроса только одно целое число, используйте:

myCmdObject.ExecuteScalar()
1 голос
/ 18 марта 2011

Не могли бы вы опубликовать точный запрос? Метод ExecuteNonQuery возвращает переменную @@ROWCOUNT Sql Server, то, что когда-либо после последнего запроса, возвращает метод ExecuteNonQuery.

0 голосов
/ 18 марта 2011

, если вы хотите запустить обновление, удалите, или вставить заявление, вы должны использовать ExecuteNonQuery. ExecuteNonQuery возвращает количество строк, на которые влияет заявление.

Как установить счет на

0 голосов
/ 18 марта 2011

Из MSDN: SqlCommand.ExecuteNonQuery Method

Вы можете использовать ExecuteNonQuery для выполнения операций каталога (например, для запроса структуры базы данных или создания объектов базы данных, таких кактаблицы), или для изменения данных в базе данных без использования DataSet путем выполнения операторов UPDATE, INSERT или DELETE.

Хотя ExecuteNonQuery не возвращает строк, любые выходные параметры или возвращаемые значения, сопоставленные с параметрами, заполняются с помощьюdata.

Для операторов UPDATE, INSERT и DELETE возвращаемое значение - это количество строк, затронутых командой.Если для вставляемой или обновляемой таблицы существует триггер, возвращаемое значение включает количество строк, на которые влияет операция вставки или обновления, а также количество строк, на которые влияет триггер или триггеры. Для всех других типов операторов возвращаемое значение равно -1 .Если происходит откат, возвращаемое значение также равно -1.

Вы используете запрос SELECT, таким образом, вы получаете -1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...