vijay_bale Ответов: 3

Executenonquery () возвращает -1


Я вставляю некоторые значения в базу данных. Я использую visual C# и sql server.Вот когда я вставка значений я получаю -1 на выполнение запросами() и база данных не обновляется. Я проверил каждое значение с помощью отладки. но не удалось найти ошибку, в какой строке она идет.Так как же я могу это найти

Что я уже пробовал:

Я погуглил, но не смог найти подходящего решения.

pkfox

Ваш код пожалуйста :-)

A. Orozco

Ты меня опередил!

ZurdoDev

Как вы можете это выяснить? Вам придется его отладить. Вы можете использовать SQL Profiler, чтобы увидеть точный sql, который был отправлен, а затем выяснить его оттуда.

vijay_bale

Я уже отладил.Он также показывает значения. но не хранить в базе данных.

ZurdoDev

Затем вы должны выяснить, почему его нет в БД. Как я уже сказал, запустите SQL profiler и посмотрите точный sql, который выполняется.

Я не совсем понимаю, чего вы от нас хотите. Мы не можем видеть, что вы делаете, поэтому у нас нет возможности узнать, что вы сделали неправильно.

Maciej Los

Вероятно, у вас нет разрешения на изменение данных...
Проверить это: Разрешения (Компонент Database Engine) | Microsoft Docs[^]

Richard MacCutchan

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

3 Ответов

Рейтинг:
2

W∴ Balboos, GHB

Как его найти: нет метода отправки кода:

1-Создайте запрос, который, по вашему мнению, вы хотите выполнить, и посмотрите, работает ли он при запуске непосредственно в SQL (как бы вы это ни делали).

Если это успешно вставляет запись:
2-если это работает, вставьте его в свой код так, чтобы рабочий запрос know выполнялся через Executenonquery(). Если это не работает, проблема заключается во внешних частях (таких как откат или что-то еще).

Если это успешно вставляет запись:
3-Ловушка (возможно, печать на экран?) запрос, который вы генерируете с помощью своего кода, и посмотрите, что с ним не так. Возможно, использовать его в (1), выше.

Теперь вы отладили свой запрос. Определяется, если это происходит потому, что SQL никуда не годится или остальная часть вашей обработки никуда не годится.

Если последнее, Проверьте свои условные обозначения (возможно, комментируя!) и посмотрите, где что-то идет не так. Или, еще лучше, используйте отладчик.


Рейтинг:
1

Wendelius

Чтобы добавить некоторые подробности, если вы используете хранимую процедуру, то установите NOCOUNT параметр вызывает этот эффект. Однако это не объясняет, почему данные не найдены, поэтому, как указано, вы либо не добавляете никаких данных,либо они откатываются.

Также обратите внимание, что откат не обязательно выполняется на стороне сервера


Чтобы проверить различные варианты поведения хранимых процедур рассмотрим следующий сценарий

Тестовые таблицы

CREATE TABLE NoCountTable (
   col1 int
);
GO


Процедуры проведения испытания
CREATE PROCEDURE NoCountProcedure AS 
BEGIN
  SET NOCOUNT ON;
  INSERT INTO NoCountTable VALUES (1);
END;
GO

CREATE PROCEDURE CountProcedure AS 
BEGIN
  SET NOCOUNT OFF;
  INSERT INTO NoCountTable VALUES (1);
END;
GO

CREATE PROCEDURE RollbackProcedure AS 
BEGIN
  SET NOCOUNT ON;
  BEGIN TRANSACTION
     INSERT INTO NoCountTable VALUES (1);
  ROLLBACK;
END;
GO

CREATE PROCEDURE ExceptionProcedure AS 
BEGIN
  SET NOCOUNT ON;
  BEGIN TRANSACTION
     INSERT INTO NoCountTable VALUES (1/0);
  ROLLBACK;
END;
GO


Вызывающая программа
int result;

using (SqlConnection connection = new SqlConnection()) {
   connection.ConnectionString = "server=.\\<instance_name_here>;integrated security=true";
   using (SqlCommand command = new SqlCommand()) {
      command.Connection = connection;
      try {
         connection.Open();

         command.CommandText = "NoCountProcedure";
         result = command.ExecuteNonQuery();
         Debug.WriteLine(string.Format("{0} returned {1}", 
                         command.CommandText,  result));

         command.CommandText = "CountProcedure";
         result = command.ExecuteNonQuery();
         Debug.WriteLine(string.Format("{0} returned {1}", 
                         command.CommandText, result));

         command.CommandText = "RollbackProcedure";
         result = command.ExecuteNonQuery();
         Debug.WriteLine(string.Format("{0} returned {1}", 
                         command.CommandText, result));

         command.CommandText = "ExceptionProcedure";
         result = command.ExecuteNonQuery();
         Debug.WriteLine(string.Format("{0} returned {1}", 
                         command.CommandText, result));
      } catch (System.Exception exception) {
         Debug.WriteLine(string.Format("Exception occurred {0}: {1}", 
                         exception.Source, exception.Message));
      }
   }
}


Выход из программы таков
NoCountProcedure returned -1
CountProcedure returned 1
RollbackProcedure returned -1
Exception thrown: 'System.Data.SqlClient.SqlException' in System.Data.dll
Exception occurred .Net SqlClient Data Provider: Divide by zero error encountered.
The statement has been terminated.


Но, как указал @Pete-OHanlon, это просто объяснение различных возможностей, поскольку вы не опубликовали никакого кода.


Рейтинг:
0

Pete O'Hanlon

Вы получите значение, отличное от -1, только для оператора delete, update или insert, который фиксирует значение. Если произойдет откат, вы получите -1, Так что вполне возможно, что база данных откатывает это значение. Поскольку вы даже не предоставили самый минимум информации, я предполагаю, что это что-то вроде отката, который заставляет вас не видеть никаких данных. Я пересмотрю свое мнение, как только мы действительно увидим какой-то код.