2012-04-18 2 views
5

У меня есть код, как показано ниже, где я пытаюсь вставить данные в таблицу и вернуть идентификатор (заданный путем автоматического увеличения) нового элемента.ExecuteScalar() возвращает значение null altough было добавлено в DB

int newEquipmentID = new int(); 

query = database.ParameterizedQueryString("INSERT INTO Equipment (EquipmentTypeID) VALUES ({0})", "equipmenttypeID"); 

newEquipmentID = (int)database.Connection.ExecuteScalar(query, DefaultTimeout, equipment.EquipmentTypeID); 

Но он терпит неудачу и возвращает null, как если бы новый элемент еще не был добавлен. Но на самом деле я вижу новый элемент, делающий простой совет в БД.

Мой вопрос: «когда» данные фактически добавляются в БД и как я могу получить идентификатор нового добавленного элемента. Спасибо!

ответ

11

Вам не нужны два запроса, чтобы создать новую запись и получить новое значение идентичности:

using (var con = new SqlConnection(ConnectionString)) { 
    int newID; 
    var cmd = "INSERT INTO foo (column_name)VALUES (@Value);SELECT CAST(scope_identity() AS int)"; 
    using (var insertCommand = new SqlCommand(cmd, con)) { 
     insertCommand.Parameters.AddWithValue("@Value", "bar"); 
     con.Open(); 
     newID = (int)insertCommand.ExecuteScalar(); 
    } 
} 

Side-Note: Я бы не использовал такой класс базы данных с it's prone to errors.

2

Чтобы вернуть идентификатор только что вставленной строки вам необходимо выбрать его, потому что ExecuteScalar() возвращает

первый столбец первой строки в наборе результатов, возвращенного запросом

и INSERT не выбирает/не возвращает ничего.

insert ... 
select ... 

См. Ответ @ Tim для получения более подробной информации.

+0

конечно ... Вот почему я использую ExecuteScalar() –

+0

ExecuteScalar() возвращает первое поле элемента (верхняя строка влево элемента столбца) –

+0

@abatischchev, так что ... Но я –

1

Ваш SQL-запрос не возвращает вновь сгенерированный идентификатор. Для того, чтобы вернуть его, используйте OUTPUT clause:

INSERT INTO Equipment (<list of fields>) 
    OUTPUT inserted.EquipmentTypeID 
VALUES (<list of values>) 

Некоторые вещи, чтобы быть осторожным:

  • <list of fields> представляет собой разделенный запятыми список столбцов, для которых вы будете предоставлять значения
  • список полей не должен включает в себя столбец идентификатора автоинкремента (которому автоматически присваивается значение)
  • <list of values> представляет собой список значений, разделенных запятой t шляпа будет вставлена ​​в указанные выше поля. Число значений должно быть равно числу полей и типов данных должны соответствовать
0

Предложение OUTPUT поможет вам получить идентификатор нового добавленного товара. Для получения дополнительной информации перейдите по ссылке ниже:

Нажмите here! подробнее

Смежные вопросы