Как получить идентификатор, сгенерированный таблицей при вставке данных в таблицу? - PullRequest
1 голос
/ 18 мая 2011

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

В таблице базы данных я указал столбец RequisitionID в качестве первичного ключа и с автоматическим приращением на 1. В сохраненном Procedure я объявил 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)
{
  //
}

Ответы [ 3 ]

2 голосов
/ 18 мая 2011

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

2 голосов
/ 18 мая 2011

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

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

Выполняется сохраненное имя_процедура с использованием данных parameterValues ​​ и возвращает количество затронутых строк

(курсив в оригинале, выделен мной жирным шрифтом)

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

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


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

0 голосов
/ 18 мая 2011

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

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