ExecuteScalar не возвращает первый столбец первой строки

1

У меня есть этот модуль

   strSQL = "Insert Into TblInsurancePersonel (CompId,PersonelNo,FirstName,LastName) ";
   strSQL = strSQL + " Values (@CompId,@PersonelNo,@FirstName,@LastName)";
   using (SqlConnection myConnection = new SqlConnection(AppConfiguration.ConnectionStringName))
   {
      Helpers helpers = new Helpers();
      myConnection.ConnectionString = helpers.GetConnectionString(myUser.ServerName, myConnection.ConnectionString);
      using (SqlCommand myCommand = new SqlCommand(strSQL, myConnection))
      {
          myCommand.Parameters.AddWithValue("@CompId", insurPersonel.CompId);
          myCommand.Parameters.AddWithValue("@PersonelNo", insurPersonel.PersonelNo);             
          myCommand.Parameters.AddWithValue("@FirstName", insurPersonel.FirstName);
          myCommand.Parameters.AddWithValue("@LastName", insurPersonel.LastName);
          myConnection.Open();
          int i= Convert.ToInt32(myCommand.ExecuteScalar());
                myConnection.Close();

поля в TblInsurancePersonel - это "Id, CompId, PersonelNo, FirstName, LastName", идентификатор которого является идентификатором, поэтому я хочу иметь его значение, когда я добавляю новую запись (я имею в виду, что я мог бы иметь личность новой записи), но он возвращает значение 0 все время, но запись добавляется правильно

в чем проблема?

  • 0
    кстати, вы можете использовать «дословный строковый литерал», чтобы сделать ваш запрос более понятным; нравится
Теги:
visual-studio-2010

2 ответа

4
Лучший ответ

INSERT не возвращает никаких данных; он не представляет первый столбец первой строки... для этого вам нужен SELECT.

Возможно, вы хотите:

SELECT SCOPE_IDENTITY()

после INSERT. Существует также синтаксис OUTPUT который может сделать это:

INSERT ...
OUTPUT INSERTED.Id
VALUES ...
  • 0
    +1 Для работы SCOPE_IDENTITY вам понадобится столбец идентификаторов в таблице, которую вы вставляете
  • 0
    @Damien_The_Unbeliever Я уже редактировал это в - мне пришлось искать, где это происходит в запросе (я каждый раз ошибаюсь)
Показать ещё 2 комментария
2

Используйте ExecuteNonQuery и вы получите количество затронутых строк.

int i= myCommand.ExecuteNonQuery();

Изменить:

ExecuteScalar не возвращает первый столбец первой строки

Возможно, вы хотите получить новый первичный ключ.

Вы можете использовать ExecuteScalar даже для вставок-запросов, но вы должны добавить SELECT -statement. Это полезно, например, если вы хотите выбрать вновь созданное значение идентификации.

Например:

string sql = @"Insert Into TblInsurancePersonel (CompId,PersonelNo,FirstName,LastName)
               Values (@CompId,@PersonelNo,@FirstName,@LastName);
               SELECT CAST(scope_identity() AS int)";
// ...
int newIdentity = Convert.ToInt32(myCommand.ExecuteScalar());
  • 0
    ExecuteNonQuery возвращает количество затронутых строк, а не первый столбец первой строки, что ExecuteScalar делает это
  • 0
    @nnmmss: ты хочешь получить новое значение идентичности своего ПК? Я отредактировал свой ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню