Linq to SQL с помощью StoredProcedure - Как вернуть значение (вставить, обновить, удалить) - PullRequest
0 голосов
/ 22 июля 2010

Как мы возвращаем значение из хранимой процедуры

вот мой sp выглядит так:

create proc dbo.spInsertGroup
@ID uniqueidentifier
@GroupName varchar(100),
@IsActive bit
AS
BEGIN



insert into tblGroup
values(@ID, @GroupName, @IsActive)

Select @@IDENTITY AS ID

END

на основе возвращаемого значения я хочу показать пользователю какую-то обратную связьСохранение прошло успешно или не удалось.

public void AddInquiry(Inquiry inq)
{
   using (var transaction = new TransactionScope())
   {
      using (MyDataContext dc = conn.GetContext())
      {
         var results =  dc.spInquiry_Insert(......).ToList();

         transaction.Complete();

         var returnValue = (int)results.ReturnValue; 
         // note that ReturnValue is of type object and must be cast. 
      }
   }
}

ошибка:

Ошибка 39 'System.Collections.Generic.List' не содержит определения для ReturnValue и нетможно найти метод расширения ReturnValue, принимающий первый аргумент типа System.Collections.Generic.List (отсутствует директива using или ссылка на сборку?)

Ответы [ 3 ]

1 голос
/ 22 июля 2010

try:

using (MyDataContext dc = conn.GetContext())
{
    var returnValue = (int)dc.spInsertGroup(.......).ReturnValue;
}

Вы получаете эту ошибку, потому что вы вызываете .ToList (), поэтому результаты var имеют тип List <>, у которого нет свойства ReturnValue.

Если вы не видите свойство ReturnValue, возможно, вам нужно обновить метод, сгенерированный LINQ

0 голосов
/ 22 июля 2010

Вы не можете вернуть ничего, кроме INT из сохраненного процесса, однако вы пытаетесь отправить GUID - это не сработает.Вам нужно переписать ваш хранимый процесс на что-то вроде:

CREATE PROCEDURE dbo.spInsertGroup
    @GroupName varchar(100),
    @IsActive bit,
    @ID uniqueidentifier OUTPUT
AS .......

Тогда достаточно просто иметь SET @ID = NEWID() в вашем хранимом процессе - это прекрасно работает.

Ваш код C #будет выглядеть примерно так:

using(YourDataContext ctx = new YourDataContext())
{
    Guid? newID = new Guid();
    bool? active = true;

    int retVal = ctx.spInsertGroup2("test", active, ref newID);
}

и newID будет содержать новый идентификатор после вызова.

0 голосов
/ 22 июля 2010

Для скалярного значения, такого как ID, я полагаю, вы просто говорите "RETURN @ID"

Для набора строк, я полагаю, вы выбираете его, как в вашем примере, и Linq2Sql импортирует его как IEnumerable<>.

Обновление:

Поскольку вы использовали SELECT, L2S создал List<T>. Поскольку значение в select было целым числом, это было List<int>, только с одним элементом. Чтобы получить это, это просто results[0].

Или вы можете изменить хранимую процедуру на return @ID и использовать:

var id =  dc.spInquiry_Insert(......);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...