#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() в своей хранимой процедуре