Как получить идентификатор, сгенерированный таблицей при вставке данных в таблицу?

#c# #asp.net #wcf

#c# #asp.net #wcf

Вопрос:

Это функция, которую я написал на уровне DataAccess, я также использую концепции WCF .. здесь я должен вставить некоторые значения в RequisitionTable, и я должен передать этот идентификатор, возвращенный из этой таблицы, в другую таблицу..

В таблице базы данных я указал столбец RequisitionID в качестве основного ключа и автоматически увеличил на 1. в StoredProcedure я объявил RequisitionID как @RequisitionID int OUT

 public RequisitionDTO createRequisition(RequisitionDTO requisitionDTO)
{

Logging.logDebug("RequisitionDA: createRequisition initiated");
DataTable requisitionDataTable = new DataTable();
try
{
  Database dataBase = CommonDB.getApplicationDatabase();
  //Insert and Store Id into variable 'i'  
  int i= dataBase.ExecuteNonQuery("SP_requisitionInsert",
     requisitionDTO.FirstName, requisitionDTO.MiddleName,    
     requisitionDTO.LastName,requisitionDTO.Address);
  int RequisitionID = Convert.ToInt16(i);

}
catch(exception e)
{
  //
}
  

Комментарии:

1. int i= База данных,ExecuteNonQuery(…); int RequisitionID = Преобразовать. ToInt16 (i); как вы думаете, что должен делать этот код? 😮

2. Какой уровень доступа к данным вы используете? Весьма вероятно, что возвращаемое значение ExecuteNonQuery является либо количеством затронутых строк, либо возвращаемым значением хранимой процедуры, ни одно из которых не является значением @RequisitionID параметра по завершении хранимой процедуры.

3. Я использую SQL server 2005 .. и в конце хранимой процедуры я также использовал «set @RequisitionID=@@Identity».. Почему StoredProcedure не перенастраивает RequisitionID..

4. тогда сохраненная часть процесса примерно правильная (но, как писали другие, вы должны предпочесть использовать SCOPE_IDENTITY() вместо @@IDENTITY — вы можете поискать в Google причины, почему.

Ответ №1:

Я предполагаю, что это блок приложения для доступа к данным корпоративной библиотеки.

Я не могу найти Database.ExecuteNonQuery документацию онлайн, но из моей автономной справки:

Выполняет storedProcedureName с использованием заданных значений параметра и возвращает количество затронутых строк

(Курсив в оригинале, жирный добавлен мной)

Я думаю, вам нужно использовать одну из других перегрузок, где вы явно предоставляете объект command, к которому вы прикрепили явные объекты параметров, включая параметр, @RequisitionID установленный для вывода.

Это предполагает, что ваш SP правильно присваивает SCOPE_IDENTITY() этому параметру перед возвратом, как предлагали другие.


Я также нашел статью под названием Выполнение команды и доступ к выходным параметрам, которая была написана как часть онлайн-библиотеки docs for Enterprise, но вы заметите, что в отличие от других частей MSDN, в ней нет ссылок на документацию по отдельным методам, а также нет «справочной» части Enterprise Library — похоже, они не хотят, чтобы люди находили их документацию.

Ответ №2:

Если database Engine является SQL SERVER, то SCOPE_IDENTITY возвращает последнее идентификационное значение, вставленное в таблицу:

Ответ №3:

Если вы используете sql server 2005 или 2008, используйте SCOPE_IDENTITY() в своей хранимой процедуре